跳转至

图片

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 库,具有样式美观、支持动画等优点,可以用来构建更现代化的界面 ,不过学习成本相对较高。