
javaSE(七)GUI程序开发
Java 的 GUI(Graphical User Interface,图形用户界面)编程允许开发者构建可视化的桌面应用程序,比如表单录入系统、本地计算器、文件浏览器等 。Java 提供了两套主要的 GUI 开发库,分别是 AWT(Abstract Window Toolkit)和 Swing,以下是详细介绍:
1. AWT(抽象窗口工具包)
AWT 是 Java 最早期的 GUI 库,基于本地平台组件,也就是说它的组件会依赖宿主操作系统的原生 GUI 组件来实现界面,这就导致在不同操作系统上,AWT 组件的外观和行为可能有所差异。
- 常用组件 :
- Frame(框架):用于创建顶级窗口,可以添加其他组件,比如按钮、文本框等。例如:
import java.awt.Frame;
public class SimpleAWTFrame {
public static void main(String[] args) {
Frame frame = new Frame("AWT Frame");
frame.setSize(300, 200);
frame.setVisible(true);
}
}
- Panel(面板):是中间容器,可在其中添加其他组件,用于对组件进行分组和布局管理 。
- Label(标签):用于显示文本信息,如
Label label = new Label("这是一个标签");。 - TextField(文本框):允许用户输入单行文本,还能添加事件监听器来处理用户输入,如
TextField textField = new TextField(20);。 - 缺点:功能相对较少,而且在不同操作系统上兼容性较差,目前在实际开发中已逐渐被更强大的库替代,但了解 AWT 有助于理解 Java GUI 编程的基本原理。
2. Swing
Swing 是 AWT 的增强版,是一个完全用 Java 编写的 GUI 库,提供了更多丰富的组件,并且具有平台无关性,在不同操作系统上能提供一致的用户界面体验。
- 常用组件 :
- JFrame(框架):是 Swing 中顶层的容器,用于创建窗口,拥有常见的窗口操作功能,像最大化、最小化、关闭等。创建简单窗口示例:
import javax.swing.JFrame;
public class SimpleSwingFrame {
public static void main(String[] args) {
JFrame frame = new JFrame("Swing Frame");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 300);
frame.setVisible(true);
}
}
- JPanel(面板):和 AWT 中的 Panel 类似,作为容器用于容纳其他组件,常配合布局管理器使用。
- JLabel(标签):用于显示文本、图像或两者,例如
JLabel label = new JLabel("Hello, Swing!");。 - JButton(按钮):标准的按钮组件,用户点击可触发操作,如
JButton button = new JButton("Click me");。 - JTextField(文本框):用于单行文本输入 ,
JTextField textField = new JTextField(20);。 - JTextArea(文本区域):支持多行文本输入,
JTextArea textArea = new JTextArea(5, 20);。 - JCheckBox(复选框):用户可选中或取消选中来表示二进制选择,
JCheckBox checkBox = new JCheckBox("Check me!");。 - JRadioButton(单选按钮):一组单选按钮中只能选择一个。
- 事件监听机制:基于观察者模式,当用户进行操作(如点击按钮)时,会产生对应的事件对象,预先注册在组件上的监听器会捕获该事件,并调用相应的响应方法进行处理。例如,为按钮添加点击事件监听器:
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ButtonClickExample {
public static void main(String[] args) {
JFrame frame = new JFrame("Button Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JButton button = new JButton("Click me");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(null, "按钮被点击了!");
}
});
frame.add(button);
frame.pack();
frame.setVisible(true);
}
}
- 布局管理器:用于控制组件在容器中的位置和大小,常见的布局管理器有:
- FlowLayout(流布局):组件从左到右、从上到下依次排列。使用方式
frame.setLayout(new FlowLayout());。 - BorderLayout(边界布局):将容器分为东、南、西、北、中五个区域,可以将组件添加到指定区域,如
frame.add(component, BorderLayout.SOUTH);。 - GridLayout(网格布局):将容器划分为指定行数和列数的网格,组件按照顺序填充到网格中,如
frame.setLayout(new GridLayout(3, 2));,表示 3 行 2 列的网格布局。 - null(绝对布局):可以通过
setBounds()方法手动设置组件的位置和大小,不过这种方式在不同分辨率下可能会导致布局混乱,一般不推荐大规模使用。
3. 其他 GUI 相关知识
- 多线程与 Swing:Swing 采用单线程模型,所有与用户界面相关的操作都应在事件分派线程(EDT)中执行,以确保界面的一致性和线程安全。当涉及界面更新等操作时,可使用
SwingUtilities.invokeLater()方法将操作放在 EDT 中执行 。例如:
import javax.swing.*;
public class EDTExample {
public static void main(String[] args) {
JFrame frame = new JFrame("EDT Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JLabel label = new JLabel("初始文本");
frame.add(label);
frame.pack();
frame.setVisible(true);
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
label.setText("文本已更新");
}
});
}
}).start();
}
}
- 进阶建议:
- 界面跳转逻辑封装:当应用程序包含多个窗体时,将窗体之间的跳转逻辑进行封装,便于代码的维护和管理。
- CardLayout 布局使用:用于在同一区域显示不同的视图,类似于卡片的切换,适用于需要在不同界面间切换的场景。
- 引入 MVC 模式:将界面(View)、数据模型(Model)和控制逻辑(Controller)分离,使代码结构更加清晰,提高可维护性和可扩展性。
- 尝试 JavaFX:JavaFX 是 Java 较新的 GUI 库,具有样式美观、支持动画等优点,可以用来构建更现代化的界面 ,不过学习成本相对较高。