Java中的Swing

Java中的Swing Java Swing 是 Java 为构建图形用户界面GUI提供的标准工具包它构建在更基础的 AWT 之上提供了更丰富、更可定制且外观统一的组件集并遵循模型-视图-控制器MVC架构模式实现了数据模型、界面呈现和用户交互的逻辑分离 。相较于 AWTSwing 的组件是纯 Java 实现不依赖本地平台的 GUI因此能提供更好的跨平台兼容性和更灵活的外观Look and Feel定制能力 。1. 核心组件与创建首个窗口Swing 的核心容器是JFrame它代表一个带有边框、标题栏以及最小化、最大化、关闭按钮的顶层窗口。所有其他 Swing 组件如按钮、文本框都需要放置在一个像JFrame这样的顶层容器中。以下代码展示了如何创建一个最简单的 Swing 窗口import javax.swing.*; public class FirstSwingWindow { public static void main(String[] args) { // 在事件调度线程中创建GUI这是Swing线程安全的要求 SwingUtilities.invokeLater(() - { // 1. 创建JFrame实例设置标题 JFrame frame new JFrame(我的第一个Swing窗口); // 2. 设置窗口关闭时的默认操作退出程序 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 3. 设置窗口的初始大小宽 高 frame.setSize(400, 300); // 4. 设置窗口相对于屏幕居中显示 frame.setLocationRelativeTo(null); // 5. 使窗口可见默认是不可见的 frame.setVisible(true); }); } }2. 布局管理器与基础组件直接向JFrame添加组件会导致布局难以控制。通常我们会先将组件添加到一个中间容器JPanel上并为其设置布局管理器然后再将JPanel添加到JFrame的内容面板中 。Swing 提供了多种布局管理器如FlowLayout流式布局、BorderLayout边框布局、GridLayout网格布局等 。下面是一个使用FlowLayout和BorderLayout的登录界面示例包含了标签JLabel、文本框JTextField、密码框JPasswordField和按钮JButton等基础组件 import javax.swing.*; import java.awt.*; public class SimpleLoginUI { public static void main(String[] args) { SwingUtilities.invokeLater(() - { JFrame frame new JFrame(用户登录); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(350, 200); frame.setLocationRelativeTo(null); // 创建主面板使用BorderLayout JPanel mainPanel new JPanel(new BorderLayout(10, 10)); mainPanel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); // --- 中心区域输入表单 --- JPanel formPanel new JPanel(new GridLayout(2, 2, 10, 10)); JLabel userLabel new JLabel(用户名:); JTextField userField new JTextField(15); // 设置首选列数 JLabel pwdLabel new JLabel(密 码:); JPasswordField pwdField new JPasswordField(15); formPanel.add(userLabel); formPanel.add(userField); formPanel.add(pwdLabel); formPanel.add(pwdField); // --- 表单结束 --- // --- 底部区域按钮 --- JPanel buttonPanel new JPanel(new FlowLayout(FlowLayout.RIGHT)); JButton loginBtn new JButton(登录); JButton cancelBtn new JButton(取消); buttonPanel.add(loginBtn); buttonPanel.add(cancelBtn); // --- 按钮结束 --- // 将表单面板和按钮面板添加到主面板 mainPanel.add(formPanel, BorderLayout.CENTER); mainPanel.add(buttonPanel, BorderLayout.SOUTH); // 将主面板添加到窗口的内容面板 frame.setContentPane(mainPanel); frame.setVisible(true); }); } }3. 事件处理GUI 需要响应用户操作例如点击按钮。这需要通过为组件添加事件监听器EventListener来实现。最常见的是为按钮添加ActionListener。以下代码扩展了上面的登录界面为“登录”和“取消”按钮添加了简单的事件处理逻辑 // ... 前面的导入和JFrame创建代码与上例相同 ... // 为登录按钮添加动作监听器 loginBtn.addActionListener(e - { String username userField.getText(); // 注意getPassword()返回char[]更安全比较后应及时清空 String password new String(pwdField.getPassword()); // 简单的模拟验证 if (admin.equals(username) 123456.equals(password)) { JOptionPane.showMessageDialog(frame, 登录成功, 提示, JOptionPane.INFORMATION_MESSAGE); // 此处可跳转到主界面 // frame.dispose(); // 关闭登录窗口 // new MainWindow().setVisible(true); // 打开新窗口 } else { JOptionPane.showMessageDialog(frame, 用户名或密码错误, 错误, JOptionPane.ERROR_MESSAGE); // 清空密码框 pwdField.setText(); } }); // 为取消按钮添加动作监听器 cancelBtn.addActionListener(e - { int option JOptionPane.showConfirmDialog(frame, 确定要退出吗, 确认退出, JOptionPane.YES_NO_OPTION); if (option JOptionPane.YES_OPTION) { System.exit(0); // 退出程序 } }); // ... 后面的界面组装和显示代码与上例相同 ...4. 进阶组件与容器Swing 还提供了许多用于构建复杂界面的高级组件和容器组件/容器类名主要用途带滚动条面板JScrollPane为其他组件如JTextArea,JList,JTable提供滚动视图 。选项卡面板JTabbedPane创建带有多个标签页的界面用于组织大量内容 。工具栏JToolBar创建可拖拽的工具栏通常放置常用操作的按钮 。菜单JMenuBar,JMenu,JMenuItem创建窗口顶部的菜单栏、下拉菜单和菜单项 。表格JTable以表格形式展示和编辑数据功能强大 。树JTree以树形结构展示层级数据。5. 与数据库结合示例一个实用的 GUI 程序通常需要与后端数据交互。以下是一个简化的示例展示如何在 Swing 中连接 MySQL 数据库并查询数据显示在JTable中 。首先需要确保已将 MySQL JDBC 驱动添加到项目依赖中。import javax.swing.*; import javax.swing.table.DefaultTableModel; import java.awt.*; import java.sql.*; public class SwingWithDatabase { private static final String URL jdbc:mysql://localhost:3306/your_database; private static final String USER root; private static final String PASSWORD your_password; public static void main(String[] args) { SwingUtilities.invokeLater(() - { JFrame frame new JFrame(数据库数据展示); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(600, 400); // 创建表格模型和表格 DefaultTableModel tableModel new DefaultTableModel(); JTable dataTable new JTable(tableModel); JScrollPane scrollPane new JScrollPane(dataTable); // 创建按钮用于触发数据加载 JButton loadBtn new JButton(加载数据); loadBtn.addActionListener(e - loadDataFromDB(tableModel)); frame.add(scrollPane, BorderLayout.CENTER); frame.add(loadBtn, BorderLayout.SOUTH); frame.setLocationRelativeTo(null); frame.setVisible(true); }); } private static void loadDataFromDB(DefaultTableModel model) { // 清空旧数据 model.setRowCount(0); model.setColumnCount(0); try (Connection conn DriverManager.getConnection(URL, USER, PASSWORD); Statement stmt conn.createStatement(); ResultSet rs stmt.executeQuery(SELECT id, name, email FROM users)) { // 示例查询 // 获取列信息并设置表头 ResultSetMetaData metaData rs.getMetaData(); int columnCount metaData.getColumnCount(); for (int i 1; i columnCount; i) { model.addColumn(metaData.getColumnName(i)); } // 填充数据行 while (rs.next()) { Object[] row new Object[columnCount]; for (int i 1; i columnCount; i) { row[i - 1] rs.getObject(i); } model.addRow(row); } JOptionPane.showMessageDialog(null, 数据加载完成); } catch (SQLException ex) { JOptionPane.showMessageDialog(null, 数据库连接失败: ex.getMessage(), 错误, JOptionPane.ERROR_MESSAGE); ex.printStackTrace(); } } }总而言之Java Swing 是一个功能完备的 GUI 工具包从创建简单窗口到开发包含数据库操作、复杂布局和交互的业务应用程序都能胜任 。其核心在于理解容器与组件的层次关系、熟练运用布局管理器来控制界面元素的位置以及通过事件监听机制实现用户交互。对于现代 Java 桌面应用开发虽然 JavaFX 是更新的选择但 Swing 因其稳定性、丰富的组件和大量的遗留系统仍然在许多场景中被广泛使用。参考来源JAVA——界面设计Swing教程java swing实现简单的登录界面Java Swing 图形界面开发目录java swing 登陆界面跳转界面Swing开发简单图形用户界面与数据库的链接、数据处理示例详解Java Swing 图形界面开发简介