12 Java GUI
Java 在图形开发中的占比并不是特别突出,尤其在传统的客户端图形界面开发方面。不是现代 UI 设计的首选
C#的WinForms(传统)、WPF(现代)是Windows 桌面开发的王者
跨平台(Windows/macOS/Linux),Qt 最强
Java GUI 开发技术概览
技术 | 全称 | 特点 |
---|---|---|
AWT | Abstract Window Toolkit | 最早的 GUI 库,依赖操作系统本地组件,外观不一致 |
Swing | - | 基于 AWT 构建,纯 Java 实现,外观跨平台一致,功能更丰富 |
JavaFX | - | 新一代 GUI 框架,支持 CSS、FXML、动画等现代 UI 功能 |
- Swing 是建立在 AWT 基础之上的 GUI 工具包。
- Swing 的很多类继承自 AWT 类(如
Component
,Container
等)。 - Swing 的事件模型完全基于 AWT 的事件模型,也就是说:
- Swing 使用了 AWT 的事件监听器接口(如
ActionListener
、MouseListener
等) - 事件对象也来自 AWT 包(如
ActionEvent
,MouseEvent
)
- Swing 使用了 AWT 的事件监听器接口(如
从 Java 11 开始,JavaFX 不再默认包含在标准 JDK 中
JavaFX 最初是在 Java 8 中正式集成进 JDK 的(即 Oracle JDK 8、9、10)但从 Java 11 开始(Oracle JDK 11 及 OpenJDK 发行版如 Adoptium、Amazon Corretto 等), JavaFX 从 JDK 中剥离出来,作为独立模块发布。
JavaFX 从 JDK 中剥离是为了适应现代软件开发的趋势,包括模块化、敏捷开发、开源协作等,并且这样做有利于加快 JavaFX 的发展步伐,同时也让 JDK 本身变得更加轻量和专注。
JavaFX 变成了一个开源项目,由开源社区主导发展。
在运行 Java 程序时,需要通过 --module-path
和 --add-modules
指定 JavaFX 的路径。
javac --module-path /path/to/javafx-sdk-21.0.2/lib \--add-modules=javafx.controls \
HelloFX.java java --module-path /path/to/javafx-sdk-21.0.2/lib \
--add-modules=javafx.controls \
HelloFX
由于Swing 技术栈成熟度高,不需要额外依赖 ,打包简单.对比JavaFX更轻量化 占用低资源更低. 在简单的界面(比如登录框、文本编辑器),和内部工具中,Swing 更适合
第十章我们做了一个聊天室小项目,其中就用到了swing技术.这一章我们会简单讲解swing.补齐我们java的知识体系.
AWT
AWT(Abstract Window Toolkit)是Java提供的一个用于创建图形用户界面(GUI)的工具包。它提供了一系列的基本组件和容器,使得开发者能够在不同平台上创建一致的用户界面。AWT的继承体系结构对于理解如何使用这些组件以及它们之间的关系非常重要。
Component
Component
类是所有GUI组件(如按钮、标签、文本框等)的基类。它定义了组件的基本功能和属性。以下是 Component
类中一些常用的API方法
paint(Graphics g)
:用于自定义组件的绘图逻辑。repaint()
:请求系统重绘组件
getName()
和setName(String name)
:获取或设置组件的名字。getParent()
:获取组件的父容器。invalidate()
:标记组件为需要重新布局。
setToolTipText(String text)
:为组件设置工具提示文本。
setFont(Font font)
:设置组件使用的字体。setBackground(Color c)
和setForeground(Color c)
:设置组件的背景色和前景色(文本颜色)。
requestFocus()
:请求将输入焦点移到此组件上。
setEnabled(boolean b)
:启用或禁用组件。
setVisible(boolean b)
:显示或隐藏组件。
setBounds(int x, int y, int width, int height)
:设置组件的位置和大小。getLocation()
和setLocation(int x, int y)
:获取或设置组件的位置。getSize()
和setSize(Dimension d)
:获取或设置组件的大小。getPreferredSize()
:返回组件的理想大小。
Container
-
Container 类是所有容器的直接或间接父类。它不仅拥有
Component
的所有特性(如绘制、事件处理等),还提供了管理和布局内部组件的方法。 -
它提供了管理子组件的功能,比如添加(
add(Component comp)
方法)和移除(remove(Component comp)
方法)组件。 setLayout(LayoutManager mgr)
:设置容器的布局管理器,用于控制容器内组件的排列方式。getLayout()
:获取当前使用的布局管理器。getComponents()
:返回容器中所有组件的数组。getComponentCount()
:返回容器中组件的数量。getComponent(int index)
:根据索引获取容器中的组件。validate()
:确认容器内的所有组件都已正确布置,并且大小合适。invalidate()
:标记容器为需要重新布局。doLayout()
:让容器安排其子组件的位置和大小。通常不需要直接调用此方法,除非你需要强制重新布局。applyComponentOrientation(ComponentOrientation o)
:对容器及其所有子组件应用组件方向。isAncestorOf(Component c)
:检查指定组件是否为该容器或其任何子容器的子组件。paintComponents(Graphics g)
:绘制容器中的所有组件。通常不需要直接调用此方法。
子类介绍
- Panel
- 最基本的容器之一,用于将一组组件组合在一起。它没有边框,也不能独立存在,必须被放置在一个窗口或其他容器内。
- Applet虽然严格来说不是
Container
的直接子类(它是Panel
的子类),但在这里提及是因为它可以作为容器来组织GUI组件。Applet
是一种特殊的Java程序,设计为在网页中运行。
- Applet虽然严格来说不是
- 最基本的容器之一,用于将一组组件组合在一起。它没有边框,也不能独立存在,必须被放置在一个窗口或其他容器内。
- ScrollPane
- 提供了滚动功能的容器,当内容超出容器大小时,可以使用滚动条查看所有内容。适用于展示大量信息的情况。
- Window
- 独立显示的顶级容器,不依赖于其他容器。它没有边框或标题栏,除非特别设置。
Frame
和Dialog
都是从Window
继承来的- Frame是一个带有标题栏和边框的顶级容器,通常用作应用程序的主窗口。支持关闭按钮、最小化、最大化等功能。用户可以直接与其交互。
- Dialog一个依赖于其他窗口的弹出式对话框,主要用于临时性的交互,如消息框、输入框等。有两种主要类型:模态对话框(阻止与其他窗口的交互直到其关闭)和非模态对话框(允许与应用程序的其他部分交互)。
- 独立显示的顶级容器,不依赖于其他容器。它没有边框或标题栏,除非特别设置。
.
Winow是可以独立存在的顶级窗口,默认使用BorderLayout管理其内部组件布局;
Panel可以容纳其他组件,但不能独立存在,它必须内嵌其他容器中使用,默认使用FlowLayout管理其内部组件布局;
ScrollPane是一个带滚动条的容器,它也不能独立存在,默认使用BorderLayout管理其内部组件布
局;
布局管理器
1. FlowLayout
- 描述:默认的布局管理器,按添加顺序从左至右放置组件,当一行放不下时自动换行。
- 特点:
- 组件之间有默认的水平和垂直间距。
- 可以设置对齐方式(左对齐、居中、右对齐)。
2. BorderLayout
- 描述:将容器分为五个区域(东、西、南、北、中),每个区域可以放置一个组件。
- 特点:
- 北部和南部组件扩展到容器的宽度;东部和西部组件扩展到容器的高度。
- 中心组件占据剩余的空间,并随容器大小的变化而调整。
3. GridLayout
- 描述:以网格形式均匀分布组件,所有组件具有相同的大小。
- 特点:
- 每个组件占一个单元格,按添加顺序依次填充。
- 可以指定行数和列数,如果组件数量超过网格单元,则自动增加行或列。
4. GridBagLayout
- 描述:一种更复杂的网格布局,允许组件跨越多个行和列。
- 特点:
- 使用
GridBagConstraints
对象来定义每个组件的位置、大小和其他属性。 - 提供了高度的灵活性,但配置相对复杂。
- 使用
5. CardLayout
- 描述:就像一叠卡片,每次只显示一张卡片(容器中的一个组件)。
- 特点:
- 通过特定的方法可以在不同的“卡片”间切换,适合实现选项卡式界面或多步骤向导。
6. GroupLayout
- 描述:主要用于构建复杂的GUI,支持水平和垂直组的概念,方便进行精确的布局设计。
- 特点:
- 可以创建层次化的布局结构,使得布局更加直观和易于理解。
- 主要由NetBeans GUI Builder等可视化工具使用。