Java图形用户接口
1.Swing概述
Swing
是在原有的AWT的基础上进行了补充和改进,提供了更加丰富的组件和功能,来满足GUI
设计的一切需求
2.Swing顶级容器
2.1.Jframe
2.1.1.概述
JFrame
是一个独立存在的顶级容器(也叫窗口),不能放置在其他容器之中JFrame
支持通用窗口所有的基本功能,例如窗口最小化、设定窗口大小等
2.1.2.示例
1 | class Test { |
2.2.JDialog
2.2.1.概述
JDialog
是Swing
的另外一个顶级容器,通常用来表示对话框窗口JDialog
对话框可分为两种:模态对话框和非模态对话框- 模态对话框是指用户需要等到处理完对话框后才能继续与其他窗口交互
- 非模态对话框是指允许用户在处理对话框的同时与其他窗口交互
2.2.2.构造方法
方法声明 | 功能描述 |
---|---|
JDialog(Frame owner) | 创建一个非模态的对话框,owner为对话框所有者(顶级窗口JFrame) |
JDialog(Frame owner, String title) | 创建一个具有指定标题的非模态对话框 |
JDialog(Frame owner, boolean modal) | 创建一个有指定模式的无标题对话框,默认值false(即非模态对话框) |
JDialog(Frame owner, String title, boolean modal) | 创建一个具有指定标题和模态的对话框 |
2.2.3.示例
1 | class Test { |
3.布局管理器
3.1.BorderLayout
3.1.1.概述
BorderLayout
(边界布局管理器)是一种较为复杂的布局方式,它将容器划分为五个区域,分别是页头(PAGE_START
)、页尾(PAGE_END)、行首(LINE_START
)、行尾(LINE_END
)、中部(CENTER
)
3.1.2.使用
- 向
BorderLayout
布局管理器的容器中添加组件时,需要使用add(Component comp, Object constraints)
方法 - 参数
comp
表示要添加的组件,constraints
指定将组件添加到布局中的位置,它是一个Object
类型 - 传参时可以使用
BorderLayout
类提供的5个常量设置组件位置,它们分别是PAGE_START
、PAGE_END
、LINE_START
、LINE_END
和CENTER
3.1.3.示例
1 | class Test { |
3.1.4.注意
BorderLayout
的好处就是可以限定各区域的边界,当用户改变容器窗口大小时,各个组件的相对位置不变- 向
BorderLayout
的布局管理器添加组件时,如果不指定添加到哪个区域,则默认添加到CENTER
区域 - 每个区域只能放置一个组件,如果向一个区域中添加多个组件时,后放入的组件会覆盖先放入的组件
3.2.FlowLayout
3.2.1.概述
FlowLayout
(流式布局管理器)是最简单的布局管理器- 在这种布局下,容器会将组件按照添加顺序从左向右放置,当到达容器的边界时,会自动将组件放到下一行的开始位置
- 这些组件可以按左对齐、居中对齐(默认方式)或右对齐的方式排列
3.2.2.构造方法
方法声明 | 功能描述 |
---|---|
FlowLayout() | 组件默认居中对齐,水平、垂直间距默认为5个单位 |
FlowLayout(int align) | 指定组件相对于容器的对齐方式,水平、垂直间距默认为5个单位 |
FlowLayout(int align, int hgap, int vgap) | 指定组件的对齐方式和水平、垂直间距 |
- 对齐方式可以使用该类中提供的常量
FlowLayout.LEFT
、FlowLayout.RIGHT
、FlowLayout.CENTER
3.2.3.示例
1 | class Test { |
3.3.GridLayout
3.3.1概述
GridLayout
(网格布局管理器)使用纵横线将容器分成n行m列大小相等的网格,每个网格中可以添加一个组件- 添加到容器中的组件会从左向右、从上向下依次填充到网格中
- 与
FlowLayout
不同的是,放置在GridLayout
布局管理器中的组件将自动占据网格的整个区域
3.3.2.构造方法
方法声明 | 功能描述 |
---|---|
GridLayout() | 默认只有一行,每个组件占一列 |
GridLayout(int rows,int cols) | 指定容器的行数和列数 |
GridLayout(int rows,int cols,int hgap,int vgap) | 指定容器的行数和列数以及组件之间的水平、垂直间距 |
3.3.3.示例
1 | class Test { |
4.事件处理
4.1.事件处理机制
4.1.1.事件处理涉及的三类对象
- 事件源(Event Source): 事件发生的场所,通常就是产生事件的组件,例如窗口、按钮、菜单等
- 事件对象(Event): 封装了GUI组件上发生的特定事件(通常就是用户的一次操作)
- 监听器(Listener): 负责监听事件源上发生的事件,并对各种事件做出相应处理的对象(对象中包含事件处理器)
4.1.2.事件处理流程
4.1.3.事件处理步骤
- 创建事件源
- 除了一些常见的按钮、键盘等组件可以作为事件源外,包括JFrame窗口在内的顶级容器也可以作为事件源
- 自定义事件监听器
- 根据要监听的事件源创建指定类型的监听器进行事件处理,该监听器是一个特殊的
Java
类,必须实现XxxListener
接口(根据组件触发的动作进行区分,如WindowListener
用于监听窗口事件,ActionListener
用于监听动作事件)
- 根据要监听的事件源创建指定类型的监听器进行事件处理,该监听器是一个特殊的
- 为事件源注册监听器
- 使用
addXxxListener()
方法为指定事件源添加特定类型的监听器。当事件源上发生监听的事件后,就会触发绑定的事件监听器,然后由监听器中的方法进行相应处理
- 使用
4.2.Swing常用事件处理
4.2.1.窗体事件(WindowEvent)
WindowEvent
是一个接口WindowAdapter
是一个抽象类(不需要实现全部方法)
1 | class Test { |
4.2.2.鼠标事件(MouseEvent)
MouseEvent
是一个接口MouseAdapter
是一个抽象类(不需要实现全部方法)
1 | class Test { |
MouseEvent
类中定义了很多常量来识别鼠标动作MouseEvent.BUTTON1:
用来判定鼠标左击事件MouseEvent.BUTTON3:
用来判定鼠标右击事件MouseEvent.BUTTON2:
用来判定鼠标滚轮点击事件
4.2.3.键盘事件(KeyEvent)
KeyEvent
是一个接口KeyAdapter
是一个抽象类(不需要实现全部方法)
1 | class Test { |
4.2.4.动作事件(ActionEvent)
ActionEvent
是一个接口ActionAdapter
是一个抽象类(不需要实现全部方法)
1 | class Test { |
5.Swing常用组件
5.1.面板组件
5.1.1.JPanel
JPanel
面板组件是一个无边框,不能被移动、放大、缩小或者关闭的面板,它的默认布局管理器是FlowLayout
5.1.2.JScrollPane
5.1.2.1.概述
JScrollPane
是一个带有滚动条的面板容器,且只能添加一个组件- 想向
JScrollPane
面板中添加多个组件,应先将这多个组件添加到某个组件中,然后再将这个组件添加到JScrollPane
中
5.1.2.2.构造方法
方法声明 | 功能描述 |
---|---|
JScrollPane() | 创建一个空的JScrollPane面板 |
JScrollPane(Component view) | 创建一个显示指定组件的JScrollPane面板,只要组件的内容超过视图大小就会显示水平和垂直滚动条 |
JScrollPane(Component view, int vsbPolicy,int hsbPolicy) | 创建一个显示指定容器、并具有指定滚动条策略的JScrollPane。参数vsbPolicy和hsbPolicy分别表示垂直滚动条策略和水平滚动条策略 |
5.1.2.3.设置面板滚动策略的方法
方法声明 | 功能描述 |
---|---|
void setHorizontalBarPolicy(int policy) | 指定水平滚动条策略,即水平滚动条何时显示在滚动面板上 |
void setVerticalBarPolicy(int policy) | 指定垂直滚动条策略,即垂直滚动条何时显示在滚动面板上 |
void setViewportView(Component view) | 设置在滚动面板显示的组件 |
- 滚动策略方法取值可以使用
ScrollPaneConstants
接口中声明了多个常量属性来进行设置
5.1.2.4.滚动策略常量值
常量属性 | 功能描述 |
---|---|
VERTICAL_SCROLLBAR_AS_NEEDED HORIZONTAL_SCROLLBAR_AS_NEEDED | 当填充的组件视图超过客户端窗口大小时,自动显示水平和竖直放行滚动条(JscrollPane组件的默认值) |
VERTICAL_SCROLLBAR_ALWAYS HORIZONTAL_SCROLLBAR_ALWAYS | 无论填充的组件视图大小,始终显示水平和竖直放行滚动条 |
VERTICAL_SCROLLBAR_NEVER HORIZONTAL_SCROLLBAR_NEVER | 无论填充的组件视图大小,始终不显示水平和竖直放行滚动条 |
5.2.文本组件
- 文本组件用于接收用户输入的信息,包括文本框(
JTextField
)、文本域(JTextArea
)等 - 都有一个共同父类
JTextComponent
,JTextComponent
是一个抽象类
方法声明 | 功能描述 |
---|---|
String String getText() | 返回文本组件中所有的文本内容 |
String getSelectedText() | 返回文本组件中选定的文本内容 |
void selectAll() | 在文本组件中选中所有内容 |
void setEditable() | 设置文本组件为可编辑或者不可编辑状态 |
void setText(String text) | 设置文本组件的内容 |
void replaceSelection(String content) | 用给定的内容替换当前选定的内容 |
5.2.1.JTextField
JTextField
称为文本框,它只能接收单行文本的输入JTextField有一个子类
JPasswordField
,表示一个单行输入密码框在此框中是通过显示指定的回显字符作为占位符。
新创建的密码框默认的回显字符为“*”
方法声明 | 功能描述 |
---|---|
JTextField() | 创建一个空的文本框,初始字符串为null |
JTextFiled(int columns) | 创建一个具有指定列数的文本框,初始字符串为null |
JTextField(String text) | 创建一个显示指定初始字符串的文本框 |
JTextField(String text,int column) | 创建一个具有指定列数、并显示指定初始字符串的文本框 |
5.2.2.JTextArea
JTextArea
称为文本域,它能接收多行文本的输入,使用JTextArea构造方法创建对象时可以设定区域的行数、列数
方法声明 | 功能描述 |
---|---|
JTextArea() | 构造方法,创建一个空的文本域 |
JTextArea(String text) | 构造方法,创建显示指定初始字符串的文本域 |
JTextArea(int rows,int columns) | 构造方法,创建具有指定行和列的空的文本域 |
JTextArea(String text,int rows,int columns) | 构造方法,创建显示指定初始文本并指定了行列的文本域 |
5.3.标签组件
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 实例 |
5.4.按钮组件
- 在
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为选中,反之为未选中) |
5.4.1.JCheckBox
JCheckBox
组件被称为复选框组件,它有选中和未选中两种状态,通常复选框会有多个,用户可以选中其中一个或者多个
方法声明 | 功能描述 |
---|---|
JCheckBox() | 创建一个没有文本信息,初始状态未被选中的复选框 |
JCheckBox(String text) | 创建一个带有文本信息,初始状态未被选定的复选框 |
JCheckBox(String text,boolean selected) | 创建一个带有文本信息,并指定初始状态(选中/未选中)的复选框 |
5.4.2.JRadioButton
JRadioButton
组件被称为单选按钮组件,单选按钮只能选中一个- 要
JRadioButton
按钮之间的互斥,需要使用ButtonGroup
类 ButtonGroup
是一个不可见的单选按钮组。将多个JRadioButton
按钮添加到同一个单选按钮组中就能实现JRadioButton
按钮的单选功能
方法声明 | 功能描述 |
---|---|
JRadioButton () | 创建一个没有文本信息、初始状态未被选中的单选框 |
JRadioButton (String text) | 创建一个带有文本信息、初始状态未被选定的单选框 |
JRadioButton (String text,boolean selected) | 创建一个具有文本信息,并指定初始状态(选中/未选中)的单选框 |
5.5.下拉框组件
5.5.1.概述
JComboBox
组件被称为下拉框或者组合框,它将所有选项折叠在一起,默认显示的是第一个添加的选项- 当用户单击下拉框时,会出现下拉式的选择列表,用户可以从中选择其中一项并显示
JComboBox
下拉框组件分为可编辑和不可编辑两种形式- 对于不可编辑的下拉框,用户只能选择现有的选项列表
- 对于可编辑的下拉框,用户既可以选择现有的选项列表,也可以自己输入新的内容
- 自己输入的内容只能作为当前项显示,并不会添加到下拉框的选项列表中
5.5.2.构造方法
方法声明 | 功能描述 |
---|---|
JComboBox() | 创建一个没有可选项的下拉框 |
JComboBox(Object[] items) | 创建一个下拉框,将Object数组中的元素作为下拉框的下拉列表选项 |
JComboBox(Vector items) | 创建一个下拉框,将Vector集合中的元素作为下拉框的下拉列表选项 |
5.5.3.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则可编辑,反之则不可编辑 |
5.6.菜单组件
5.6.1.下拉式菜单
5.6.1.1.JMenuBar(菜单栏)
JMenuBar
表示一个水平的菜单栏,它用来管理一组菜单,不参与同用户的交互式操作- 菜单栏可以放在容器的任何位置,但通常情况下会使用顶级容器(如
JFrame
、Jdialog
)的setJMenuBar()
方法将它放置在顶级容器的顶部 - 创建菜单栏时,只需要使用
new
关键字创建JMenubar
对象即可 - 创建完菜单栏对象后,可以调用它的
add(JMenu c)
方法为其添加JMenu菜单
5.6.1.2.JMenu(菜单栏)
JMenu
表示一个菜单,它用来整合管理菜单项- 菜单可以是单一层次的结构,也可以是多层次的结构
- 大多情况下,会使用
JMenu(String text)
构造函数创建JMenu
菜单,参数text表示菜单上的文本内容
方法声明 | 功能描述 |
---|---|
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() | 从菜单中移除所有的菜单项 |
5.6.1.3.JMenuItem(菜单栏)
JMenuItem
表示一个菜单项,它是菜单系统中最基本的组件- 通常会使用
JMenumItem(String text)
这个构造方法为菜单项指定文本内容 JMenuItem
继承自AbstractButton
类,因此可以把它看成是一个按钮- 如果使用无参的构造方法创建了一个菜单项,则可以调用从
AbstractButton
类中继承的setText(String text)
方法和setIcon()
方法为其设置文本和图标
5.6.2.弹出式菜单
在
Swing
组件中,弹出式菜单可以用JPopupMenu
来实现使用
JPopupMenu
弹出式菜单同样通过调用add()
方法添加JMenuItem
菜单项,但它默认是不可见的- 想要显示弹出式菜单,必须调用
show(Component invoker,int x,int y)
方法。参数invoker
表示JPopupMenu
菜单显示位置的参考组件,x
和y
表示invoker
组件坐标空间中的一个坐标,显示的是JPopupMenu
菜单的左上角坐标
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 修远的小屋!