- 历史与经典:使用Swing库进行可视化界面设计。
- 现代与流行:使用JavaFX库进行可视化界面设计。
- 高级与效率:使用GUI设计器(如Matisse, Scene Builder)来可视化地“画”出界面。
下面我将详细展开这三个方面,并提供代码示例和最佳实践。

核心概念:GUI编程的两种方式
在开始之前,必须理解Java GUI编程的两种核心模式:
- 手动布局:程序员在代码中通过
new JButton(),new JPanel(),panel.add(button)等方式,一行一行地创建和摆放组件,优点是代码逻辑清晰,缺点是布局复杂时代码冗长且难以维护。 - 可视化设计器:提供一个图形化的拖放界面,开发者像画画一样把按钮、文本框等组件拖到窗口上,设计器会自动生成对应的Java代码(通常是FXML或
.java文件),优点是直观、高效,缺点是生成的代码可能包含“魔法”,不易理解其工作原理。
现代开发通常是“可视化设计器 + 手动代码逻辑”的结合。
Java Swing (经典、稳定)
Swing是Java的老牌GUI库,它基于AWT,但完全用Java重写,不依赖本地平台,具有更好的跨平台一致性。
手动编写Swing GUI
这是理解GUI工作原理的基础。

核心组件:
JFrame:主窗口,GUI的顶级容器。JPanel:面板,一个轻量级容器,用于放置其他组件,方便布局。JButton,JTextField,JTextArea,JLabel等:各种UI控件。
布局管理器:
BorderLayout:将容器分为北、南、东、西、中五个区域。FlowLayout:从左到右、从上到下排列组件,像文字换行。GridLayout:将容器划分为网格,每个组件占据一个格子。GridBagLayout:最强大也最复杂的布局,可以实现任意复杂的界面。
示例:一个简单的登录窗口
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class SimpleLoginApp {
public static void main(String[] args) {
// 在事件分发线程中创建和显示GUI,这是Swing的最佳实践
SwingUtilities.invokeLater(() -> {
// 1. 创建主窗口
JFrame frame = new JFrame("简单登录");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置关闭操作
frame.setSize(300, 200); // 设置窗口大小
frame.setLocationRelativeTo(null); // 窗口居中
// 2. 创建主面板,使用BorderLayout
JPanel mainPanel = new JPanel(new BorderLayout(10, 10));
mainPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); // 设置内边距
// 3. 创建输入面板,使用GridLayout
JPanel inputPanel = new JPanel(new GridLayout(2, 2, 5, 5));
inputPanel.add(new JLabel("用户名:"));
JTextField usernameField = new JTextField(20);
inputPanel.add(usernameField);
inputPanel.add(new JLabel("密码:"));
JPasswordField passwordField = new JPasswordField(20);
inputPanel.add(passwordField);
// 4. 创建按钮面板,使用FlowLayout
JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
JButton loginButton = new JButton("登录");
JButton cancelButton = new JButton("取消");
buttonPanel.add(loginButton);
buttonPanel.add(cancelButton);
// 5. 将面板添加到主窗口
mainPanel.add(inputPanel, BorderLayout.CENTER);
mainPanel.add(buttonPanel, BorderLayout.SOUTH);
// 6. 添加按钮事件监听器
loginButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String username = usernameField.getText();
String password = new String(passwordField.getPassword());
JOptionPane.showMessageDialog(frame, "登录信息: " + username);
}
});
cancelButton.addActionListener(e -> System.exit(0)); // 使用Lambda表达式简化代码
// 7. 将主面板添加到窗口并显示
frame.setContentPane(mainPanel);
frame.setVisible(true);
});
}
}
JavaFX (现代、推荐)
JavaFX是Sun/Oracle为Swing设计的继任者,功能更强大,支持CSS样式、FXML、3D图形、硬件加速等,是当前Java GUI开发的首选。

手动编写JavaFX GUI
JavaFX使用场景图的概念,节点被组织成树状结构。
核心概念:
Stage:舞台,相当于Swing的JFrame,是顶级窗口。Scene:场景,包含所有可视内容的容器,一个Stage只能有一个Scene。Parent:父节点,可以是Group(组)或Pane(面板)。Node:节点,任何UI元素(如Button,Label)都是节点。
示例:一个简单的登录窗口
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.stage.Stage;
public class SimpleLoginFXApp extends Application {
@Override
public void start(Stage primaryStage) {
// 1. 创建根布局 (VBox - 垂直盒子)
VBox root = new VBox(10); // 10是组件间的间距
root.setPadding(new Insets(15)); // 15是内边距
root.setAlignment(Pos.CENTER); // 所有子元素居中对齐
// 2. 创建UI控件
Label titleLabel = new Label("用户登录");
titleLabel.setStyle("-fx-font-size: 18px; -fx-font-weight: bold;");
Label userLabel = new Label("用户名:");
TextField userTextField = new TextField();
userTextField.setPrefWidth(200);
Label passLabel = new Label("密码:");
PasswordField passPasswordField = new PasswordField();
passPasswordField.setPrefWidth(200);
// 3. 创建按钮面板
HBox buttonBox = new HBox(10); // 水平盒子
buttonBox.setAlignment(Pos.CENTER);
Button loginButton = new Button("登录");
Button cancelButton = new Button("取消");
buttonBox.getChildren().addAll(loginButton, cancelButton);
// 4. 将所有控件添加到根布局
root.getChildren().addAll(titleLabel, userLabel, userTextField, passLabel, passPasswordField, buttonBox);
// 5. 创建场景和设置舞台
Scene scene = new Scene(root, 300, 250);
primaryStage.setTitle("JavaFX 登录");
primaryStage.setScene(scene);
primaryStage.show();
// 6. 添加事件处理
loginButton.setOnAction(e -> {
String username = userTextField.getText();
Alert alert = new Alert(Alert.AlertType.INFORMATION);
alert.setTitle("登录信息");
alert.setHeaderText(null);
alert.setContentText("欢迎, " + username + "!");
alert.showAndWait();
});
cancelButton.setOnAction(e -> primaryStage.close());
}
public static void main(String[] args) {
launch(args); // 启动JavaFX应用
}
}
可视化GUI设计器 (效率至上)
手动编写布局代码非常繁琐,可视化设计器能极大提升开发效率。
Swing + GUI设计器 (如 NetBeans 的 Matisse)
NetBeans IDE 集成了一个强大的Swing设计器,称为Matisse。
工作流程:
- 在NetBeans中创建一个 "Java GUI Form" 项目。
- IDE会自动生成一个
YourFormName.java和一个YourFormName.form文件。 - 在
.form文件的设计视图中,你可以从组件面板中拖拽组件到窗体上。 - 通过属性面板可以修改组件的名称、文本、大小、布局约束等。
- 双击按钮等组件,IDE会自动在
.java文件中生成事件处理方法的框架,你只需填写逻辑代码即可。
生成的代码结构:
YourFormName.java 文件会继承 javax.swing.JFrame,并包含 initComponents() 方法。initComponents() 方法由设计器维护,通常不应手动修改,你在这个类中添加自己的业务逻辑。
JavaFX + FXML + Scene Builder (现代标准)
这是JavaFX生态中最流行、最推荐的方式,它将界面(View)和逻辑(Controller)完全分离。
- FXML:一种基于XML的标记语言,用来描述UI布局和组件。
.fxml文件就是你的“画”出来的界面。 - Scene Builder:一个独立的、可视化的FXML编辑器,你可以拖拽组件,它会生成对应的FXML代码。
- Controller:一个普通的Java类,包含处理用户交互(如按钮点击)的Java代码,通过
@FXML注解将FXML中的组件和事件处理器与此类关联。
工作流程:
- 安装并打开 Scene Builder。
- 在IDE(如IntelliJ IDEA或VS Code)中创建一个JavaFX项目。
- 在Scene Builder中,从左侧组件库拖拽到右侧的预览窗口,构建你的界面。
- 保存为
sample.fxml文件。 - 在你的Java主类中加载这个FXML文件,并显示
Scene。 - 创建一个Controller类,并使用
@FXML注入FXML中定义的组件和事件方法。
示例代码结构:
sample.fxml (由Scene Builder生成)
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.VBox?>
<VBox alignment="CENTER" spacing="20.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.example.MainController">
<children>
<Label text="Welcome to JavaFX!" />
<TextField fx:id="nameField" promptText="Enter your name" />
<Button fx:id="helloButton" mnemonicParsing="false" onAction="#handleButtonAction" text="Say Hello" />
</children>
</VBox>
MainController.java (逻辑控制器)
import javafx.fxml.FXML;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
public class MainController {
@FXML
private TextField nameField;
@FXML
private Label welcomeText; // FXML文件中需要有fx:id="welcomeText"的Label
@FXML
protected void handleButtonAction() {
welcomeText.setText("Welcome, " + nameField.getText() + "!");
}
}
MainApp.java (主程序)
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class MainApp extends Application {
@Override
public void start(Stage stage) throws Exception {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/sample.fxml"));
Parent root = loader.load();
Scene scene = new Scene(root);
stage.setTitle("FXML Welcome");
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
总结与对比
| 特性 | Java Swing | JavaFX | JavaFX + FXML/Scene Builder |
|---|---|---|---|
| 定位 | 经典库,稳定,JDK内置 | 现代库,功能强大,Oracle主推 | 现代开发最佳实践 |
| 学习曲线 | 较低,布局管理器需要熟悉 | 中等,概念清晰(Scene, Stage) | 较低,拖拽即可上手,关注点分离 |
| 界面设计 | 手动编码,繁琐 | 手动编码,比Swing直观 | 可视化拖拽,效率极高 |
| 外观 | 跨平台一致,但样式较旧 | 支持CSS,可定制性强,效果现代 | 支持CSS,可定制性强,效果现代 |
| 代码分离 | 混合在一起 | 混合在一起 | 完美分离(View & Controller) |
| 推荐场景 | 学习基础、维护旧项目、简单工具 | 新项目、需要丰富UI效果(图表、媒体) | 几乎所有新项目,特别是中大型项目 |
| 依赖 | JDK自带 | 需要单独添加JavaFX SDK/模块 | 需要单独添加JavaFX SDK/模块 |
最终建议
- 如果你是初学者,想理解GUI的底层原理:从 Java Swing 的手动布局开始,它能让你深刻理解容器、组件和布局管理器是如何协同工作的。
- 如果你要开发一个现代、美观、功能丰富的桌面应用:直接学习 JavaFX + FXML + Scene Builder 的组合,这是当前Java GUI开发的主流和未来,它能让你像Web开发一样高效地构建界面,并保持代码的清晰和可维护性。
- 如果你在维护一个老旧的Swing项目:继续使用Swing,并可以考虑使用NetBeans的Matisse设计器来快速修改界面。
