图形用户界面(GUI)是用户与程序交互的重要方式。虽然 Web 应用流行,但 Java GUI 依然广泛应用于:
Java 提供了两大 GUI 技术:
lua复制编辑 +-----------------------------+
| Java GUI API |
+-----------------------------+
/ \
+------+ +------+
| Swing| |JavaFX|
+------+ +------+
| |
+----------------+ +-----------------+
| JFrame、JPanel | | Stage、Scene |
| JButton、JLabel| | Button、Label |
+----------------+ +-----------------+
java复制编辑import javax.swing.*; publicclassHelloSwing { publicstaticvoidmain(String[] args) { JFrameframe=newJFrame("第一个 Swing 程序"); frame.setSize(400, 300); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JLabellabel=newJLabel("你好,Swing!", SwingConstants.CENTER); frame.add(label); frame.setVisible(true); } }
diff复制编辑+---------------------------+ | 第一个 Swing 程序 | | | | 你好,Swing! | | | +---------------------------+
组件 | 说明 |
---|---|
JFrame | 窗口容器 |
JPanel | 面板容器,用于布局 |
JButton | 按钮 |
JLabel | 文本标签 |
JTextField | 文本输入框 |
JTextArea | 多行文本输入 |
JCheckBox | 多选框 |
JRadioButton | 单选按钮 |
JComboBox | 下拉框 |
JTable | 表格 |
java复制编辑frame.setLayout(newBorderLayout()); frame.add(newJButton("北"), BorderLayout.NORTH); frame.add(newJButton("南"), BorderLayout.SOUTH); frame.add(newJButton("东"), BorderLayout.EAST); frame.add(newJButton("西"), BorderLayout.WEST); frame.add(newJButton("中"), BorderLayout.CENTER);
diff复制编辑+---------------------------+ | 北 | | 西 中 东 | | 南 | +---------------------------+
java复制编辑frame.setLayout(newGridLayout(2, 3)); for (inti=1; i <= 6; i++) { frame.add(newJButton("按钮 " + i)); }
事件响应是 GUI 编程的核心。
java复制编辑JButtonbutton=newJButton("点击我"); button.addActionListener(e -> { JOptionPane.showMessageDialog(null, "按钮被点击!"); });
css复制编辑[按钮点击] → 触发 ActionEvent → 被监听器捕获 → 执行响应方法
java复制编辑JTextFielduserField=newJTextField(15); JPasswordFieldpassField=newJPasswordField(15); JButtonloginBtn=newJButton("登录"); loginBtn.addActionListener(e -> { Stringuser= userField.getText(); Stringpass=newString(passField.getPassword()); if (user.equals("admin") && pass.equals("1234")) { JOptionPane.showMessageDialog(null, "登录成功!"); } else { JOptionPane.showMessageDialog(null, "用户名或密码错误!"); } });
java复制编辑import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.Label; import javafx.stage.Stage; publicclassHelloFXextendsApplication { publicvoidstart(Stage stage) { Labellabel=newLabel("你好,JavaFX!"); Scenescene=newScene(label, 300, 200); stage.setScene(scene); stage.setTitle("JavaFX 示例"); stage.show(); } }
特性 | Swing | JavaFX |
---|---|---|
API 年代 | 1998 | 2012 起,持续更新 |
风格 | 老旧风格 | 更现代(支持 CSS) |
动画/多媒体 | 较弱 | 原生支持 |
开发体验 | 原生 API | 可结合 FXML 和 SceneBuilder |
markdown复制编辑+--------------------------+ | 登录界面 | |--------------------------| | 用户名: [___________] | | 密码 : [___________] | | | | [ 登录 ] [ 取消 ] | +--------------------------+
控件 | Java 类名 |
---|---|
Label | javafx.scene.control.Label |
Button | Button |
TextField | TextField |
PasswordField | PasswordField |
CheckBox | CheckBox |
RadioButton | RadioButton |
TableView | TableView |
ComboBox | ComboBox |
FXML 是 JavaFX 的界面描述语言,像 HTML 一样定义布局。
xml复制编辑<GridPanexmlns:fx="http://javafx.com/fxml"> <Labeltext="用户名:"/> <TextFieldfx:id="userField"/> <Buttontext="登录"onAction="#handleLogin"/> </GridPane>
Java 代码中用 @FXML 注解绑定控件和事件。
java复制编辑@FXMLprivate TextField userField; @FXMLprivatevoidhandleLogin() { System.out.println("用户:" + userField.getText()); }
项目建议 | 示例说明 |
---|---|
多窗口切换 | 登录成功后跳转主界面 |
配置界面风格 | 使用 UIManager.setLookAndFeel |
分离逻辑与界面 | 使用 MVC 模式或 Controller |
提高兼容性 | 控件大小、布局自适应调整 |
mathematica复制编辑Swing 开发流程: 创建 JFrame → 设置布局 → 添加组件 → 添加事件 → 显示窗口 JavaFX 开发流程: 创建 Application → 加载 FXML 或手写控件 → 绑定 Controller → 设置 Scene → 显示 Stage
问题 | 简要说明 |
---|---|
Swing 是线程安全的吗? | 否,GUI 操作需在 EDT 中执行 |
JavaFX 与 Swing 哪个更现代? | JavaFX,支持 CSS、动画等 |
如何响应按钮点击事件? | 使用 addActionListener 或 FXML |
如何实现多窗口跳转? | 隐藏当前窗口,创建并显示新窗口 |
Java GUI 编程依然在多个领域有实际应用价值。通过本文你已经学会:
文章评论(0条评论)
登录后参与讨论