当前位置: 首页 > ai >正文

12 Java GUI

Java 在图形开发中的占比并不是特别突出,尤其在传统的客户端图形界面开发方面。不是现代 UI 设计的首选

C#的WinForms(传统)、WPF(现代)是Windows 桌面开发的王者

跨平台(Windows/macOS/Linux),Qt 最强

Java GUI 开发技术概览

技术全称特点
AWTAbstract Window Toolkit最早的 GUI 库,依赖操作系统本地组件,外观不一致
Swing-基于 AWT 构建,纯 Java 实现,外观跨平台一致,功能更丰富
JavaFX-新一代 GUI 框架,支持 CSS、FXML、动画等现代 UI 功能
  • Swing 是建立在 AWT 基础之上的 GUI 工具包
  • Swing 的很多类继承自 AWT 类(如 ComponentContainer 等)。
  • Swing 的事件模型完全基于 AWT 的事件模型,也就是说:
    • Swing 使用了 AWT 的事件监听器接口(如 ActionListenerMouseListener 等)
    • 事件对象也来自 AWT 包(如 ActionEventMouseEvent

从 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):绘制容器中的所有组件。通常不需要直接调用此方法。

子类介绍

  1. Panel
    • 最基本的容器之一,用于将一组组件组合在一起。它没有边框,也不能独立存在,必须被放置在一个窗口或其他容器内。
      • Applet虽然严格来说不是 Container 的直接子类(它是 Panel 的子类),但在这里提及是因为它可以作为容器来组织GUI组件。Applet 是一种特殊的Java程序,设计为在网页中运行。
  2. ScrollPane
    • 提供了滚动功能的容器,当内容超出容器大小时,可以使用滚动条查看所有内容。适用于展示大量信息的情况。
  3. 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等可视化工具使用。

http://www.xdnf.cn/news/10396.html

相关文章:

  • Word双栏英文论文排版攻略
  • 【解决】【亲测下载obsidian可行】打不开github.com 或者 加速访问 github
  • Pull Request Integration 拉取请求集成
  • Python实现HPSO-TVAC优化算法优化支持向量机SVC分类模型项目实战
  • QT/c++航空返修数据智能分析系统
  • 重读《人件》Peopleware -(15)Ⅱ 办公环境 Ⅷ 撑伞之步:构建理想办公环境(上)
  • 数据中台(大数据平台)之数据安全管理
  • InternVL2.5-多模态大模型评估专业图片
  • Python爬虫:AutoScraper 库详细使用大全(一个智能、自动、轻量级的网络爬虫)
  • 从模式到架构:Java 工厂模式的设计哲学与工程化实践
  • 【办公类-22-05】20250601Python模拟点击鼠标上传CSDN12篇
  • 开始使用 Elastic AI Assistant for Observability 和 Amazon Bedrock
  • 接口自动化常用断言方式
  • 小明的Java面试奇遇之商城系统的技术挑战与实战
  • 考研系列—操作系统:第五章、输入输出(I/O)管理
  • Cesium快速入门到精通系列教程三
  • c++学习值---模版
  • 【计算机网络】第3章:传输层—可靠数据传输的原理
  • [蓝桥杯]外卖店优先级
  • 【极客日常】分享go开发中wire和interface配合的一些经验
  • C++ 之 多态 【虚函数表、多态的原理、动态绑定与静态绑定】
  • Scratch节日 | 六一儿童节射击游戏
  • ​​技术深度解析:《鸿蒙5.0+:全场景能效的产业革命》​
  • idea中springboot2.7(由于步入另一个线程,已跳过 xxx 处的断点)
  • Azure Devops 系列之三- vscode部署function app
  • 017搜索之深度优先搜索——算法备赛
  • 智语心桥:当AI遇上“星星的孩子”,科技如何点亮沟通之路?
  • 目标检测我来惹1 R-CNN
  • 嵌入式学习笔记 - FreeRTOS v9.0.0 与v10.0.1不同版本占用资源对比
  • 2025——》NumPy中的np.random.randn使用/在什么场景下适合使用np.random.randn?NumPy标准正态分布生成全解析