开启你的编程学习之旅

云课堂提供高质量的编程课程,从入门到精通,助你成为技术大牛

立即开始学习

Java 编程入门

作者: 赵老师 更新: 2024-03-18 阅读: 51234 难度: 初级
学习工具

7. Java 图形用户界面

Java 提供了 Swing 和 JavaFX 两种主要的 GUI 开发工具包。

Swing 基础组件

Swing 登录界面示例
import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class LoginFrame extends JFrame { private JTextField usernameField; private JPasswordField passwordField; private JButton loginButton; private JButton cancelButton; public LoginFrame() { initializeUI(); } private void initializeUI() { setTitle("用户登录"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(400, 300); setLocationRelativeTo(null); // 居中显示 // 创建主面板 JPanel mainPanel = new JPanel(new BorderLayout(10, 10)); mainPanel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); // 创建表单面板 JPanel formPanel = new JPanel(new GridLayout(3, 2, 10, 10)); // 用户名组件 JLabel usernameLabel = new JLabel("用户名:"); usernameLabel.setFont(new Font("微软雅黑", Font.PLAIN, 14)); usernameField = new JTextField(); usernameField.setFont(new Font("微软雅黑", Font.PLAIN, 14)); // 密码组件 JLabel passwordLabel = new JLabel("密码:"); passwordLabel.setFont(new Font("微软雅黑", Font.PLAIN, 14)); passwordField = new JPasswordField(); passwordField.setFont(new Font("微软雅黑", Font.PLAIN, 14)); // 按钮面板 JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); loginButton = new JButton("登录"); cancelButton = new JButton("取消"); // 设置按钮样式 loginButton.setFont(new Font("微软雅黑", Font.BOLD, 14)); loginButton.setBackground(new Color(70, 130, 180)); loginButton.setForeground(Color.WHITE); cancelButton.setFont(new Font("微软雅黑", Font.PLAIN, 14)); // 添加组件到表单面板 formPanel.add(usernameLabel); formPanel.add(usernameField); formPanel.add(passwordLabel); formPanel.add(passwordField); // 添加组件到按钮面板 buttonPanel.add(cancelButton); buttonPanel.add(loginButton); // 添加到主面板 mainPanel.add(formPanel, BorderLayout.CENTER); mainPanel.add(buttonPanel, BorderLayout.SOUTH); // 添加事件监听器 addEventListeners(); // 设置内容面板 setContentPane(mainPanel); } private void addEventListeners() { // 登录按钮事件 loginButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String username = usernameField.getText().trim(); String password = new String(passwordField.getPassword()); if (username.isEmpty() || password.isEmpty()) { JOptionPane.showMessageDialog(LoginFrame.this, "用户名和密码不能为空", "错误", JOptionPane.ERROR_MESSAGE); return; } // 验证登录逻辑(这里简化处理) if ("admin".equals(username) && "123456".equals(password)) { JOptionPane.showMessageDialog(LoginFrame.this, "登录成功!", "成功", JOptionPane.INFORMATION_MESSAGE); // 打开主窗口 new MainFrame().setVisible(true); dispose(); // 关闭登录窗口 } else { JOptionPane.showMessageDialog(LoginFrame.this, "用户名或密码错误", "错误", JOptionPane.ERROR_MESSAGE); } } }); // 取消按钮事件 cancelButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.exit(0); } }); // 回车键登录 usernameField.addActionListener(e -> loginButton.doClick()); passwordField.addActionListener(e -> loginButton.doClick()); } public static void main(String[] args) { // 设置 Swing 外观 try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeel()); } catch (Exception e) { e.printStackTrace(); } SwingUtilities.invokeLater(() -> { new LoginFrame().setVisible(true); }); } } class MainFrame extends JFrame { public MainFrame() { setTitle("主界面"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(800, 600); setLocationRelativeTo(null); JLabel welcomeLabel = new JLabel("欢迎使用系统", JLabel.CENTER); welcomeLabel.setFont(new Font("微软雅黑", Font.BOLD, 24)); add(welcomeLabel); } }

Swing 表格和菜单

学生信息管理系统
import javax.swing.*; import javax.swing.table.DefaultTableModel; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class StudentManagementSystem extends JFrame { private JTable studentTable; private DefaultTableModel tableModel; private JTextField nameField, ageField, gradeField; public StudentManagementSystem() { initializeUI(); } private void initializeUI() { setTitle("学生信息管理系统"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(800, 600); setLocationRelativeTo(null); // 创建菜单栏 createMenuBar(); // 创建主面板 JPanel mainPanel = new JPanel(new BorderLayout(10, 10)); mainPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); // 创建输入面板 JPanel inputPanel = createInputPanel(); // 创建表格 createStudentTable(); JScrollPane tableScrollPane = new JScrollPane(studentTable); // 创建按钮面板 JPanel buttonPanel = createButtonPanel(); // 添加到主面板 mainPanel.add(inputPanel, BorderLayout.NORTH); mainPanel.add(tableScrollPane, BorderLayout.CENTER); mainPanel.add(buttonPanel, BorderLayout.SOUTH); setContentPane(mainPanel); } private void createMenuBar() { JMenuBar menuBar = new JMenuBar(); // 文件菜单 JMenu fileMenu = new JMenu("文件"); JMenuItem exitItem = new JMenuItem("退出"); exitItem.addActionListener(e -> System.exit(0)); fileMenu.add(exitItem); // 帮助菜单 JMenu helpMenu = new JMenu("帮助"); JMenuItem aboutItem = new JMenuItem("关于"); aboutItem.addActionListener(e -> JOptionPane.showMessageDialog(this, "学生信息管理系统 v1.0", "关于", JOptionPane.INFORMATION_MESSAGE)); helpMenu.add(aboutItem); menuBar.add(fileMenu); menuBar.add(helpMenu); setJMenuBar(menuBar); } private JPanel createInputPanel() { JPanel panel = new JPanel(new GridLayout(2, 3, 10, 10)); // 姓名输入 JLabel nameLabel = new JLabel("姓名:"); nameField = new JTextField(); // 年龄输入 JLabel ageLabel = new JLabel("年龄:"); ageField = new JTextField(); // 班级输入 JLabel gradeLabel = new JLabel("班级:"); gradeField = new JTextField(); panel.add(nameLabel); panel.add(nameField); panel.add(ageLabel); panel.add(ageField); panel.add(gradeLabel); panel.add(gradeField); return panel; } private void createStudentTable() { String[] columnNames = {"ID", "姓名", "年龄", "班级"}; tableModel = new DefaultTableModel(columnNames, 0) { @Override public boolean isCellEditable(int row, int column) { return false; // 表格不可编辑 } }; studentTable = new JTable(tableModel); studentTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); studentTable.getTableHeader().setReorderingAllowed(false); // 添加示例数据 addSampleData(); } private JPanel createButtonPanel() { JPanel panel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); JButton addButton = new JButton("添加"); JButton deleteButton = new JButton("删除"); JButton clearButton = new JButton("清空"); // 添加按钮事件 addButton.addActionListener(e -> addStudent()); deleteButton.addActionListener(e -> deleteStudent()); clearButton.addActionListener(e -> clearInput()); panel.add(clearButton); panel.add(deleteButton); panel.add(addButton); return panel; } private void addStudent() { String name = nameField.getText().trim(); String ageStr = ageField.getText().trim(); String grade = gradeField.getText().trim(); if (name.isEmpty() || ageStr.isEmpty() || grade.isEmpty()) { JOptionPane.showMessageDialog(this, "请填写所有字段", "错误", JOptionPane.ERROR_MESSAGE); return; } try { int age = Integer.parseInt(ageStr); int id = tableModel.getRowCount() + 1; tableModel.addRow(new Object[]{id, name, age, grade}); clearInput(); } catch (NumberFormatException e) { JOptionPane.showMessageDialog(this, "年龄必须是数字", "错误", JOptionPane.ERROR_MESSAGE); } } private void deleteStudent() { int selectedRow = studentTable.getSelectedRow(); if (selectedRow == -1) { JOptionPane.showMessageDialog(this, "请选择要删除的学生", "错误", JOptionPane.ERROR_MESSAGE); return; } int confirm = JOptionPane.showConfirmDialog(this, "确定要删除选中的学生吗?", "确认删除", JOptionPane.YES_NO_OPTION); if (confirm == JOptionPane.YES_OPTION) { tableModel.removeRow(selectedRow); } } private void clearInput() { nameField.setText(""); ageField.setText(""); gradeField.setText(""); nameField.requestFocus(); } private void addSampleData() { tableModel.addRow(new Object[]{1, "张三", 20, "计算机1班"}); tableModel.addRow(new Object[]{2, "李四", 19, "计算机2班"}); tableModel.addRow(new Object[]{3, "王五", 21, "软件工程1班"}); } public static void main(String[] args) { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeel()); } catch (Exception e) { e.printStackTrace(); } SwingUtilities.invokeLater(() -> { new StudentManagementSystem().setVisible(true); }); } }
提示: 这是一个重要的概念,需要特别注意理解和掌握。
注意: 这是一个常见的错误点,请避免犯同样的错误。