一、是什么事GUI编程
1.1、什么是 GUI 编程?
GUI,全称 Graphical User Interface,是指图形用户界面
通过图形元素(如窗口、按钮、文本框等)与用户进行交互。
与命令行界面( CLI)相比,GUI 更加直观、友好。
2、为什么学习 GUI编程?
增强用户体验
广泛应用于桌面应用程序开发
Java 提供了强大的 GUI编程支持
二、Java 的 GUI 编程包
2.1、AWT(Abstract Window Toolkit )
提供了一组原生的 GUI组件,依赖于操作系统的本地窗口系统
2.2、Swing
基于 AWT,提供了更丰富的GU组件,轻量级组件,不依赖于本地窗口系统
2.2.1、常用的 swing 组件
JFrame:窗口
JPanel:用于组织其他组件的容器
JButton:按钮组件
JTextField:输入框
JTable:表格
...
2.2.2、快速入门一下GUI Swing的编程
import javax.swing.*;
public class login{
public static void main(String[] args) {
// 1、创建一个窗口,有一个登录按钮。
JFrame jf = new JFrame("登录窗口");
JPanel panel = new JPanel(); // 创建一个面板
jf.add(panel); // 将面板添加到窗口中
jf.setSize(400, 300); // 设置窗口大小
jf.setLocationRelativeTo(null); // 设置窗口居中
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置关闭窗口的默认操作: 关闭窗口退出程序
JButton jb = new JButton("登录"); // 创建一个按钮
panel.add(jb); // 将按钮添加到面板中
jf.setVisible(true); // 显示窗口
}
}

三、常见的布局管理器
布局管理器(Layout Manager)它们可以决定组件在容器中的布局方式,避免了手动设置每个组件的位置和大小,从而简化了 GU设计过程。
3.1、FlowLayout
3.1.1、简介:
FlowLayout 是最简单的布局管理器,它按水平方向从左到右排列组件,当一行排满时,自动换到下一行。
3.1.2、特点:
默认居中对齐,可以设置为左对齐或右对齐。
适用于需要简单排列的场景。
3.1.3、示例

import javax.swing.*;
import java.awt.*;
public class FlowLayoutExample {
public static void main(String[] args) {
JFrame frame = new JFrame("FlowLayout布局管理器");
frame.setSize(400, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new FlowLayout()); // 设置布局管理器
frame.add(new JButton("Button 1"));
frame.add(new JButton("Button 2"));
frame.add(new JButton("Button 3"));
frame.add(new JButton("Button 4"));
frame.add(new JButton("Button 5"));
frame.setVisible(true);
}
}
3.2、BorderLayout
3.1.1、简介:
BorderLayout 将容器划分为五个区域:东、南、西、北和中(East, South, West, North, Center)。每个区域只能添加一个组件,未添加组件的区域保持空白。
3.1.2、特点:
适用于需要在特定区域布局组件的场景。
中间区域会占据所有剩余的空间。
3.1.3、示例

import javax.swing.*;
import java.awt.*;
public class BorderLayoutExample {
public static void main(String[] args) {
JFrame frame = new JFrame("BorderLayout Example");
frame.setSize(400, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new JButton("North"), BorderLayout.NORTH);
frame.add(new JButton("South"), BorderLayout.SOUTH);
frame.add(new JButton("East"), BorderLayout.EAST);
frame.add(new JButton("West"), BorderLayout.WEST);
frame.add(new JButton("Center"), BorderLayout.CENTER);
frame.setVisible(true);
}
}
3.3、GridLayout
3.1.1、简介:
GridLayout 将容器划分为等大小的网格,每个网格中可以添加一个组件,所有组件大小相同。
3.1.2、特点:
适用于需要均匀排列组件的场景。
行和列的数量可以指定。
3.1.3、示例

import javax.swing.*;
import java.awt.*;
public class GridLayoutExample {
public static void main(String[] args) {
JFrame frame = new JFrame("GridLayout Example");
frame.setSize(400, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new GridLayout(2, 3)); // 2行3列的网格
frame.add(new JButton("Button 1"));
frame.add(new JButton("Button 2"));
frame.add(new JButton("Button 3"));
frame.add(new JButton("Button 4"));
frame.add(new JButton("Button 5"));
frame.add(new JButton("Button 6"));
frame.setVisible(true);
}
}
3.4、BoxLayout
3.1.1、简介:
BoxLayout 能够沿着单一轴线(X轴或Y轴)排列组件。可以创建水平(X轴)或垂直(Y轴)排列的布局。
3.1.2、特点:
适用于需要沿单一方向排列组件的场景。
可以通过添加垂直或水平间隔(Glue、Strut)来调整组件间距。
3.1.3、示例

import javax.swing.*;
public class BoxLayoutExample {
public static void main(String[] args) {
JFrame frame = new JFrame("BoxLayout Example");
frame.setSize(400, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); // 垂直排列
panel.add(new JButton("Button 1"));
panel.add(Box.createVerticalStrut(10)); // 添加垂直间隔
panel.add(new JButton("Button 2"));
panel.add(Box.createVerticalStrut(10));
panel.add(new JButton("Button 3"));
panel.add(Box.createVerticalStrut(10));
panel.add(new JButton("Button 4"));
frame.add(panel);
frame.setVisible(true);
}
}
3.5、...
四、通过 AI 帮助生成想要的 GUI 界面
eg:我是一名 Java 开发人员,帮我用 Swing 开发一个登录界面,要求登录界面看起来比较好看比较美观,你可以用一些样式让界面好看些
import javax.swing.*;
import java.awt.*;
public class LoginUI {
public static void main(String[] args) {
JFrame frame = new JFrame("公司项目登录界面"); // 创建窗口
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置关闭窗口时退出程序
frame.setSize(400, 300); // 设置窗口大小
frame.setLocationRelativeTo(null); // 居中显示
// 设置背景颜色
frame.getContentPane().setBackground(new Color(245, 245, 245)); // 灰白色背景
// 创建面板
JPanel panel = new JPanel(); // 创建面板
panel.setLayout(new GridBagLayout()); // 使用网格布局
GridBagConstraints gbc = new GridBagConstraints(); // 设置网格布局的约束
gbc.insets = new Insets(10, 10, 10, 10); // 内边距
gbc.fill = GridBagConstraints.HORIZONTAL; // 填充水平方向
// 标题标签
JLabel titleLabel = new JLabel("欢迎登录"); // 标题标签
titleLabel.setFont(new Font("楷体", Font.BOLD, 24)); // 楷体加粗
titleLabel.setForeground(new Color(64, 64, 64)); // 深灰色文字
gbc.gridx = 0; // 第一列
gbc.gridy = 0; // 第一行
gbc.gridwidth = 2; // 占两列
gbc.anchor = GridBagConstraints.CENTER; // 左对齐
panel.add(titleLabel, gbc); // 添加标题标签
// 用户名输入框
gbc.gridy++; // 第二行
gbc.gridwidth = 1; // 占一列
gbc.anchor = GridBagConstraints.LINE_START; // 左对齐
panel.add(new JLabel("用户名:"), gbc); // 添加用户名标签
gbc.gridx++; // 第二列
gbc.fill = GridBagConstraints.HORIZONTAL; // 填充水平方向
JTextField usernameField = new JTextField(20); // 用户名输入框
panel.add(usernameField, gbc); // 添加用户名输入框
// 密码输入框
gbc.gridy++; // 第三行
gbc.gridx = 0; // 第一列
gbc.fill = GridBagConstraints.NONE; // 不填充
panel.add(new JLabel("密码:"), gbc); // 添加密码标签
gbc.gridx++; // 第二列
gbc.fill = GridBagConstraints.HORIZONTAL; // 填充水平方向
JPasswordField passwordField = new JPasswordField(20); // 密码输入框
panel.add(passwordField, gbc); // 添加密码输入框
// 登录按钮
gbc.gridy++; // 第四行
gbc.gridx = 0; // 第一列
gbc.gridwidth = 2; // 占两列
gbc.fill = GridBagConstraints.HORIZONTAL; // 填充水平方向
JButton loginButton = new JButton("登录"); // 登录按钮
loginButton.setBackground(new Color(0, 128, 255)); // 蓝色按钮
loginButton.setForeground(Color.WHITE); // 白色文字
loginButton.setFont(new Font("楷体", Font.BOLD, 14)); // 楷体加粗
panel.add(loginButton, gbc); // 添加登录按钮
frame.add(panel); // 将面板添加到窗口中
frame.setVisible(true); // 显示窗口
}
}

五、事件处理
GUI 编程中,事件的处理是通过事件监听器( Event Listener )来完成的。
5.1、常用的时间监听器对象
5.1.1、点击事件监听器 ActionListener
对2.2.2的示例添加点击事件监听
import javax.swing.*;
public class login{
public static void main(String[] args) {
// 1、创建一个窗口,有一个登录按钮。
JFrame jf = new JFrame("登录窗口");
JPanel panel = new JPanel(); // 创建一个面板
jf.add(panel); // 将面板添加到窗口中
jf.setSize(400, 300); // 设置窗口大小
jf.setLocationRelativeTo(null); // 设置窗口居中
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置关闭窗口的默认操作: 关闭窗口退出程序
JButton jb = new JButton("登录"); // 创建一个按钮
panel.add(jb); // 将按钮添加到面板中
// 给按钮绑定“点击事件”监听器对象
// jb.addActionListener(new ActionListener() {
// @Override
// public void actionPerformed(java.awt.event.ActionEvent e) {
// // 一旦你点击jb按钮,底层触发这个方法执行
// // e是事件对象,封装了事件相关信息。
// JOptionPane.showMessageDialog(jf, "有人点击了登录");
// System.out.println("登录成功!");
// }
// });
jb.addActionListener(e -> {
JOptionPane.showMessageDialog(jf, "有人点击了登录");
System.out.println("登录成功!");
});
jf.setVisible(true); // 显示窗口
}
}
5.1.2、按键事件监听器 KeyListener
需求:监听用户键盘上下左右四个按键的事件
import javax.swing.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
public class test01 {
public static void main(String[] args) {
JFrame jf = new JFrame("键盘监听");
jf.setSize(400, 300);
jf.setLocationRelativeTo(null);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
jf.add(panel);
jf.setVisible(true);
// jf窗口整体绑定键盘监听器
jf.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
// 获取键盘按键的编号
int keyCode = e.getKeyCode(); // 获取键盘按键的编号
// 判断按键编码
switch (keyCode) {
case KeyEvent.VK_UP:
System.out.println("用户按下了上");
break;
case KeyEvent.VK_DOWN:
System.out.println("用户按下了下");
break;
case KeyEvent.VK_LEFT:
System.out.println("用户按下了左");
break;
case KeyEvent.VK_RIGHT:
System.out.println("用户按下了右");
}
}
});
}
}
5.1.3、鼠标行为监听器 MouseListener
...
5.2、事件的几种常见写法
第 1 种:直接提供实现类,用于创建事件监听对象
import javax.swing.*;
import java.awt.event.ActionListener;
public class test01 {
public static void main(String[] args) {
JFrame jf = new JFrame("键盘监听");
jf.setSize(400, 300);
jf.setLocationRelativeTo(null);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
jf.add(panel);
JButton jb = new JButton("登录"); // 创建一个按钮
panel.add(jb); // 将按钮添加到面板中
jb.addActionListener(new MyActionListener(jf));
jf.setVisible(true);
}
private static class MyActionListener implements ActionListener {
private JFrame jf;
public MyActionListener(JFrame jf) {
this.jf = jf;
}
@Override
public void actionPerformed(java.awt.event.ActionEvent e) {
JOptionPane.showMessageDialog(jf, "有人点击了登录");
System.out.println("登录成功!");
}
}
}
第 2 种:直接使用匿名内部类的对象,代表事件监听对象
详见-->5.1.2示例
第3种:自定义窗口,让窗口对象实现事件接口(重要)
public class test03 {
public static void main(String[] args) {
// 创建登录界面
LoginFrame lf = new LoginFrame(); // 自定义窗口
lf.setVisible(true);// 显示窗口
}
}
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class LoginFrame extends JFrame implements ActionListener {
public LoginFrame() { // 创建登录界面
setTitle("登录界面");
setSize(400, 300);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
init();
}
private void init() { // 初始化界面
JButton btn = new JButton("登录");
JPanel panel = new JPanel();
panel.add(btn);
add(panel);
btn.addActionListener(this);// 给按钮添加点击监听器
}
@Override
public void actionPerformed(ActionEvent e) {// 让窗口对象实现事件接口
JOptionPane.showMessageDialog(this, "有人点击了登录");
System.out.println("登录成功!");
}
}

被折叠的 条评论
为什么被折叠?



