Professional Documents
Culture Documents
本章目录
• 9.1 Swing 概述
• 9.2 Swing 容器
• 9.3 常用 Swing 组件
• 9.4 GUI 布局管理器
• 9.5 事件处理模型
9.1 Swing 概述
• GUI ( Graphic User Interface ):用户与计算机之间交互的图形
化操作界面,又称为图形用户接口
• Java 语言提供两个处理图形用户界面的类库:
– java.awt 包: Abstract Window ToolKit —— 抽象窗口工具包
– java.swing 包:在 AWT 基础上构建的一套新的图形界面系统
• Awt 与 Swing 的区别:
– Awt : Java 处理图形用户界面的初始途径。
• 重量级组件,把图形元素的创建和行为交给目标平台上的本地 GUI 工具箱进行处
理。
• 理论上 “一次编写,随处运行”,实际上“一次编写,随处调试”
• 必须将组件放在一定的容器中才可以显示出来。
– 容器( Container ):本身也是一个组件。
• 主要功能是容纳其他组件和容器。
– 布局管理器( Layout Manager ):
• 每个容器都有一个布局管理器,当容器需要对某个组件进行
定位或判断其大小尺寸时,就会调用其对应的布局管理器。
类结构
java.lang.Object 注意:
Component
类是一个抽象
java.awt.Component 类,不能直接
使用。
java.awt.Container
Jcomponent
JRootPane
JMenuBar JPopupMenu.Separator
JSeparator
JToolBar.Separator
JPanel JSlider
JPopupMenu JSplitPane
JTabbedPane
JScollBar
JEditorPane JTable
JScollPane
JToolBar
JTextComponent JTextArea JToolTip
JTextField JTree
JViewPort
Swing 与 AWT 相似的组件
Swing 比 AWT 增加的组件
9.1 Swing 概述
• Swing 组件的分类
– ( 1 )顶层容器: JFrame,JApplet,JDialog,JWindow 共 4 个。
– ( 2 )中间容器: JPanel,JScrollPane,JSplitPane,JToolBar 等。
– ( 3 )特殊容器:在 GUI 上起特殊作用的中间层,如 JInternalJ
Frame,JLayeredPane,JRootPane 等。
– ( 4 )基本控件:实现人机交互的组件,如 JButton, JComboBo
x, JList, JMenu, JSlider, JTextField 等。
– ( 5 )不可编辑信息的显示:向用户显示不可编辑信息的组
件,例如 JLabel, JProgressBar, JToolTip 等。
– ( 6 )可编辑信息的显示:向用户显示能被编辑的格式化信息
的组件,如 JColorChooser, JFileChoose, JFileChooser, JTable, JTex
tArea 等。
9.2.1 JFrame
• 类 JFrame 是 java.awt.Frame 的子类,顶层容器
• 常用构造方法:
– JFrame() :创建无标题窗口。
– JFrame(String s) : 创建标题名字是字符串 s 的窗口
– 例如: JFrame f = new JFrame(“Hello”);
• setDefaultCloseOperation 方法:
– 设置单击窗口上的关闭按钮时的事件处理方式。
– JFrame.DO_NOTHING_ON_CLOSE
– JFrame.HIDE_ON_CLOSE
– JFrame.DISPOSE_ON_CLOSE
– JFrame.EXIT_ON_CLOSE
JFrame 类的常用方法:
方 法 功 能 说 明
JMenuBar getJMenuBar() 返回窗体上设置的菜单栏
void setJMenuBar(JMenuBar 设置窗体的菜单栏
mb)
int getDefaultCloseOperation () 返回“ close” 窗体时执行的操作
void setDefultCloseOperation 设置“ close” 窗体时默认执行的
( int operation) 操作
void remove(Component comp) 从容器中移除指定的组件
void setContentPane(Container 设置 contentPane 的属性
conPane)
Container getCantentPane() 返回此窗体的 contentPane 对象
JRootPane getRootPane() 返回此窗体的 rootPane 对象
void setTtile(String title) 设置或修改框架的标题
String getTitle() 返回框架的标题
void setBackground(Color c) 设置框架的背景颜色
boolean isResizable() 判断窗口是否可以调节大小
容器类 Container 的常用方法
方法 功能说明
在容器中添加一个组件
Component add (Component comp) comp
void setLayout (LayoutManager 设置组件容器,使用 mgr 页
mgr) 面布局设置
void setFont( Font f ) 设置组件容器的字体
void remove (Component comp) 删除容器组件里指定的组件
void paint (Graphics g) 重绘容器组件
void paintComponents(Graphics g) 重绘容器组件里的所有组件
void removeAll() 从容器中移除所有组件
void remove(int index) 从容器中移除 index 指定的
组件
组件类 Component 的常用方法
方法 功能说明
• JTextField 文本框
– 显示单行的文本信息
– 继承关系: JTextField extends JTextComponent
– 密码输入框: JPasswordField
JTextArea 文本区:
– 是一个显示纯文本的多行区域。
– JTextArea 不管理滚动,可把它放置在 JScrollPane 的 ViewPort 中实现滚动,
如:
JTextArea textArea = new JTextArea();
JScrollPane area=new JScrollPane(textArea);
– TextArea 具有换行能力, JTextArea 默认为不换行,需设置换行策略:
textArea.setLineWrap(true);
textArea.setWrapStyleWord(true);
文本框的构造方法
• JTextField() :创建一个默认宽度的文本框。
• JTextField(int columns) : 创建一个指定宽度的文本框。
• JTextField(String text) :创建一个带有初始文本内容的文本框。
• JTextField(String text, int columns) :创建一个带有初始文本内容并
具有指定宽度的文本框。
• JTextField(Documanet doc, String text, int columns) :创建一个以 d
oc 为文本存储模型,带有初始文本内容并具有指定宽度的文本框
。
// 在面板中添加组件:
pnl.add(btn1);
pnl.add(btn2);
9.3.4 JCheckBox 复选框和 JRadioButton 单选框
• JCheckBox 复选框 :
– 给用户“二选一”的输入选择
– 每个复选框有两种状态:“选中( on )”或“非选中( of
f )”
• JRadioButton 单选框 :
– 给用户“多选一”的输入选择。
– 每个单选框有两种状态:被选择或取消选择。
– 单选框还必须配合 ButtonGroup 类将其组成单选按钮组来使用
• 用 ButtonGroup 的 add 方法将 JRadioButton 对象包含在此组中
• 在这种情况下用 ButtonGroup 类管辖的所有的 JRadioButton 组件中,
只能有一个处于被选择状态。
代码示例:
JCheckBox chk1=new JCheckBox(" 粗体 "); // 创建复选框组件
JCheckBox chk2 =new JCheckBox(" 斜体 ",true); // 创建复选框且为选中状
态
// chk2.setSelected(true); // 设置复选按钮为选中状态
red.setSelected(true); // 设置单选按钮为选中状态
// 把单选框添加到按钮组
group.add(red); group.add(green); group.add(blue);
// 在面板中添加组件:
pnl.add(chk1); pnl.add(chk2);
pnl.add(red); pnl.add(green); pnl.add(blue);
9.3.5 JList 列表框组件
• 列表框组件 JList :
– 向用户提供“多选多”的输入选择
– 列表框通常列出若干选项,可指定列出选项的数
目,超过长度时被折叠起来。
– 列表框中提供了多个文本选项,可以浏览多项。
– JList 类继承自 JComponent 类。
– 列表框组件的使用:
• 先用 JList 类的 add() 方法将选项加入到列表框中
• 然后再利用程序来控制列表框的显示方式。
9.3.5 JList 列表框组件
• public JList() : 使用空模型构造 JList
• public JList(ListModel dataModel) : 构造一个列
表,用它显示指定模型中的元素。
• public JList (Object [] listData) : 构造一个列表以
显示指定数组 listData 的元素。
• JList 不支持滚动。要启用滚动,可使用下列代
码:
JScrollPane myScrollPane=new JScrollPane(lst);
代码示例:
pnl.add(lst); // 在面板中添加组件
9.3.6 JComboBox 下拉列表框组件
• 下拉列表框( JComboBox ) :
– 下拉列表框中所有选项都被折叠收藏起来
– 只会将用户所选择的单个选项显示在显示栏
上。
– 要改变被选中的选项,可以单击下拉列表框右
边的向下箭头,然后从伸展开的选项框中选择
一个选项即可。
– 下拉列表框 JComboBox 继承自 JComponent 类
JComboBox 类的常用方法
方法 功能说明
void addActionListener(
添加 ActionListener
ActionListener l)
void addItem(Object anObject) 为项列表添加项
void addItemListener(ItemListener 为该下拉列表框指定一 item 事件监听
aListener) 者
void addJPopupMenuListener( 添加 JPopupMenu 侦听器,该侦听器
JPopupMenuListener l) 将侦听来自组合框弹出部分的通知消息
Object getItemAt(int index) 返回指定索引处的列表项
int getItemCount() 返回列表中的项数
int getSelectedIndex() 返回列表中与给定项匹配的第一个选项
Object getSelectedItem() 返回下拉列表框中被选中项目的名称
void insertItemAt(Object anObject,
在项列表中的给定索引处插入项
int index)
void removeAllItems() 从项列表中移除所有项
void removeItem(Object anObject) 从项列表中移除项
void removeItemAt(int anIndex) 移除 anIndex 处的项
代码示例:
cbx.setSelectedIndex(0); // 设置选择第 0 项
String str= cbx.getSelectedItem().toString(); // 获取选择的字符串
// 在面板中添加组件:
pnl.add(cbx);
9.3.7 JMenu 菜单组件
• 菜单 JMenu:
– 作用:用户用来输入有关操作命令的简便工具。
– 形式:下拉方式或弹出方式
– 菜单组件的组成:
( 1 )菜单条 JMenuBar :包含若干个菜单
( 2 )菜单 JMenu :包含若干个菜单项
( 3 )菜单项 JMenuItem :与按钮相似,在单击
时引发一个动作命令
9.3.7 JMenu 菜单组件
• JMenuBar 、 JMenu 与 JMenuItem 设置:
– JMenuBar 是可通过 JFrame 、 JWindow 的根窗格
添加至容器的组件。
• 由多个 JMenu 组成,每个 JMenu 在 JMenubar 中
都表示为字符串。
– JMenu 在 JMenuBar 下以文本字符串形式显示,
而在用户单击它时,则以弹出式菜单显示。
– JMenuItem 为 JMenu 中的一个组件,以文本字符
串形式显示,可以具有图标,外观可以修改,如
字体、颜色、背景、边框等。
JMenuBar 类
JMenuBar 类的构造方法
构造方法 功能说明
public JMenuBar() 创建菜单条对象
JMenuBar 类的常用方法
方法 功能说明
public JMenu add(JMenu m) 将 JMenu 对象 m 添加到菜单条
JMenuBar 中
public JMenu getMenu(int i) 返回位置 i 的 JMenu 对象
public int getMenuCount() 返回 JMenuBar 中 JMenu 对象的总
数
public void
setHelpMenu(JMenu menu) 设置用户的帮助菜单
JMenu 类
JMenu 类的构造方法
构造方法 功能说明
public JMenu() 创建菜单对象
创建一个从提供的 Action 获取其属
public JMenu(Action a)
性的菜单
public void
addMenuDragMouseListener 将 MenuDragMouseListener 添
(MenuDragMouseListener l) 加到菜单项
JMenuBar 类的常用方法
方法 功能说明
public JMenu add(JMenu m) 将 JMenu 对象 m 添加到菜单
条 JMenuBar 中
public JMenu getMenu(int i) 返回位置 i 的 JMenu 对象
public int getMenuCount() 返回 JMenuBar 中 JMenu 对
象的总数
public void
setHelpMenu(JMenu menu) 设置用户的帮助菜单
示例:
改变窗口大小
9.4.2 BorderLayout 流式布局管理器
• BorderLayout (边界布局管理器):
– 包括 5 个区:北区、南区、东区、西区和中区。
– 分布规律是“上北下南,左西右东”。
– 将组件加入容器中时,应该指出加在哪个区域,若没指定
区域,则默认为中间。
– 若将组件加入到已被占用位置时,将会取代原先的组件。
– 容器 JFrame 和对话框组件 JDialog 默认使用的布局管理
器。
– 如果某个区域没有分配组件,则其他组件可以占据它的空
间。
9.4.2 BorderLayout 流式布局管理器
• 与流布局管理器不同的是:各区域的组件并不
一定会维持原来定义的大小,而是会充满各区
域所提供的空间。
• 常用的构造函数如下:
– BorderLayout() :生成一个 BorderLayout 对象。
– BorderLayout(int hgap,int vgap): 生成一个 BorderLayo
ut 并指定组件间的水平和垂直间距。
示例:
9.4.3 CardLayout 卡片布局管理器
• 卡片布局管理器( CardLayout ):
– 把每个组件看作一张卡片,好像扑克牌
叠在一起,只看到最外面的一个组件。
– 被显示的组件占据所有的容器空间。
利用卡片布局管理器
– 使用 add()时,通常要用到多个容
方法往窗口容器中加入组件
器,其中一个容器使用
时对每个组件赋予一个名字,依据这个
卡片布局管理器,另外
的容器使用其他布局管
名字利用 CardLayout 类所提供的方法来
理器。
控制其他组件是否显示。
9.4.4 GridLayout 网格布局管理器
• 网格布局管理器( GridLayout ):
– 将容器划分成若干行列的网格,按从左到右、
从上到下顺序添加组件。
– 在 GridLayout 构造方法中,需指定在容器上划
分的网格的行、列数。
– 利用 GridLayout 布局策略时,容器各组件的宽
度、高度相同。
– 当容器的尺寸变化时,各组件的相对位置不
变,但各自的尺寸会发生变化。
66
9.4.4 GridLayout 网格布局管理器
构造方法 功能说明
public GridLayout() 创建 GridLayout 布局管理器,
使用默认值,每行只有一个组件
public GridLayout(int 创建一个包含 rows 行, cols 列
rows,int cols) 的网格布局管理器
public GridLayout(int 创建一个包含 rows 行, cols 列
rows,int cols, int hgap,int 的网格布局管理器,水平间距为
vgap) hgap ,垂直间距为 vgap
事件监听器 A
事件源
( 例如 : 按钮 )
事件监听器 B
9.5 事件处理模型
• 包含事件处理的程序应该包括以下三部分内容:
1 、引入系统事件类包,如 import java.awt.event.* 。
2 、定义监听器类(一般是通过实现监听器接口实现的):
public class MyClass implements ActionListener {
// 必须实现监听器接口中的方法,该方法是处理事件的方法:
3 、为事件源对象注册事件监听器对象:
btn.addActionListener (new MyClass());
例子
• 下面通过一个按钮点击事件的处理例
子介绍 3 种实现事件处理的编程方
法:
– 1 、本类同时实现监听器接口
– 2 、在本类中定义内部类实现监听器接
口
– 3 、实现一个匿名的监听器类
public class Login_Event extends JFrame implements ActionListener{
JLabel lb1,lb2,lb3;JTextField tf1;JPasswordField pw1;
JButton bn1;
public Login_Event() {
// 设置界面,在当前对象上添加并显示组件
……
bn1=new JButton(" 登录 ");
bn1.addActionListener(this);
……
}
public static void main(String[] args) {
Login_Event mainJFrame = new Login_Event();// 创建顶层容器
}
public void actionPerformed(ActionEvent e){ // 事件发生时的处理操作
String name=tf1.getText();
String password=new String(pw1.getPassword());
if(name.equals("Tom") && password.equals("123") ) {
lb3.setText(" 登录成功! ");
} else lb3.setText(" 用户名或密码错误 ");
}
public class Login_Event extends JFrame {
JLabel lb1,lb2,lb3;JTextField tf1;JPasswordField pw1;
JButton bn1;
public Login_Event() {
// 设置界面,在当前对象上添加并显示组件
……
bn1=new JButton(" 登录 ");
bn1.addActionListener(new HandleEvent());
……
}
public static void main(String[] args) {
Login_Event mainJFrame = new Login_Event();// 创建顶层容器
}
class HandleEvent implements ActionListener{
public void actionPerformed(ActionEvent e){ // 事件发生时的处理操作
String name=tf1.getText();
String password=new String(pw1.getPassword());
if(name.equals("Tom") && password.equals("123") ) {
lb3.setText(" 登录成功! ");
} else lb3.setText(" 用户名或密码错误 ");
}
}
public class Login_Event extends JFrame {
JLabel lb1,lb2,lb3;JTextField tf1;JPasswordField pw1;
JButton bn1;
public Login_Event() {
// 设置界面,在当前对象上添加并显示组件
……
bn1=new JButton(" 登录 ");
bn1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e){
String name=tf1.getText();
String password=new String(pw1.getPassword());
if(name.equals("Tom") && password.equals("123") ) {
lb3.setText(" 登录成功! ");}
else lb3.setText(" 用户名或密码错误 ");
}
});
……
}
public static void main(String[] args) {
Login_Event mainJFrame = new Login_Event();// 创建顶层容器
}
事件源与其产生的事件对象
事件源 产生的事件类型
JButton ActionEvent
JCheckBox ActionEvent 、 ItemEvent
JMenuItem ActionEvent
JTextField ActionEvent
JTextArea ActionEvent
Scrollbar AdjustmentEvent
ComponentEvent 、 FocusEv
Component ent 、 KeyEvent 、 MouseEve
nt
Window WindowEvent
事件源、监听器接口、方法的对应关系
类别 接口 方法
ActionEvent ActionListener actionPerformed(ActionEvent e)
ItemEvent ItemListener itemStateChanged(ItemEvent e) 在用户已选定或
取消选定某项时调用
TextEvent TextListener textValueChanged(TextEvent e) 文本的值已改变时
keyPressed(KeyEvent e) 按下某个键时调用
KeyEvent KeyListener keyReleased(KeyEvent e) 释放某个键时调用
keyTyped(KeyEvent e) 键入某个键时调用
mouseClicked(MouseEvent e) 鼠标在组件上单击
(按下并释放)
mouseEntereded(MouseEvent e) 鼠标进入到组件
MouseEvent MouseListener mouseExited(MouseEvent e) 鼠标离开组件
mousePressed(MouseEvent e) 鼠标在组件上按下
mouseReleased(MouseEvent e) 鼠标在组件上释
放
MouseEvent MouseMotionL mouseDragged(MouseEvent e) 鼠标按键在组件上
istener 按下并拖动时调用。
要实现某个接口,必须覆盖其中的所有方法。 mouseMoved(MouseEvent e) 鼠标光标移动到组件
方法里的代码可以为空 上但无按键按下时调用
事件适配器
• 一个类可以实现多个接口,接口中已定义的方
法必须一一实现。
– 如果不使用某事件,可以用空方法体代替,但必须
把所有方法写上。
• Java 为一些 Listener 接口提供了适配器类 (Adapt
er)
– 继承事件所对应的 Adapter 类,重写所需要的方法,
无关的方法则不用实现。
– 缩短程序代码
监听器接口与对应的适配器类
接口 适配器类
ComponentListener ComponentAdapter
ContainerListener ContainerAdapter
FocusListener FocusAdapter
KeyListener KeyAdapter
MouseListener MouseAdapter
MouseMotionListener MouseMotionAdapter
WindowListener WindowAdapter
9.2.3 JDialog 对话框
• JDialog 组件(对话窗口)
– 作用:用来显示提示信息或接收用户输入。
– 特点:没有最小化按钮、状态等控制元素。
– 对话框一般都对应于一个顶层窗口,如 JFrame 窗口。
• 对话框模式分类:
– 有模式:在运行期间不允许用户同应用程序的其他窗口进
行交互。通常情况下,程序要在处理完对话框中的数据后
才能进行下一步工作,因此,有模式的对话框应用较多。
– 无模式:允许用户同时在该对话框和程序其他窗口中切换
操作。
JDialog 类的构造方法
构造方法 功能说明
public JDialog() 创建一个没有标题并且没有指定 Frame
所有者的无模式对话框
public JDialog(Dialog owner) 创建无模式对话框,指定其拥有者为另一个
对话框 owner
public JDialog(Dialog owner, 创建一个拥有者为对话框 owner, 标题为
String title) title 的对话框
public JDialog(Dialog owner, 创建一个拥有者为对话框 owner, 标题为
String title, boolean modal) title 的对话框 , 其模式状态由 modal 来指
定
public JDialog(Frame owner) 创建无模式对话框,指定其拥有者为窗口
owner
public JDialog(Frame 创建一个拥有者为窗口 owner 的对话框,
owner , boolean modal) 其模式状态由 modal 来指定
public JDialog(Frame 创建一个标题为 title, 拥有者为窗口 owner
owner , String title) 的对话框
public JDialog(Frame 创建一个标题为 title, 拥有者为一个窗口的
owner , String title, boolean 对话框,其模式状态由 modal 来指定
modal)
JDialog 类的常用方法
方法 功能说明
public JMenuBar getJMenuBar() 返回此对话框上设置的菜单栏
public Container getContentPane() 返回此对话框的 contentPane 对象
public void
设置 contentPane 属性
setContentPane(Container contentPane)
public int getDefaultCloseOperation() 对话框 "close" 时所执行的操作
public void 设置当用户在此对话框上发起
setDefaultCloseOperation(int operation) "close" 时默认执行的操作
public void setTitle(String title) 将对话框标题设置为 title
public void setModal(boolean b) 设置对话框是否为模式状态
public boolean isModal() 测试对话框是否为模式状态
public void setResizable(boolean 设置对话框是否可改变大小
resizable)
public boolean isResizable() 测试对话框是否可改变大小
public void setVisible(boolean b) 设置对话框是否显示
public void dispose() 撤销对话框对象
例子:定义了一个对话框类,一个窗口类,在窗口类中点击按
钮,弹出对话框。
官网的例子
• 组件的使用:
– https://
docs.oracle.com/javase/tutorial/uiswing/examples/co
mponents/index.html
• 布局管理的使用:
https://docs.oracle.com/javase/tutorial/uiswing/exa
mples/layout/index.html
• 事件处理:
– https://
docs.oracle.com/javase/tutorial/uiswing/examples/ev
ents/index.html