文章摘要: 提供了一个用于创建图形用户界面(GUI)应用程序的丰富组件集合,是 AWT (Abstract Window Toolkit) 的后续产品。
简介
简要说明
- 提供了一个用于创建图形用户界面(GUI)应用程序的丰富组件集合。
- 是 Java Foundation Classes (JFC) 的一部分,也被称为 Swing,是 AWT (Abstract Window Toolkit) 的后续产品,提供了更加强大和灵活的 GUI 功能。
主要功能
- 组件库:提供按钮、标签、文本框、列表、表格、树、菜单等丰富的 GUI 组件。
- 布局管理器:允许开发者以多种方式对组件进行布局,如流布局、网格布局、边界布局等。
- 事件处理:通过监听器模式支持事件处理,使得用户交互成为可能。
- 可定制性:支持外观和感觉(LookAndFeel)的更换,以适应不同的操作系统风格。
- 绘图和图像处理:提供基本的绘图功能,支持图像的加载、显示和处理。
注意事项
- 线程安全:Swing 组件不是线程安全的,所有的 GUI 操作都应该在事件调度线程(Event Dispatch Thread, EDT)中执行。
- 性能问题:Swing 应用程序可能会因为复杂的 GUI 操作而遇到性能问题,尤其是在处理大量数据时。
- 内存占用:Swing 组件相对较重,可能会占用较多内存。
- 兼容性:虽然 Swing 旨在提供跨平台的 GUI 解决方案,但在不同平台上的表现可能会有所不同。
适用场景
- 桌面应用程序:适用于开发跨平台的桌面应用程序,特别是在需要复杂用户界面的情况下。
- 企业级应用:在企业级应用中,Swing 可用于创建管理控制台或配置工具。
- 教育软件:由于其丰富的组件和易于使用的特性,Swing 也常用于教育软件的开发。
- 个人项目:对于个人项目或小型项目,Swing 提供了足够的工具来构建用户友好的界面。
javax.swing.border
提供用于在 Swing 组件周围绘制专用边框的类和接口。
javax.swing.colorchooset
包含 JColorChooser 使用的类和接口 元件。
javax.swing.event
提供由 Swing 组件触发的事件。
javax.swing.filechooser
包含 JFileChooser 组件使用的类和接口。
javax.swing.plaf
提供一个接口和许多抽象类,Swing 使用这些抽象类来提供其可插入的外观功能。
javax.swing.plaf.basic
提供根据 Basic 外观构建的用户界面对象。
javax.swing.plaf.metal
提供根据 Java 外观(曾经代号为 Metal)构建的用户界面对象,这是默认外观。
javax.swing.plaf.multi
提供组合两种或多种外观的用户界面对象。
javax.swing.plaf.nimbus
提供根据跨平台 Nimbus 外观构建的用户界面对象。
javax.swing.plaf.synth
Synth 是一种可蒙皮的外观和感觉,其中所有绘制都被委托。
javax.swing.table
提供用于处理 javax.swing.JTable 中。
javax.swing.text
提供处理可编辑和不可编辑文本组件的类和接口。
javax.swing.text.html
提供用于创建 HTML 文本编辑器的类 HTMLEditorKit 和支持类。
javax.swing.text.html.parser
提供默认的 HTML 解析器以及支持类。
javax.swing.text.rtf
提供用于创建 Rich-Text-Format 文本编辑器的类 (RTFEditorKit)。
javax.swing.tree
提供用于处理 javax.swing.JTree 中。
javax.swing.undo
允许开发人员在应用程序(如文本编辑器)中提供对撤消/重做的支持。
cache
Swing简介
- Swing是AWT的扩展。
- AWT,抽象窗口工具包(Abstract Windows Toolkit,简称
AWT),是Java中包含的一个用于基本GUI程序设计的类库(工具包),该工具包依附于操作系统提供的UI,具体样式会根据不同操作系统提供的界面元素进行展示。 - swing包路径:
javax.swing - awt包路径:
javax.awt - 组件使用
swing - 布局使用
awt
组件
注意事项
- 默认情况下窗口是不可见的,需要将窗口对象修改为
对象.setVisible(true)。 - 窗口默认没有大小,需要使用
对象.setSize(<宽度>, <高度>)来设置窗口大小。 - 组件在实例化对象后,需要添加到窗口中才能显示,需要使用
对象.add(<组件对象名>)来添加。 - 在容器组件有设置布局的情况下,在其中的组件最好不要使用位置方法。
- 窗口和面板都属于
容器类型的组件。
公共方法
| 方法名 | 介绍 |
|---|---|
| <对象>.setLocation(int x, int y) | 设置组件的位置 |
| <对象>.setSize(int width, int height) | 设置组件的大小 |
| <对象>.setBounds(int x, int y, int width, int height) | 同时设置组件的位置、大小 |
| <对象>.setVisible(boolean b) | 设置该组件的可见性 |
| <容器对象>.add(<组件或容器>) | 将组件或容器添加到容器对象中 |
| <组件对象>.setToolTipText(String text) | 鼠标停靠在组件上时显示悬浮提示信息 |
| <容器对象>.setPreferredSize(new Dimension(int width, int height)); | 设置面板的宽度和高度 |
| <窗口对象>.setUndecorated(boolean b); | 移除标题栏和边框 |
| <对象>.setOpaque(boolean b); | 设置背景颜色为透明 |
容器
JFrame窗体
- 默认布局:边界布局
实例化
// 实例化一个窗口对象
JFrame frame = new JFrame();
修改
// 标题名
frame.setTitle(String name);
// 尺寸大小
frame.setSize(int width, int height);
// 默认显示位置
frame.setLocation(int x, int y);
// 居中位置显示
frame.setLocationRelativeTo(null);
// 窗口关闭按钮的动作
// 参数:
// ---- EXIT_ON_CLOSE:关闭
// ---- DISPOSE_ON_CLOSE:关闭且释放资源
// ---- DO_NOTHING_ON_CLOSE:不做任何动作
// ---- HIDE_ON_COLSE:隐藏
frame.setDefaultCloseOperation(WindowConstants.<参数>);
// 限制 - 是否可以调整窗口大小
frame.setResizable(boolean);
// 背景颜色
frame.setBackground(<颜色>);
// 光标样式
frame.setCursor(new Cousor(<光标样式>));
// 添加组件到窗口
frame.add(<组件>);
// 窗口是否可见
frame.setVisible(boolean);
获取
JDialog提示对话框
// 实例化提示对话框对象
// owner:当前对话框的父窗口
// title:当前对话框的标题
// modal:当前对话框是否是模式对话框
JDialog dialog = new JDialog(<窗口对象>, "提示对话框", true);
颜色选择器界面
- 打开一个颜色选择器对话框界面。
文件选择器界面
- 打开一个选择文件的对话框界面。
// 实例化对象
JFileChooser chooser = new JFileChooser();
文件树界面
// 实例化对象
JTree tree = new JTree();
JFileDialog文件对话框
// 实例化文件对话框对象
JFileDialog fileDialog = new JFileDialog(frame, "选择文件对话框", FileDialog.LOAD);
JOptionPane小型对话框
JPanel面板
- 面板相当于是一个存放其他组件的组件,跟窗口一样也是一个容器。
- 面板与窗口的操作一样。
- 默认布局:流式布局
// 实例化 面板 对象
JPanel panel = new JPanel();
JScrollPane滚动条面板
// 实例化 滚动面板 对象
JScrollPane scrollPane = new JScrollPane();
JLabel标签
// 实例化标签`Label`对象
JLabel label = new JLabel(String text);
// 必须设定标签的位置和大小,否则会显示不出来。
图片
// 调整标签的层叠顺序
setComponentZOrder(<组件>,<数字>);
为面板添加背景图片
// 在面板中编写如下代码:
// 绘制背景图片的方法 - 重写
@Override
protected void paintComponent(Graphics g) {
// 加载背景图片的文件
Image image = new ImageIcon("resources/image/game_bg_0.png").getImage();
// 绘制背景图片到面板上
g.drawImage(image, 0, 0, this.getWidth(), this.getHeight(), null);
}
按钮
JButton按钮
// 实例化按钮`Button`对象
JButton button = new JButton();
JToggleButton开关按钮
- 开关按钮有两个状态,一个是开、另一个是关。
// 实例化开关按钮对象
JToggleButton button = new JToggleButton(String name);
// 设置开关按钮默认状态
button.setSelected(boolean bool);
JCheckBox勾选框
// 实例化勾选框`Checkbox`对象
JCheckBox checkBox = new JCheckBox();
// 勾选框里的内容
checkBox.setText(String text);
// 判断勾选框是否勾选,返回boolean
checkbox.getState();
CheckboxGroup勾选框组(单选)
// 实例化勾选框组(单选)`CheckboxGroup`对象
CheckboxGroup group = new CheckboxGroup();
// 将勾选框添加到勾选框组`group`对象中
<勾选框1>.setCheckboxGroup(group);
<勾选框2>.setCheckboxGroup(group);
// 获取组中选择的哪个框中的文本
group.setSelectedCheckbox().getLable();
JList列表
// 实例化列表对象
JList list = new JList();
// 在列表中添加元素
list.add(String text);
// 是否支持多选
list.setMultipleMode(boolean bool);
文本
文本框
// 实例化文本框`TextField`对象
TextField textField = new TextField();
// 指定输入的文本实际显示的符号
textField.setEchoChar(char t);
// 接收到文本框内输入的文本内容
String text = textField.getText();
文本域
// 实例化文本域`TextArea`对象
TextArea textArea = new TextArea();
// 限制行数
textArea.setRows(int rows);
// 限制列数
textArea.setColumns(int columns);
表格
JProgressBar进度条
// 创建进度条对象
JProgressBar bar = new JProgressBar();
// 设定进度条的最大值
bar.setMaximum(int n);
// 设定进度值
bar.setValue(int n);
JMenuBar菜单栏
// 实例化 "菜单栏" 对象
JMenuBar menuBer = new JMenuBar();
// 实例化 "菜单" 对象
JMenu menu = new JMenu(String label);
// 实例化 "菜单子对象" 对象
JMenuItem menuItem = new JMenuItem(String label);
// 为 "菜单子对象" 添加快捷键
menuItem.setAccelerator(KeyStroke.getKeyStroke(Char keyChar));
// 将 "菜单子对象" 添加到 "菜单" 中
menu.add(menuItem);
// 将 "菜单" 添加到 "菜单栏" 中
menuBer.add(menu);
// 将 "菜单栏" 添加到 "窗口" 中
<窗口容器>.setJMenuBar(menuBer);
布局
作用
- 自动放置组件的方式。
注意事项
- 窗口默认情况下会采用
BorderLayout作为布局,可以使用对象.setLayout(null)将布局清空。
// 添加布局,`null`表示不使用布局
<容器>.setLayout(null);
边界布局BorderLayout
- 该布局是容器组件的默认布局。
- 该布局将组件定义为五个区域:
WEST左边、EAST右边、NORTH上边、SOUTH下边、CENTER中间。 - 当向使用该布局的容器中添加组件时,若不指定区域,则默认添加到中间区域。
- 如果在某个位置重复添加组件,只有最后一个添加的组件可见。
- 若“上下左右”其中几个区域中没有组件时,中间区域会会延伸到没有组件的区域位置。
// 实例化 边界布局 对象
BorderLayout borderLayout = new BorderLayout();
// 修改布局的位置之间的横向间距
borderLayout.setHgap(50);
// 修改布局的位置之间的纵向间距
borderLayout.setVgap(50);
// 为组件添加布局的位置
/* - 支持的参数:
`BorderLayout.WEST` 左边
`BorderLayout.EAST` 右边
`BorderLayout.NORTH` 上边
`BorderLayout.SOUTH` 下边
`BorderLayout.CENTER` 中间
*/
<容器>.add(<组件>, BorderLayout.WEST);
流式布局FlowLayout
- 按顺序排列的布局。
// 实例化 流式布局 对象
FlowLayout flowLayout = new FlowLayout();
// 指定对齐方式
/* - 支持参数:
`FlowLayout.LEFT` 左对齐
`FlowLayout.CENTER` 中间对齐
`FlowLayout.RIGHT` 左对齐
`FlowLayout.LEADING`
`FlowLayout.TRAILING`
*/
flowLayout.setAlignment(<对齐方式>);
// 水平间距
flowLayout.setHgap(int hgap);
// 垂直间距
flowLayout.setVgap(int vgap);
网格布局GridLayout
- 该布局分割成纵横线分割的网格,每个网格所占的区域大小相同。
// 实例化 网格布局 对象
GridLayout gridLayout = new GridLayout();
// 排成几列
gridLayout.setColumns(int cols);
// 排成几行
gridLayout.setRows(int rows);
// 水平间距
gridLayout.setHgap(int hgap);
// 垂直间距
gridLayout.setVgap(int vgap);
网格包布局GridBagLayout
// 实例化 边界布局 对象
GridBagLayout gridBagLayout = new GridBagLayout();
// 待完善
卡片布局CardLayout
- 将加入容器的所有组件看成一叠组件(卡片),每次只展示最上面的一个组件(卡片)。
// 实例化 卡片布局 对象
CardLayout cardLayout = new CardLayout();
// 指定组件与容器的水平间距
gridLayout.setHgap(int hgap);
// 指定组件与容器的垂直间距
gridLayout.setVgap(int vgap);
// 显示第一张组件
cardLayout.first(<容器>);
// 显示最后一张组件
cardLayout.last(<容器>);
// 显示前一张组件
cardLayout.previous(<容器>);
// 显示后一张组件
cardLayout.next(<容器>);
// 显示指定名字的组件
cardLayout.show(<容器>, <组件>);
盒子布局BoxLayout
可以设置垂直和水平两个方向上摆放UI组件的容器。
可以添加垂直和水平方向上的分割组件。
包路径:
javax.swing.BoxLayout
布局容器格式
// 创建方案一
// 设置窗口或面板对象,未限制是水平方向还是垂直方向
BoxLayout boxLayout = new BoxLayout();
// 指定水平摆放
BoxLayout boxLayout = new BoxLayout(<容器>, BoxLayout.X_AXIS);
// 指定垂直摆放
BoxLayout boxLayout = new BoxLayout(<容器>, BoxLayout.Y_AXIS);
// 创建方案二
// 设置水平排列组件的Box容器
Box hBox = Box.createHorizontalBox();
// 设置垂直排列组件的Box容器
Box vBox = Box.createVerticalBox();
分割组件
// 创建`水平分割组件`,两个方向上都能拉伸。
hBox.add(Box.createHorizontalGlue());
// 创建指定宽度的`水平分割组件`,仅允许垂直方向上拉伸。
hBox.add(Box.createHorizontalStrut(int width));
// 创建`垂直分割组件`,两个方向上都能拉伸。
vBox.add(Box.createVerticalGlue());
// 创建指定高度的`垂直分割组件`,仅允许水平方向上拉伸。
vBox.add(Box.createVerticalStrut(int height));
事件监听器
- 监听器会监听窗口中发生的一些事件。
- 监听器分为:窗口、鼠标、键盘、、、、、、
- 编写事件监听器的实现类(可以编写内部类,减少文件数量)
// 事件监听器 - 内部类
// 与按钮绑定的事件监听器类
class MyEvent implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("点击了按钮");
}
}
- 实例化事件监听器对象
// 实例化 事件监听器 对象
MyEvent event = new MyEvent();
- 将事件监听器绑定到按钮组件上
// 事件监听器绑定按钮
loginButton.addActionListener(event);
总结
- 当点击按钮时,会执行事件监听器类中的代码
鼠标监听器
键盘监听器
动作监听器
- 一个监听器监听多个组件,仅支持(Button、菜单子项)
import java.awt.event.*;
// 菜单栏监听
public class MenuActionLis implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(e.getActionCommand());
switch (e.getActionCommand()) {
case "开始":
break;
default:
break;
}
}
}
// 实例化监听器
MenuActionLis menuActionLis = new MenuActionLis();
// 注册监视器
<监听对象组件>.addActionListener(menuActionLis);
// 设置动作指令
<监听对象组件>.setActionCommand("开始");
窗口监听器
WindowsListener
关闭窗口
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
// 关闭窗口对象
frame.dispose();
}
});