0

0

java如何使用Swing创建简单的图形界面 javaSwing图形界面开发的入门教程​

雪夜

雪夜

发布时间:2025-08-02 19:45:01

|

459人浏览过

|

来源于php中文网

原创

swing推荐使用swingutilities.invokelater是因为所有ui操作必须在事件调度线程(edt)上执行,1. 直接在主线程操作ui可能导致线程安全问题、界面卡顿或无响应;2. invokelater将ui任务提交到edt队列中,确保串行安全执行;3. 该方法是启动swing应用和更新ui的最佳实践,但仅在非edt线程中需要使用,在edt内部(如事件监听)则无需调用。

java如何使用Swing创建简单的图形界面 javaSwing图形界面开发的入门教程​

Java Swing创建图形界面,核心在于组合各种UI组件(如

JFrame
JPanel
JButton
JLabel
等),并通过布局管理器来组织它们,最终在事件调度线程(EDT)上呈现给用户。说白了,就是搭积木,然后告诉积木怎么摆放,最后让它动起来。

解决方案

要用Java Swing搭建一个最简单的图形界面,我们通常会从

JFrame
开始,它是整个窗口的容器。接着,你会在这个窗口里放各种组件,比如按钮、文本框,这些组件又经常被放在
JPanel
里进行分组,这样管理起来更方便。

来看一个基础到不能再基础的例子,一个带按钮和文本标签的窗口:

立即学习Java免费学习笔记(深入)”;

import javax.swing.*; // 引入Swing组件
import java.awt.*;    // 引入AWT中的布局管理器和事件处理
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class SimpleSwingApp {

    public static void main(String[] args) {
        // 这是Swing应用的关键一步:所有UI更新都应该在事件调度线程(EDT)上进行。
        // SwingUtilities.invokeLater确保我们的GUI代码在EDT上运行。
        SwingUtilities.invokeLater(() -> {
            createAndShowGUI();
        });
    }

    private static void createAndShowGUI() {
        // 1. 创建主窗口 (JFrame)
        JFrame frame = new JFrame("我的第一个Swing窗口");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置关闭操作,点击X时退出程序
        frame.setSize(400, 300); // 设置窗口大小

        // 2. 创建一个面板 (JPanel) 来容纳其他组件
        // 我个人习惯用JPanel来做组件的分组和布局管理,感觉更清晰。
        JPanel panel = new JPanel();
        panel.setLayout(new FlowLayout()); // 使用流式布局,组件会从左到右、从上到下排列

        // 3. 创建一个标签 (JLabel)
        JLabel label = new JLabel("你好,Swing!");
        panel.add(label); // 将标签添加到面板

        // 4. 创建一个按钮 (JButton)
        JButton button = new JButton("点我!");
        // 给按钮添加一个动作监听器,这样点击按钮时会有反应
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // 当按钮被点击时,更新标签的文本
                label.setText("按钮被点击了!");
                System.out.println("按钮被点击了!"); // 也可以在控制台输出
            }
        });
        panel.add(button); // 将按钮添加到面板

        // 5. 将面板添加到窗口
        frame.add(panel);

        // 6. 让窗口可见
        frame.setVisible(true);
        // 7. 居中显示窗口 (可选,但体验更好)
        frame.setLocationRelativeTo(null);
    }
}

这段代码运行起来,你会看到一个标题为“我的第一个Swing窗口”的窗口,里面有一个“你好,Swing!”的标签和一个“点我!”的按钮。当你点击按钮时,标签的文字会变成“按钮被点击了!”,同时控制台也会有相应的输出。这就是Swing界面开发最基本的骨架。

Swing界面开发中,为什么推荐使用
SwingUtilities.invokeLater

说实话,刚接触Swing时,我经常会忽略

SwingUtilities.invokeLater
这一步,结果就是程序有时候会莫名其妙地卡死,或者界面更新不及时。后来才明白,这背后藏着Swing的“心脏”——事件调度线程(Event Dispatch Thread,简称EDT)。

简单来说,Swing的所有UI操作,包括组件的创建、修改、事件处理等等,都必须在这个EDT上进行。你可以把EDT想象成一个专门负责处理用户界面事件和更新界面的“工人”。如果你的代码直接在主线程(或者其他非EDT线程)上创建或修改UI组件,就相当于有多个工人在同时操作同一个界面,这很容易导致线程安全问题,比如界面错乱、组件状态不一致,甚至直接抛出异常。更常见的是,界面会变得无响应,因为主线程可能被一些耗时操作阻塞了,而EDT却没有机会去处理界面事件。

SwingUtilities.invokeLater
的作用就是把你的UI更新任务提交到EDT的任务队列中,让EDT在它空闲的时候去执行这些任务。这样就保证了所有的UI操作都是串行且安全的,避免了多线程并发修改UI带来的各种麻烦。所以,每次启动Swing应用或者进行任何UI更新时,把它包在
invokeLater
里,几乎成了一种“仪式感”或者说最佳实践。当然,如果你在EDT内部已经执行了,比如在按钮的
actionPerformed
方法里,那就不需要再包一层了,因为
actionPerformed
本身就是EDT调用的。

如何在Swing应用中管理组件布局?常用的布局管理器有哪些?

布局管理在Swing里是个挺有意思的话题,它决定了你的组件在窗口里怎么“排排坐”。我个人觉得,布局管理器是Swing开发中一个既能让你省心又能让你抓狂的地方。如果你不使用布局管理器,而是尝试手动设置每个组件的绝对位置(

setBounds
),那你的界面在不同分辨率或操作系统下会变得一团糟,维护起来简直是噩梦。

wxPython 2.8 Application Development Cookbook英文pdf版
wxPython 2.8 Application Development Cookbook英文pdf版

在今天的桌面应用世界上有大量的奖励,以便能够开发应用程序,可以运行在多个环境。目前,有一种跨平台框架可供选择的Python开发桌面应用程序屈指可数。 wxPython的就是这样的一个跨平台的GUI工具包的Python编程语言。它允许Python程序员创建一个完整的,功能强大的图形用户界面的程序,简单,方便。 wxPython的代码风格,改变了多年来不少,并得到更多Python的。例子,你会发现这本书是对不断更新,反映在风格上的变化。 本书提供最新的书,快速创建健壮的,可靠,可重复使用的wxPython应用

下载

Swing提供了几种内置的布局管理器,它们各有特点,适用于不同的场景:

  • FlowLayout
    (流式布局):
    这是最简单的布局,组件会像文本一样从左到右、从上到下排列,遇到边界就自动换行。就像你写字一样,写满了就换行。适合放一排按钮或简单的表单元素。我们上面的例子用的就是它。
  • BorderLayout
    (边界布局):
    它把容器分成五个区域:
    NORTH
    (上)、
    SOUTH
    (下)、
    EAST
    (右)、
    WEST
    (左)和
    CENTER
    (中)。每个区域最多只能放置一个组件。中心区域会占据所有剩余空间。我经常用它来构建主界面框架,比如顶部放菜单栏,底部放状态栏,中间放主要内容区。
  • GridLayout
    (网格布局):
    顾名思义,它把容器划分为一个网格,所有组件大小相同,并按从左到右、从上到下的顺序填充网格。非常适合创建像计算器键盘那样的整齐排列的界面。
  • BoxLayout
    (盒式布局):
    它可以让组件在水平或垂直方向上排成一行或一列。比
    FlowLayout
    更灵活的地方在于,你可以控制组件之间的间距,甚至加入“胶水”(glue)和“刚性区域”(rigid area)来调整空间。对于构建线性布局的工具栏或侧边栏非常有用。
  • GridBagLayout
    (网格包布局):
    这是最强大也最复杂的布局管理器。它允许你将组件放置在不规则的网格中,并控制它们跨越多少行多少列,以及在单元格内如何对齐和拉伸。虽然学习曲线陡峭,但它能实现几乎任何复杂的布局。一旦掌握,你会觉得它非常值得。

选择哪个布局管理器,完全取决于你的界面设计需求。有时候,我会把多个

JPanel
嵌套起来,每个
JPanel
使用不同的布局管理器,这样就能组合出更复杂的界面结构。

Swing与JavaFX相比,各自的优势和适用场景是什么?

这是一个很有趣的问题,尤其对于想进入Java桌面应用开发领域的人来说。Swing和JavaFX都是Java用来构建桌面应用的UI工具包,但它们代表了不同的时代和设计理念。

Swing的优势与适用场景:

  • 成熟稳定: Swing已经存在很长时间了,它的API非常稳定,社区支持也很庞大。很多遗留系统和企业级应用仍然在使用Swing。
  • JDK内置: 从JDK 1.2开始,Swing就是JDK的一部分,这意味着你不需要额外引入依赖就能开始开发。
  • 跨平台: Swing是纯Java实现的,因此具有很好的跨平台性,在Windows、macOS、Linux上都能运行。
  • 学习资料丰富: 由于历史悠久,网上和书籍中关于Swing的学习资料非常多。

我个人觉得,Swing更适合以下场景:

  • 快速开发内部工具: 如果你只是想快速搭一个功能性的小工具,界面美观度要求不高,Swing非常高效。
  • 维护遗留系统: 如果你的项目是基于Swing的,那么继续使用Swing进行维护和扩展是自然的选择。
  • 对UI性能和动画要求不高: 对于传统的、数据驱动的桌面应用,Swing足以胜任。

JavaFX的优势与适用场景:

  • 现代化UI: JavaFX在设计之初就考虑了现代UI/UX的需求,提供了更丰富的组件、更流畅的动画效果、更强大的图形渲染能力。
  • FXML与CSS: JavaFX支持使用FXML(一种XML方言)来声明式地定义UI布局,并通过CSS来美化界面,这使得UI和逻辑分离,开发效率更高,也更容易设计出美观的界面。
  • 媒体支持: 内置了对音频、视频等多媒体的支持,这在Swing中需要额外集成。
  • Web视图: 提供了WebView组件,可以方便地在桌面应用中嵌入网页内容。
  • 绑定(Binding)与属性(Properties): JavaFX的属性系统和绑定机制让数据模型与UI组件之间的同步变得异常简单和高效。

JavaFX在我看来更适合以下场景:

  • 开发全新的、注重用户体验的桌面应用: 如果你希望你的应用看起来更现代、更具吸引力,JavaFX是更好的选择。
  • 需要丰富动画和图形效果的应用: 游戏、数据可视化工具等。
  • 希望UI与业务逻辑分离的应用: FXML和CSS的引入,让前端和后端开发人员可以更好地协作。
  • 计划未来可能扩展到Web的应用: 虽然不是直接转换,但JavaFX的设计理念与Web技术有相通之处。

总的来说,Swing就像一位经验丰富的老兵,稳定可靠,但可能略显“朴素”;而JavaFX则是一位充满活力的新生代,拥有更时尚的装备和更广阔的视野。在选择时,我会根据项目的具体需求、团队的技术栈以及对UI美观度的追求来做决定。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1901

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2091

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

1072

2024.11.28

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

397

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

575

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

503

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

166

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

15

2026.01.21

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

1

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3万人学习

C# 教程
C# 教程

共94课时 | 7.9万人学习

Java 教程
Java 教程

共578课时 | 53万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号