Java 提供了 Swing 和 JavaFX 两种主要的 GUI 开发工具包。
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);
});
}
}
提示: 这是一个重要的概念,需要特别注意理解和掌握。
注意: 这是一个常见的错误点,请避免犯同样的错误。