第8章 GUI(图形用户接口)
Swing 组件、容器与布局、事件处理——给程序做一个能点的界面。
本章学习目标
- 能创建窗口并添加按钮、文本框等组件
- 会用常见布局管理器排布组件
- 能给组件注册事件监听器并响应点击
- 能做一个简单的小工具界面
本章导览
核心内容
Swing概述
什么是AWT?
定义:在早期JDK1.0发布时,Sun公司就为GUI开发提供了一套基础类库,这套类库被称为AWT(Abstract Window Toolkit),即抽象窗口工具包。
目的:AWT的起初设想就是为了统一实现不同操作系统的图像界面。
缺陷:
不同操作系统图形库的功能可能不一样,在一个平台上存在的功能在另外一个平台上则可能不存在,为此AWT不得不通过牺牲功能来实现平台无关性。
AWT是一个重量级组件,使用麻烦,设计出的图形界面不够美观且功能有限。
什么是Swing?
定义:Swing是在原有的AWT的基础上进行了补充和改进,提供了更加丰富的组件和功能,来满足GUI设计的一切需求。
说明:
Swing是一种轻量级组件,它由Java语言开发,同时底层以AWT为基础。
同AWT相比,在实际开发中,更多的是使用Swing进行图形用户界面开发。
Swing组件为实现图形用户界面提供了很多基础类库,多数位于java.awt、javax.swing包及其子包下。
Swing组件继承关系:
Swing组件的所有类都继承自Container类,然后根据GUI开发的功能扩展了2个主要分支:容器分支(包括Window窗口和Panel面板)和组件分支。
容器分支就是为了实现图形用户界面窗口容器而设计的。
组件分支则是为了实现向容器中填充数据、元素以及人机交互组件等功能。
Swing组件类中,常用的顶级容器类包括有JApplet、JFrame和JDialog。
常用组件AbstractButton类及其子类是用来定义按钮常见行为的工具类。
JTextComponent类及其子类就是用来定义文本内容编辑区域的工具类。

📄 展开课件原文(第 11–14 页,共 4 页)
Swing顶级容器
说明:
在Swing组件中,最常见的一个容器就是JFrame。
JFrame是一个独立存在的顶级容器(也叫窗口),不能放置在其他容器之中。
JFrame支持通用窗口所有的基本功能,例如窗口最小化、设定窗口大小等。
示例:
private static void createAndShowGUI() {
// 创建并设置JFrame容器窗口
JFrame frame = new JFrame("JFrameTest");
// 设置关闭窗口时的默认操作
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(250, 150); // 设置窗口尺寸
frame.setVisible(true); // 展示JFrame容器窗口}
public static void main(String[] args) {
//使用SwingUtilities工具类调用createAndShowGUI()方法显示GUI程序
SwingUtilities.invokeLater(Example01::createAndShowGUI);结果:
示例通过JFrame类创建了一个窗体,并指定窗体对象标题为“JFrameTest”。
通过JFrame类的相关方法分别设置了窗体对象关闭时的操作、窗体尺寸大小以及窗体信息可见。
在main()方法中,使用了javax.swing包下中SwingUtilities(封装有一系列操作Swing的方法集合工具类)工具类的invokeLater()方法执行了GUI程序。
JDialog是Swing的另外一个顶级容器,通常用来表示对话框窗口。
JDialog对话框可分为两种:模态对话框和非模态对话框。
是指用户需要等到处理完对话框后才能继续与其他窗口交互。
模态对话框
是指允许用户在处理对话框的同时与其他窗口交互。
非模态对话框
VS
说明:对话框是模态或者非模态,可以在创建JDialog对象时为构造方法传入参数来设置,也可以在创建JDialog对象后调用它的setModal()方法来进行设置。
常用构造方法:
| 方法声明 | 功能描述 |
|---|---|
| JDialog(Frame owner) | 构造方法,用来创建一个非模态的对话框,owner为对话框所有者(顶级窗口JFrame) |
| JDialog(Frame owner,String title) | 构造方法,创建一个具有指定标题的非模态对话框 |
| JDialog(Frame owner,boolean modal) | 创建一个有指定模式的无标题对话框,默认值false(即非模态对话框) |
frame.setSize(350, 150);
frame.setVisible(true);
JDialog dialog = new JDialog(frame, "JDialog对话框",true);
dialog.setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE);
dialog.setSize(200, 100);
dialog.setVisible(true);
SwingUtilities.invokeLater(Example02::createAndShowGUI);虽然JFrame和JDialog都可以创建顶级容器窗口,但JDialog创建的窗口右上角没有放大和缩小功能。
由于创建JDialog容器对象时,设置的模态参数modal为true,所以在操作时,必须先关闭JDialog对话框后才可以与JFrame窗口进行交互。


📄 展开课件原文(第 15–21 页,共 7 页)
布局管理器
说明:Swing组件不能单独存在,必须放置于容器当中,而组件在容器中的位置和尺寸是由布局管理器来决定的。
分类:
GridBagLayout(网格包布局管理器)
5
GridLayout(网格布局管理器)
6
GroupLayout(分组布局管理器)
7
SpringLayout(弹性布局管理器)
8
BorderLayout(边界布局管理器)
1
BoxLayout(箱式布局管理器)
2
CardLayout(卡片布局管理器)
3
FlowLayout(流式布局管理器)
4
说明:
BorderLayout(边界布局管理器)是一种较为复杂的布局方式,它将容器划分为五个区域,分别是页头(PAGE_START)、页尾(PAGE_END)、行首(LINE_START)、行尾(LINE_END)、中部(CENTER)。
组件可以被放置在这五个区域中的任意一个位置。
官方布局效果图:
使用:
向BorderLayout布局管理器的容器中添加组件时,需要使用add(Component comp,Object constraints)方法。
参数comp表示要添加的组件,constraints指定将组件添加到布局中的位置,它是一个Object类型。
传参时可以使用BorderLayout类提供的5个常量设置组件位置,它们分别是PAGE_START、PAGE_END、LINE_START、LINE_END和CENTER。
BorderLayout的好处就是可以限定各区域的边界,当用户改变容器窗口大小时,各个组件的相对位置不变。
向BorderLayout的布局管理器添加组件时,如果不指定添加到哪个区域,则默认添加到CENTER区域。
每个区域只能放置一个组件,如果向一个区域中添加多个组件时,后放入的组件会覆盖先放入的组件。
案例演示(参考教材文件8-3)
小提示
在使用BorderLayout边界布局管理器过程中,当使用add(Component comp,Object constraints)方法向容器区域中添加指定组件和位置时,除了可以使用前面介绍的PAGE_START、PAGE_END、LINE_START、LINE_END和CENTER常量参数指定组件位置,也可以使用NORTH、SOUTH、EAST、WEST和CENTER常量参数来指定组件位置,只不过在文件8-3中使用的常量参数是JDK 1.4版本开始出现的,适合不同语言标准,也是官方相对推荐的。
FlowLayout(流式布局管理器)是最简单的布局管理器。
在这种布局下,容器会将组件按照添加顺序从左向右放置,当到达容器的边界时,会自动将组件放到下一行的开始位置。
这些组件可以按左对齐、居中对齐(默认方式)或右对齐的方式排列。
构造方法:
参数align决定组件在每行中相对于容器边界的对齐方式,分别为左对齐、右对齐、居中对齐。
对齐方式可以使用该类中提供的常量FlowLayout.LEFT、FlowLayout.RIGHT、FlowLayout.CENTER表示。
参数hgap和参数vgap分别设定组件之间的水平和垂直间距,可以填入一个任意数值。
| 方法声明 | 功能描述 |
|---|---|
| FlowLayout() | 组件默认居中对齐,水平、垂直间距默认为5个单位 |
| FlowLayout(int align) | 指定组件相对于容器的对齐方式,水平、垂直间距默认为5个单位 |
| FlowLayout(int align,int hgap,int vgap) | 指定组件的对齐方式和水平、垂直间距 |
效果:
案例演示(参考教材文件8-4)
GridLayout(网格布局管理器)使用纵横线将容器分成n行m列大小相等的网格,每个网格中可以添加一个组件。
添加到容器中的组件会从左向右、从上向下依次填充到网格中。
与FlowLayout不同的是,放置在GridLayout布局管理器中的组件将自动占据网格的整个区域
说明:参数rows代表行数,cols代表列数,hgap和vgap规定窗格之间水平和垂直方向的间距。
| 方法声明 | 功能描述 |
|---|---|
| GridLayout() | 默认只有一行,每个组件占一列 |
| GridLayout(int rows,int cols) | 指定容器的行数和列数 |
| GridLayout(int rows,int cols,int hgap,int vgap) | 指定容器的行数和列数以及组件之间的水平、垂直间距 |
案例演示(参考教材文件8-5)
特点:组件的相对位置不随区域的缩放而改变,但组件的大小会随之改变,组件始终占据网格的整个区域。
缺点:总是忽略组件的最佳大小,所有组件的宽高都相同。



📄 展开课件原文(第 22–32 页,共 11 页)
事件处理
定义:Swing组件中的事件处理专门用于响应用户的操作,例如,响应用户的单击鼠标、按下键盘等操作。
Swing事件处理涉及的三类对象:
事件源
(Event Source)
监听器
(Listener)
事件对象
(Event)
事件发生的场所,通常就是产生事件的组件,例如窗口、按钮、菜单等。
封装了GUI组件上发生的特定事件(通常就是用户的一次操作)。
负责监听事件源上发生的事件,并对各种事件做出相应处理的对象(对象中包含事件处理器)。
说明:事件源是一个组件,当用户进行一些操作时,如按下鼠标或者释放键盘等,都会触发相应的事件,如果事件源注册了监听器,则触发的相应事件将会被处理。
外部
动作
事件源(组件)
监听器(含处理器)
1、将监听器注册到事件源
2、触发事件源上的事件
3、产生并传递事件对象
4、接收事件对象,激活事件处理器,实现预定功能
效果:
案例演示(参考教材文件8-6)
1、创建事件源
2、自定义事件监听器
3、为事件源注册监听器
除了一些常见的按钮、键盘等组件可以作为事件源外,包括JFrame窗口在内的顶级容器也可以作为事件源;
根据要监听的事件源创建指定类型的监听器进行事件处理,该监听器是一个特殊的Java类,必须实现XxxListener接口(根据组件触发的动作进行区分,如WindowListener用于监听窗口事件,ActionListener用于监听动作事件);
使用addXxxListener()方法为指定事件源添加特定类型的监听器。当事件源上发生监听的事件后,就会触发绑定的事件监听器,然后由监听器中的方法进行相应处理。
鼠标事件(MouseEvent)
2
键盘事件(KeyEvent)
3
动作事件(ActionEvent)
4
窗体事件(WindowEvent)
1
主要事件分类
说明:
对窗体进行操作时,例如窗体的打开、关闭、激活、停用等,这些动作都属于窗体事件。
Java中提供了一个WindowEvent类用于表示窗体事件。
使用:
首先需要定义一个实现了WindowListener接口的类作为窗体监听器;
然后通过addWindowListener()方法将窗体对象与窗体监听器进行绑定。
窗体事件
案例演示(参考教材文件8-7)
分别执行最小化、单击任务栏图标、单击关闭按钮时
用户会经常使用鼠标来进行选择、切换界面等操作,这些操作被定义为鼠标事件,其中包括鼠标按下、鼠标松开、鼠标单击等。
Java中提供了一个MouseEvent类用于表示鼠标事件。
几乎所有的组件都可以产生鼠标事件。
首先需要通过实现MouseListener接口定义监听器(也可以通过继承适配器MouseAdapter类来实现);
然后调用addMouseListener()方法将监听器绑定到事件源对象。
鼠标事件
案例演示(参考教材文件8-8)
先把鼠标移进按钮区域,接着单击按钮然后释放,再移出按钮区域
说明:MouseEvent类中定义了很多常量来识别鼠标动作。
MouseEvent.BUTTON1:用来判定鼠标左击事件;
MouseEvent.BUTTON3:用来判定鼠标右击事件;
MouseEvent.BUTTON2:用来判定鼠标滚轮点击事件;
键盘操作也是最常用的用户交互方式,例如键盘按下、释放等,这些操作被定义为键盘事件。
Java中提供了一个KeyEvent类表示键盘事件。
处理键盘事件的监听器对象需要实现KeyListener接口或者继承KeyAdapter类;
然后调用addKeyListener()方法将监听器绑定到事件源对象。
键盘事件
案例演示(参考教材文件8-9)
在窗口中,依次输入键盘上的a、s、1字符
动作事件与前面三种事件有所不同,它不代表某类事件,只是表示一个动作发生了。
例如,在关闭一个文件时,可以通过键盘关闭,也可以通过鼠标关闭。
在Java中,动作事件用ActionEvent类表示。
使用:处理动作事件的监听器对象需要实现ActionListener接口。
动作事件




📄 展开课件原文(第 33–45 页,共 13 页)
Swing常用组件
说明:Swing组件中供了一些面板组件(中间容器),这些面板组件不能单独存在,只能放置在顶级窗口容器中。
常见组件:
JPanel
JScrollPane
JPanel面板组件是一个无边框,不能被移动、放大、缩小或者关闭的面板,它的默认布局管理器是FlowLayout。
JScrollPane是一个带有滚动条的面板容器,且只能添加一个组件;
想向JScrollPane面板中添加多个组件,应先将这多个组件添加到某个组件中,然后再将这个组件添加到JScrollPane中。
说明:第三个构造方法,是在第二个构造方法的基础上指定滚动条策略。如果在构造方法中没用指定显示组件和滚动条策略,也可以使用JScrollPane提供的方法进行设置。
| 方法声明 | 功能描述 |
|---|---|
| JScrollPane() | 创建一个空的JScrollPane面板 |
| JScrollPane(Component view) | 创建一个显示指定组件的JScrollPane面板,只要组件的内容超过视图大小就会显示水平和垂直滚动条 |
| JScrollPane(Component view, int vsbPolicy,int hsbPolicy) | 创建一个显示指定容器、并具有指定滚动条策略的JScrollPane。参数vsbPolicy和hsbPolicy分别表示垂直滚动条策略和水平滚动条策略 |
说明:
上述表格方法是JScrollPane滚动面板组件对象提供的设置滚动策略的方法。
滚动策略方法取值可以使用ScrollPaneConstants接口中声明了多个常量属性来进行设置。
| 方法声明 | 功能描述 |
|---|---|
| void setHorizontalBarPolicy(int policy) | 指定水平滚动条策略,即水平滚动条何时显示在滚动面板上 |
| void setVerticalBarPolicy(int policy) | 指定垂直滚动条策略,即垂直滚动条何时显示在滚动面板上 |
| void setViewportView(Component view) | 设置在滚动面板显示的组件 |
| 常量属性 | 功能描述 |
|---|---|
| VERTICAL_SCROLLBAR_AS_NEEDED HORIZONTAL_SCROLLBAR_AS_NEEDED | 当填充的组件视图超过客户端窗口大小时,自动显示水平和竖直放行滚动条(JscrollPane组件的默认值) |
| VERTICAL_SCROLLBAR_ALWAYS HORIZONTAL_SCROLLBAR_ALWAYS | 无论填充的组件视图大小,始终显示水平和竖直放行滚动条 |
| VERTICAL_SCROLLBAR_NEVER HORIZONTAL_SCROLLBAR_NEVER | 无论填充的组件视图大小,始终不显示水平和竖直放行滚动条 |
效果:
案例演示(参考教材文件8-10)
定义:文本组件用于接收用户输入的信息,包括文本框(JTextField)、文本域(JTextArea)等。
说明:它们都有一个共同父类JTextComponent,JTextComponent是一个抽象类。
常用方法:
| 方法声明 | 功能描述 |
|---|---|
| String String getText() | 返回文本组件中所有的文本内容 |
| String getSelectedText() | 返回文本组件中选定的文本内容 |
| void selectAll() | 在文本组件中选中所有内容 |
| void setEditable() | 设置文本组件为可编辑或者不可编辑状态 |
| void setText(String text) | 设置文本组件的内容 |
| void replaceSelection(String content) | 用给定的内容替换当前选定的内容 |
定义:JTextField称为文本框,它只能接收单行文本的输入。
常用构造方法:
| 方法声明 | 功能描述 |
|---|---|
| JTextField() | 创建一个空的文本框,初始字符串为null |
| JTextFiled(int columns) | 创建一个具有指定列数的文本框,初始字符串为null |
| JTextField(String text) | 创建一个显示指定初始字符串的文本框 |
| JTextField(String text,int column) | 创建一个具有指定列数、并显示指定初始字符串的文本框 |
JTextField有一个子类JPasswordField,表示一个单行输入密码框。
在此框中是通过显示指定的回显字符作为占位符。
新创建的密码框默认的回显字符为“*”。
定义:JTextArea称为文本域,它能接收多行文本的输入,使用JTextArea构造方法创建对象时可以设定区域的行数、列数。
| 方法声明 | 功能描述 |
|---|---|
| JTextArea() | 构造方法,创建一个空的文本域 |
| JTextArea(String text) | 构造方法,创建显示指定初始字符串的文本域 |
| JTextArea(int rows,int columns) | 构造方法,创建具有指定行和列的空的文本域 |
| JTextArea(String text,int rows,int columns) | 构造方法,创建显示指定初始文本并指定了行列的文本域 |
案例演示(参考教材文件8-11)
在聊天窗口中输入聊天信息,并单击【发送】按钮
定义:Swing中提供了用于仅供展示的标签组件。
说明:标签组件主要用到的是JLabel,JLabel组件可以显示文本、图像,还可以设置标签内容的垂直和水平对齐方式。
构造方法:
| 方法声明 | 功能描述 |
|---|---|
| JLabel() | 创建无图像并且其标题为空字符串的JLabel |
| JLabel(Icon image) | 创建具有指定图像的JLabel实例 |
| JLabel(Icon image, int horizontalAlignment) | 创建具有指定图像和水平对齐方式的JLabel实例 |
| JLabel(String text) | 创建具有指定文本的JLabel实例 |
| JLabel(String text, Icon icon, int horizontalAlignment) | 创建具有指定文本、图像和水平对齐方式的 JLabel 实例 |
| JLabel(String text, int horizontalAlignment) | 创建具有指定文本和水平对齐方式的 JLabel 实例 |
案例演示(参考教材文件8-12)
说明:在Swing中常见的按钮组件有JButton、JCheckBox、JRadioButton等,它们都是抽象类AbstractButton类的直接或间接子类。
AbstractButton常用方法:
| 方法声明 | 功能描述 |
|---|---|
| Icon getIcon() | 获取按钮的图标 |
| void setIcon(Icon icon) | 设置按钮的图标 |
| String getText() | 获取按钮的文本 |
| void setText(String text) | 设置按钮的文本 |
| void setEnable(boolean b) | 设置按钮是否可用 |
| boolean setSelected(boolean b) | 设置按钮是否为选中状态 |
| boolean isSelected() | 返回按钮的状态(true为选中,反之为未选中) |
说明:JCheckBox组件被称为复选框组件,它有选中和未选中两种状态,通常复选框会有多个,用户可以选中其中一个或者多个。
| 方法声明 | 功能描述 |
|---|---|
| JCheckBox() | 创建一个没有文本信息,初始状态未被选中的复选框 |
| JCheckBox(String text) | 创建一个带有文本信息,初始状态未被选定的复选框 |
| JCheckBox(String text,boolean selected) | 创建一个带有文本信息,并指定初始状态(选中/未选中)的复选框 |
说明:除了上述构造方法,还可以调用从父类继承的setText(String text)来设置复选框文本信息,调用setSelected(boolean b)方法来设置复选框状态(是否被选中),也可以调用isSelected()方法来判断复选框是否被选中。。
案例演示(参考教材文件8-13)
未勾选
勾选一个
勾选两个
说明:JRadioButton组件被称为单选按钮组件,单选按钮只能选中一个。
使用:
要JRadioButton按钮之间的互斥,需要使用ButtonGroup类。
ButtonGroup是一个不可见的单选按钮组。将多个JRadioButton按钮添加到同一个单选按钮组中就能实现JRadioButton按钮的单选功能。
| 方法声明 | 功能描述 |
|---|---|
| JRadioButton () | 创建一个没有文本信息、初始状态未被选中的单选框 |
| JRadioButton (String text) | 创建一个带有文本信息、初始状态未被选定的单选框 |
| JRadioButton (String text,boolean selected) | 创建一个具有文本信息,并指定初始状态(选中/未选中)的单选框。 |
案例演示(参考教材文件8-14)
勾选第一个
勾选第二个
定义:
JComboBox组件被称为下拉框或者组合框,它将所有选项折叠在一起,默认显示的是第一个添加的选项。
当用户单击下拉框时,会出现下拉式的选择列表,用户可以从中选择其中一项并显示。
JComboBox下拉框组件分为可编辑和不可编辑两种形式。
对于不可编辑的下拉框,用户只能选择现有的选项列表。
对于可编辑的下拉框,用户既可以选择现有的选项列表,也可以自己输入新的内容。
注意:自己输入的内容只能作为当前项显示,并不会添加到下拉框的选项列表中。
| 方法声明 | 功能描述 |
|---|---|
| JComboBox() | 创建一个没有可选项的下拉框 |
| JComboBox(Object[] items) | 创建一个下拉框,将Object数组中的元素作为下拉框的下拉列表选项 |
| JComboBox(Vector items) | 创建一个下拉框,将Vector集合中的元素作为下拉框的下拉列表选项 |
JComboBox常用构造方法:
JComboBox常用方法:
| 方法声明 | 功能描述 |
|---|---|
| void addItem(Object anObject) | 为下拉框添加选项 |
| void insertItemAt(Object anObject,int index) | 在指定的索引处插入选项 |
| Objct getItemAt(int index) | 返回指定索引处选项,第一个选项的索引为0 |
| int getItemCount() | 返回下拉框中选项的数目 |
| Object getSelectedItem() | 返回当前所选项 |
| void removeAllItems() | 删除下拉框中所有的选项 |
| void removeItem(Object object) | 从下拉框中删除指定选项 |
| void removeItemAt(int index) | 移除指定索引处的选项 |
| void setEditable(boolean aFlag) | 设置下拉框的选项是否可编辑,aFlag为true则可编辑,反之则不可编辑 |
案例演示(参考教材文件8-15)
在下拉框中选中某个选项
计算机中很多文件的菜单都是下拉式的,如记事本的菜单。
在Swing中,创建下拉式菜单需要使用三个组件:JMenuBar(菜单栏)、JMenu(菜单)和JMenuItem(菜单项)。
图示(以记事本为例):
JMenuBar表示一个水平的菜单栏,它用来管理一组菜单,不参与同用户的交互式操作。
菜单栏可以放在容器的任何位置,但通常情况下会使用顶级容器(如JFrame、Jdialog)的setJMenuBar()方法将它放置在顶级容器的顶部。
创建菜单栏时,只需要使用new关键字创建JMenubar对象即可。
创建完菜单栏对象后,可以调用它的add(JMenu c)方法为其添加JMenu菜单。
JMenuBar(菜单栏)
JMenu表示一个菜单,它用来整合管理菜单项。
菜单可以是单一层次的结构,也可以是多层次的结构。
大多情况下,会使用JMenu(String text)构造函数创建JMenu菜单,参数text表示菜单上的文本内容。
JMenu(菜单)
JMenu(菜单)——常用方法
| 方法声明 | 功能描述 |
|---|---|
| JMenuItem add(JMenuItem menuItem) | 将菜单项添加到菜单末尾,返回此菜单项 |
| void addSeparator() | 将分隔符添加到菜单的末尾 |
| JMenuItem getItem(int pos) | 返回指定索引处的菜单项,第一个菜单项的索引为0 |
| int getItemCount() | 返回菜单上的项数,菜单项和分隔符都计算在内 |
| JMenuItem insert(JmenuItem menuItem,int pos) | 在指定索引处插入菜单项 |
| void insertSeparator(int pos) | 在指定索引处插入分隔符 |
| void remove(int pos) | 从菜单中移除指定索引处的菜单项 |
| void remove(JMenuItem menuItem) | 从菜单中移除指定的菜单项 |
| void removeAll() | 从菜单中移除所有的菜单项 |
JMenuItem表示一个菜单项,它是菜单系统中最基本的组件。
通常会使用JMenumItem(String text)这个构造方法为菜单项指定文本内容。
JMenuItem继承自AbstractButton类,因此可以把它看成是一个按钮。
如果使用无参的构造方法创建了一个菜单项,则可以调用从AbstractButton类中继承的setText(String text)方法和setIcon()方法为其设置文本和图标。
JMenuItem(菜单项)
案例演示(参考教材文件8-16)
例如在Windows桌面单击鼠标右键会出现一个菜单,这就是弹出式菜单。
在Swing组件中,弹出式菜单可以用JPopupMenu来实现。
JPopupMenu弹出式菜单同样通过调用add()方法添加JMenuItem菜单项,但它默认是不可见的。
想要显示弹出式菜单,必须调用show(Component invoker,int x,int y)方法。参数invoker表示JPopupMenu菜单显示位置的参考组件,x和y表示invoker组件坐标空间中的一个坐标,显示的是JPopupMenu菜单的左上角坐标。
案例演示(参考教材文件8-17)




📄 展开课件原文(第 46–74 页,共 29 页)
Swing组件的整合使用
任务案例
案例代码
接下来,通过一个模拟QQ登录的案例来熟悉Swing的综合使用。请查看教材8.6小节。
📄 展开课件原文(第 75–75 页,共 1 页)
JavaFX图形用户界面工具
什么是JavaFX?
定义:JavaFX同Swing一样,都用于处理图形用户界面。
说明:
JavaFX是一个强大的图形和多媒体处理工具包集合。
它允许开发者来设计、创建、测试、调试和部署富客户端程序(Rich Client Applications)。
JavaFX和Java一样具有跨平台特性。
1
2
3
JavaFX 1.0:使用JavaFX Script的静态、声明式的编程语言来开发JavaFX应用程序。
JavaFX 2.0:之后的版本摒弃了JavaFX Script语言,而是作为一个Java API来使用。同时该版本包含非常丰富的UI控件、图形和多媒体特性用于简化可视化应用的开发。
JavaFX 8:从JDK 7u6开始,JavaFX就与JDK捆绑使用,并结合JDK 8的新增特性,直接将其新版本定为JavaFX 8。JavaFX 8版本进一步增加了多种功能,如动画、3D效果等。
JavaFX 8
主要特性
支持Java API直接调用
提供WebView组件,实现Web页面嵌入
支持与Swing互操作
内嵌UI控件和CSS样式
支持3D图形处理能力
可以使用FXML和Scene Builder设计图形用户界面
从JDK 7u6才开始包含JavaFX类库,并且最新比较稳定的JavaFX完全结合了JDK 8的特性。
要运行JavaFX应用程序,建议在系统中安装JDK 8或更高版本,否则,使用低版本的JDK还需要额外导入jfxrt.jar等包。
IDE(如Eclipse、NetBeans、IntelliJ IDEA)也为JavaFX提供了支持,在使用这些IDE工具进行JavaFX开发时,需要进行相应配置。
在使用Eclipse进行JavaFX开发时,除了所依赖的JDK 8,还需要用到一个名为e(fx)clipse的插件,该插件是JavaFX开发所需的工具库。
8.7.2 JavaFX开发环境配置——Eclipse中安装配置e(fx)clipse插件
(1)打开Eclipse工具,选中并打开“Help”菜单栏下拉列表中的“Install New Software…”选项,如图所示。
(2)在打开的弹窗中,单击【Add...】按钮,在新出现的“Add Repository”窗口中,分别输入需要安装的插件名称和地址,然后单击【OK】按钮,如图所示。
【注意】
图中在Eclipse 4.6版本上安装e(fx)clipse插件,e(fx)clipse插件链接地址版本为2.4.0,必须与Eclipse版本匹配,否则安装过程中可能会出现所需版本软件不存在的错误。
(3)添加完e(fx)clipse插件的配置信息后,在“Install”窗口中选中出现的两个复选框选项,如图所示。
接着依次单击【Next】按钮,直到弹出“Review Licenses”窗口界面,在该界面中选中“I accept the terms of the license agreement”选项,单击【Finish】按钮即可进入插件安装状态,安装完成后根据提示重启Eclipse即可。
(4)重启Eclipse后,依次选择“File”->“New”->“Ohter...”会出现“Select a wizard”弹窗,展示JavaFX插件信息,说明e(fx)clipse插件安装成功,如图所示。
(1)创建JavaFX项目。打开Eclipse,并在Eclipse中依次选择“File”->“New”->“Others..”->“JavaFX Project”选项,创建一个名称为“javaFX”的项目,项目创建成功后,如图所示。
JavaFX项目默认创建的程序的入口文件,
内部初始化了一个空白图形界面
JavaFX项目默认创建的CSS样式文件
(2)编辑Main.java文件。
public class Main extends Application {
public void start(Stage stage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("fxml_example.fxml"));
Scene scene = new Scene(root, 300, 275);
stage.setTitle("FXML Welcome");
stage.setScene(scene);
stage.show(); // 将图形界面窗口设置为可见}
public static void main(String[] args) {launch(args); // 通过Application抽象类的launch()方法启动程序
(3)创建fxml_example.fxml文件。在Main.java文件同级目录下依次选择“File”->“New”->“Others..”->“New FXML Document”选项,创建一个名称为“fxml_example”的fxml格式文件(详见教材文件8-22所示)。
<?xml version="1.0" encoding="UTF-8"?>
<!-- 引入JavaFX工具相关类 -->
<?import java.net.*?>
...
<!-- 创建一个GridPane网格式面板组件 -->
<GridPane fx:controller="application.FXMLExampleController"
xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10">
</GridPane>
(4)创建并编辑FXMLExampleController.java文件。在Main.java文件同级目录下创建一个名为FXMLExampleController的事件处理类,并编写事件处理方法。
public class FXMLExampleController {
// 与fxml_example.fxml文件中的登录提示框fx:id一致
@FXML private Text actiontarget;
// 为fxml_example.fxml文件中的登录按钮编写事件处理
@FXML protected void handleSubmitButtonAction(ActionEvent event) {
actiontarget.setText("点击了登录按钮");(4)完成上述4步操作后,运行主程序Main类,结果如图所示。
(5)为fxml_example.fxml图形布局文件引入外联的CSS样式文件(详见教材8.7.3小节第5步)。
(6)编辑application.css样式文件。打开application.css样式文件,为图8-37所示的JavaFX图形用户接口项目编写CSS样式(详见教材文件8-24)。
(6)当编写完并引入application.css样式文件成功后,再次启动主程序入口Main类中的main()方法,结果如图所示。
JavaFX Scene Builder是什么?
说明:JavaFX Scene Builder是一种可视布局管理工具,允许用户快速设计JavaFX应用程序用户界面,而无需编码。
使用:
用户可以将UI组件拖放到工作区,修改其属性、应用样式表。
创建的布局会在后台自动生成一个结果为FXML格式的文件。
想在Eclipse中使用JavaFX Scene Builder工具,就必须先进行配置,在配置之前要先保证Eclipse安装了e(fx)clipse插件。
8.7.4 JavaFX可视化管理工具——JavaFX Scene Builder工具的下载与安装
(1)下载JavaFX Scene Builder。进入http://www.oracle.com/technetwork/java/javase/downloads/javafxscenebuilder-1x-archive-2199384.html下载页面,选择对应平台的版本进行下载,这里以JavaFX Scene Builder2版本为例,如图所示。
(2)安装JavaFX Scene Builder。下载完成后,会得到一个javafx_scenebuilder-2_0-windows.msi安装文件,直接双击文件进行安装,安装过程中可以通过【更改(C)...】按钮来更改安装目录,如图所示。
(3)在Eclipse中配置JavaFX Scene Builder。在Eclipse中,打开Window菜单下的“Preferences”选项窗口,找到JavaFX的配置位置,在右侧窗口中通过【Browse...】按钮配置安装的JavaFX Scene Builder工具位置,最后单击【OK】按钮即可,如图所示。
8.7.4 JavaFX可视化管理工具——JavaFX Scene Builder工具的基本使用
(1)创建test.fxml文件。在javaFX项目的application目录下创建一个名为test.fxml的fxml格式文件,鼠标右键选中并使用“Open with SceneBuilder”选项打开,结果如图所示。
(2)先用鼠标选中中间区域的AnchorPane面板组件(打开fxml文件时默认的面板组件),将该组件拉伸至合适大小,接着在左上角区域选择Lable组件拖拽至AnchorPane面板组件内,并在右边组件属性设置区域对该Lable组件进行简单设置,结果如图所示。
(2)接着,可以参考上述方式再次添加其他组件,如输入框、密码、登录按钮等,结果如图所示。
说明:完成需求组件的设计后,可以直接保存并关闭该窗口,此时通过可视化工具设计的布局文件代码会在自动生成到test.fxml文件中。
(3)为了验证JavaFX Scene Builder工具的设计效果,可以对文件8-21所示的Main.java文件中第8~9行代码进行修改,引入test.fxml布局文件。
Parent root = FXMLLoader.load(getClass().getResource("test.fxml"));(3)然后,再次启动主程序入口Main类,结果如图所示。




📄 展开课件原文(第 76–99 页,共 24 页)
本章小结
GUI是本教材中相对独立的一章内容,本章主要针对Java中比较流行的两种GUI图形用户工具分两部分进行阐述,向初学者讲解了GUI的一些基本原理、开发技巧和思想。第一部分,主要讲解了Swing图形用户工具的组件架构、顶级容器、布局管理器、事件处理以及一些常用的组件,并通过一个模拟QQ登录界面设计的案例进行了整合使用;第二部分,主要讲解了JavaFX图形用户工具的基本概念、开发环境配置、使用入门等。
📄 展开课件原文(第 100–101 页,共 2 页)
课件里的提醒 课件原文中的“注意 / 说明 / 定义”
- 定义:在早期JDK1.0发布时,Sun公司就为GUI开发提供了一套基础类库,这套类库被称为AWT(Abstract Window Toolkit),即抽象窗口工具包。
- 定义:Swing是在原有的AWT的基础上进行了补充和改进,提供了更加丰富的组件和功能,来满足GUI设计的一切需求。
- 说明:对话框是模态或者非模态,可以在创建JDialog对象时为构造方法传入参数来设置,也可以在创建JDialog对象后调用它的setModal()方法来进行设置。
- 说明:Swing组件不能单独存在,必须放置于容器当中,而组件在容器中的位置和尺寸是由布局管理器来决定的。
- 说明:参数rows代表行数,cols代表列数,hgap和vgap规定窗格之间水平和垂直方向的间距。
- 定义:Swing组件中的事件处理专门用于响应用户的操作,例如,响应用户的单击鼠标、按下键盘等操作。
- 说明:事件源是一个组件,当用户进行一些操作时,如按下鼠标或者释放键盘等,都会触发相应的事件,如果事件源注册了监听器,则触发的相应事件将会被处理。
- 说明:MouseEvent类中定义了很多常量来识别鼠标动作。
- 例如,在关闭一个文件时,可以通过键盘关闭,也可以通过鼠标关闭。
- 说明:Swing组件中供了一些面板组件(中间容器),这些面板组件不能单独存在,只能放置在顶级窗口容器中。
- 说明:第三个构造方法,是在第二个构造方法的基础上指定滚动条策略。如果在构造方法中没用指定显示组件和滚动条策略,也可以使用JScrollPane提供的方法进行设置。
- 定义:文本组件用于接收用户输入的信息,包括文本框(JTextField)、文本域(JTextArea)等。
本章代码速览 把课件里的示例代码集中起来,可直接复制运行
private static void createAndShowGUI() {// 创建并设置JFrame容器窗口JFrame frame = new JFrame("JFrameTest");// 设置关闭窗口时的默认操作frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setSize(250, 150); // 设置窗口尺寸frame.setVisible(true); // 展示JFrame容器窗口public static void main(String[] args) {//使用SwingUtilities工具类调用createAndShowGUI()方法显示GUI程序SwingUtilities.invokeLater(Example01::createAndShowGUI);frame.setSize(350, 150);frame.setVisible(true);