第 11章 图形用户界面
11.1 GUI组件简介
11.2 程序框架
11.3 事件处理
11.4 布局管理器
11.5 基本 Swing组件
11.6 高级 Swing组件
11.7 习题
11.1 GUI组件简介
java.lang.Object
java.awt.Component
Container
javax.swing.JComponentPanel Window
Applet
JApplet
Frame Dialog
JFrame JDialog
JTextComponent
Swing组件
AbstractButton
JMenuItem JButton
JToggleButton
JCheckBox
JRadioButton
JCheckBoxMenuItem
JMenu
JRadioButtonMenuItem
JEditorPane
JTextArea
JTextField JPasswordField
JPanel,JLabel,JComboBox,JList,JMenuBar,JPopupMenu,JOptionPane,JScrllPane,JSlider,JProgressBar
JFileChooser,JColorChooser,JTree......
11.2 程序框架
要创建一个图形用户界面,首先需要创建一个特殊的窗口来容纳用户界面组件。
Java语言中,这个特殊的窗口一般是一个应用程序框架或 applet。
11.2.1 创建应用程序框架
JFrame的构造方法:
–public JFrame()
//创建一个没有标题的框架
–public JFrame(String title)
//创建一个带有指定标题的框架例 11-1 创建应用程序框架源代码 运 行
11.2.2 添加组件例 11-2 添加组件例 11-3 直接调用方法 add()添加组件源代码 运 行源代码 运 行
11.3 事件处理
11.3.1 事件和事件源
11.3.2 事件监听器
11.3.3 事件监听适配器
11.3.1 事件和事件源
java.lang.Object
java.util.EventObject
java.awt.AWTEvent
ActionEvent
AdjustmentEvent
ComponentEvent
ItemEvent
TextEvent
FocusEvent
InputEvent
WindowEvent
ContainerEvent
PaintEvent
KeyEvent
MouseEvent
ListSelectionEvent
ChangeEvent
11.3.1 事件和事件源(续)
JButton 点击按钮 ActionEvent
JTextField 在文本域按回车键 ActionEvent
JCheckBox 点击复选框 ActionEvent,ItemEvent
JRadioButton 点击单选按钮 ActionEvent,ItemEvent
JComboBox 选定选项 ActionEvent,ItemEvent
JList 选定选项 ListSelectionEvent
JMenuItem 选定菜单项 ActionEvent,ItemEvent
JSlider 滑动滑块 ChangeEvent
Window 窗口打开、关闭等 WindowEvent
Component 点击或移动鼠标 MouseEvent
Component 按下或释放键 KeyEvent
Container 在容器中添加或删除组件 ContainerEvent
Component 组件获得或失去焦点 FocusEvent
Component 组件移动、改变大小等 ComponentEvent
11.3.2 事件监听器组件(事件源)
事 件监听器触发事件注册操作用 户通知
11.3.2 事件监听器(续)
ActionEvent ActionListener actionPerformed(ActionEvent e)
addActionListener()
ItemEvent ItemListener itemStateChanged(ItemEvent e)
addItemListener()
MouseEvent MouseListener mouseClicked(MouseEvent e)
addMouseListener() mousePressed(MouseEvent e)
mouseReleased(MouseEvent e)
mouseEntered(MouseEvent e)
mouseExited(MouseEvent e)
MouseEvent MouseMotionListener mouseDragged(MouseEvent e)
addMouseMotionListener() mouseMoved(MouseEvent e)
WindowEvent WindowListener windowOpened(WindowEvent e)
addWindowListener() windowClosing(WindowEvent e)
windowClosed(WindowEvent e)
windowIconified(WindowEvent e)
windowDeiconified(WindowEvent e)
windowActivated(WindowEvent e)
windowDeactivated(WindowEvent e)
ListSelectionEvent ListSelectionListener valueChanged(ListSelectionEvent e)
addListSelectionListener()
11.3.2 事件监听器(续)
例 11-4 动作事件处理例 11-5 使用匿名内部类实现监听器接口源代码 运 行源代码 运 行
11.3.3 事件监听适配器
ComponentListener ComponentAdapter
ContainerListener ContainerAdapter
FocusListener FocusAdapter
KeyListener KeyAdapter
MouseListener MouseAdapter
MouseMotionListener MouseMotionAdapter
WindowListener WindowAdapter
11.3.3 事件监听适配器(续)
适配器用空方法实现了相应监听器接口中的每个方法,因此程序中只需继承相应适配器,并覆盖必要的方法 。
例 11-6 使用监听适配器源代码 运 行
11.4 布局管理器
布局管理器控制组件在容器中的大小、
形状和位置。
每种容器都有自己默认的布局管理器。
11.4 布局管理器(续)
BorderLayout
FlowLayout
CardLayout
GridLayout
GridBagLayout
11.4.1 BorderLayout
BorderLayout管理器将容器内的空间划分为 5
个区域:
– BorderLayout.EAST
– BorderLayout.WEST
– BorderLayout.SOUTH
– BorderLayout.NORTH
– BorderLayout.CENTER
其中,每个区域中最多只能容纳一个组件。
11.4.1 BorderLayout(续)
构造方法:
– public BorderLayout()
//创建 BorderLayout对象,组件之间没有水平和垂直间距
– public BorderLayout(int hgap,int vgap)
//以参数指定的水平和垂直间距创建 BorderLayout对象例 11-7 BorderLayout
源代码 运 行
11.4.2 FlowLayout
构造方法:
– public FlowLayout()
//创建 FlowLayout对象,对齐方式是默认的居中对齐,
//组件之间的水平和垂直间距都是默认的 5个像素
– public FlowLayout(int align)
//以参数指定的对齐方式创建 FlowLayout对象,组件之
//间的水平和垂直间距都是默认的 5个像素
– public FlowLayout(int align,int
hgap,int vgap)
//以参数指定的对齐方式、水平和垂直间距创建
// FlowLayout对象
11.4.2 FlowLayout(续 )
FlowLayout管理器 根据容器的组件排列方向属性
( ComponentOrientation),简单地将容器中的组件按添加的先后顺序依次摆放(默认情况下是从左到右),如果一行排满,则在下一行中继续。
例 11-8 FlowLayout
例 11-9 设置容器的组件排列方向属性源代码 运 行源代码 运 行
11.4.3 GridLayout
GridLayout管理器 把容器的空间平均划分为若干行乘若干列的矩形网格,每一个网格中只能添加一个组件。
如果程序指定了划分的具体非 0行数,编译器将忽略指定的具体列数,实际列数将由指定的行数和实际的组件数决定。只有在行数指定为 0时,指定的列数才有实际意义。不过,行数和列数不能同时指定为 0,否则运行时会引发异常。
11.4.3 GridLayout(续)
构造方法:
– public GridLayout()
//创建 GridLayout对象,每行中只有一列
– public GridLayout(int rows,int cols)
//以参数指定的行数和列数创建 GridLayout对象,组件之
//间的水平和垂直间距为 0
– public GridLayout(int rows,int
cols,int hgap,int vgap)
//以参数指定的行数、列数以及组件之间的水平和垂直间距
//创建 GridLayout对象例 11-10 GridLayout
源代码 运 行
11.4.4 CardLayout
CardLayout将容器当作一个卡片盒,把添加到容器中的每一个组件当作一张卡片,每次只有一张卡片是可见的。为使某个组件可见,可以调用 CardLayout
对象的如下方法:
– public void first(Container parent)
– public void next(Container parent)
– public void previous(Container parent)
– public void last(Container parent)
– public void show(Container parent,
String name)
注意,上述方法中的参数 parent必须是真正容纳组件的容器类对象,即它可以是 JFrame,JApplet
等的内容窗格或 JPanel等的对象,但不能直接接收
JFrame,JApplet等的对象。
11.4.4 CardLayout (续)
将组件添加到 CardLayout容器中时需调用方法:
add(Component comp,String name)
CardLayout的 构造方法:
– public CardLayout()
– public CardLayout(int hgap,int vgap)
例 11-11 CardLayout
源代码 运 行
11.5 基本 Swing组件
11.5.1 面板
11.5.2 标签与按钮
11.5.3 文本字段与文本区域
11.5.4 复选框与单选按钮
11.5.5 列表框与组合框
11.5.1 面 板
面板是用来容纳组件的容器,它不能独立存在,只能添加到其他容器中。
面板是 JPanel类的对象。
面板的默认布局器是 FlowLayout,它可以直接容纳组件。
例 11-12 面板源代码 运 行
11.5.2 按钮与标签
JButton(按钮)的构造方法:
– public JButton()
//创建一个没有标记的空按钮
– public JButton(Icon icon)
//创建一个标有指定图标的按钮
– public JButton(String text)
//创建一个标有指定文字的按钮
– public JButton(String text,Icon icon)
//创建一个标有指定文字和图标的按钮
11.5.2 按钮与标签(续)
AbstractButton( JButton 的父类):
public void addActionListener(ActionListener l)
public Icon getIcon()
public void setIcon(Icon defaultIcon)
public String getText()
public void setText(String text)
public void setEnabled(boolean b)
public void setHorizontalAlignment(int alignment)
public void setVerticalAlignment(int alignment)
public void setHorizontalTextPosition(int
textPosition)
public void setVerticalTextPosition(int
textPosition)
11.5.2 按钮与标签(续)
操作按钮可以产生多种事件,不过程序通常只需响应点击按钮时产生的动作事件( ActiveEvent)。
11.5.2 按钮与标签(续)
JLabel(标签)的构造方法:
– public JLabel()
– public JLabel(Icon image)
– public JLabel(Icon image,int
horizontalAlignment)
– public JLabel(String text)
– public JLabel(String text,int
horizontalAlignment)
– public JLabel(String text,Icon
icon,int horizontalAlignment)
11.5.2 按钮与标签(续)
标签不会引发任何事件。
程序中可以调用相应的方法返回或设置标签上的文字或图标、文字和图标的对齐方式及文字与图标的相对位置等。
例 11-13 按钮与标签源代码 运 行
11.5.3 文本字段与文本区域
文本字段与文本区域都是允许用户输入字符的区域。
文本字段只允许用户输入一行字符,而文本区域允许用户输入多行字符。
11.5.3 文本字段与文本区域(续)
JTextField(文本字段)的构造方法:
– public JTextField()
//创建一个文本字段,初始字符串为空,列数为 0
– public JTextField(String text)
//创建一个文本字段,初始字符串为 text,列数为 0
– public JTextField(int columns)
//创建一个文本字段,初始字符串为空,列数为 columns
– public JTextField(String text,int
columns)
//创建一个文本字段,初始字符串为 text,列数为 columns
11.5.3 文本字段与文本区域(续)
JTextField:
public void addActionListener(
ActionListener l)
//注册动作事件监听器
public int getColumns()
//返回文本字段的列数
public void setColumns(int columns)
//设置文本字段的列数
public void setFont(Font f)
//设置文本字段中文字的字体
在文本字段中按回车键会引发 ActionEvent
事件。
11.5.3 文本字段与文本区域(续)
JTextArea(文本区域)的构造方法:
– public JTextArea()
//创建一个文本区域,初始字符串为空,行、列数为 0
– public JTextArea(String text)
//创建一个文本区域,初始字符串为 text,行、列数为 0
– public JTextArea(int rows,int
columns)
//创建一个文本区域,初始字符串为空,行数为 rows,列
//数为 columns
– public JTextArea(String text,int
rows,int columns)
//创建一个文本区域,初始字符串为 text,行数为 rows,列
//数为 columns
11.5.3 文本字段与文本区域(续)
TextArea:
public void append(String str)
//将字符串 str添加到文本的尾部
public void replaceRange(String
str,int start,int end)
//用字符串 str替换文本中从 start到 end位置的字符
public void insert(String str,int
pos)
//将字符串 str插入到文本中的指定位置 pos
public int getRows()
//返回文本区域的行数
public void setRows(int rows)
//设置文本区域的行数
11.5.3 文本字段与文本区域(续)
与文本字段不同,文本区域不会引发
ActionEvent事件。
例 11-14 文本字段与文本区域源代码 运 行
11.5.4 复选框与单选按钮
复选框是一个很小的方框,方框旁边可以标有文字或图标。它有两种状态:被选或未被选。用户点击某个复选框时,
该复选框会从一种状态转变为另一种状态。
11.5.4 复选框与单选按钮(续)
JCheckBox(复选框)的构造方法:
– public JCheckBox()
– public JCheckBox(Icon icon)
– public JCheckBox(Icon icon,boolean
selected)
– public JCheckBox(String text)
– public JCheckBox(String text,boolean
selected)
– public JCheckBox(String text,Icon
icon)
– public JCheckBox(String text,Icon
icon,boolean selected)
11.5.4 复选框与单选按钮(续)
复选框的状态可以调用下述方法来获取或设定:
public boolean isSelected()
public void setSelected(boolean b)
点击复选框会引发 ActiveEvent和
ItemEvent事件。
例 11-15 复选框源代码 运 行
11.5.4 复选框与单选按钮(续)
单选按钮是一个很小的圆,圆旁边可以标有文字或图标 。 与复选框相同,每个单选按钮有两种状态:被选或未被选 。 用户点击某个单选按钮时,该单选按钮会从一种状态转变为另一种状态 。 与复选框不同的是,在某一时刻同一组中的单选按钮只有一个被选择,
选择某个单选按钮时,同一组中的其他单选按钮都会变为未被选;而同一组中的复选框同时可以有 0个,1个或多个被选 。
11.5.4 复选框与单选按钮(续)
JRadioButton(单选按钮)的构造方法:
– public JRadioButton()
– public JRadioButton(Icon icon)
– public JRadioButton(Icon
icon,boolean selected)
– public JRadioButton(String text)
– public JRadioButton(String
text,boolean selected)
– public JRadioButton(String text,Icon
icon)
– public JRadioButton(String text,Icon
icon,boolean selected)
11.5.4 复选框与单选按钮(续)
创建单选按钮后,通常需要将它们归属到某个组:
(1)首先创建 javax.swing.ButtonGroup类的对象;
(2)调用 ButtonGroup类中定义的方法
add(AbstractButton b)将单选按钮添加到该对象中。
注意,添加到同一 ButtonGroup对象中的单选按钮属于同一组,同时只能选择其中之一。
11.5.4 复选框与单选按钮(续)
点击单选按钮会引发 ActiveEvent和
ItemEvent事件。
例 11-16 单选按钮源代码 运 行
11.5.5 组合框与列表
组合框也称下拉式列表,它是一些项目的简单列表。与单选按钮类似,用户可以从中选择一个。
11.5.5 组合框与列表(续)
JComboBox(组合框)的构造方法:
– public JComboBox()
//创建一个组合框,组合框中的选项为空
– public JComboBox(Object[] items)
//创建一个组合框,组合框中的选项由参数 items指定
11.5.5 组合框与列表(续)
组合框中的选项可以调用下述方法添加或删除:
public void addItem(Object anObject)
//在组合框中添加一个选项 anObject
public void removeItem(Object
anObject)
//在组合框中删除参数 anObject指定的选项
public void removeItemAt(int anIndex)
//在组合框中删除序号为参数 anIndex的选项
public void removeAllItems()
//删除组合框中的所有选项
11.5.5 组合框与列表(续)
调用下述方法可以获取组合框中特定的选项:
public Object getItemAt(int index)
//返回组合框中序号为参数 index的选项
public int getSelectedIndex()
//返回组合框中被选择的选项的序号
public Object getSelectedItem()
//返回组合框中被选择的选项
11.5.5 组合框与列表(续)
选定组合框中的选项会引发
ActiveEvent和 ItemEvent等事件。
例 11-17 组合框源代码 运 行
11.5.5 组合框与列表(续)
列表允许用户从中进行选择。不过,它与组合框的外观不同:组合框只有在点击它时才会显示下拉列表,而列表会在屏幕上持续占用固定行数的空间。此外,列表还允许用户同时选择多项:用户在多个选项上同时按下
<Ctrl>键并点击鼠标,就可以选择任意多项,
如果选择某个选项后,按下 <Shift>键并同时点击另一个选项,那么两个选项间的所有选项都被选择;如果想取消某个选项,只需按下 <Ctrl>键并同时点击该项。
11.5.5 组合框与列表(续)
JList(列表)的构造方法:
– public JList()
//创建一个列表,列表中的选项为空
– public JList(Object[] listData)
//创建一个列表,列表中的选项由参数 listData指定
11.5.5 组合框与列表(续)
调用下述方法可以获取列表中特定的选项或设置可见行数:
public int[] getSelectedIndices()
//返回列表中所有被选择的选项的序号
public Object[] getSelectedValues()
//返回列表中所有被选择的选项
public void setVisibleRowCount(int
visibleRowCount)
//设置列表中同时可见的行数为 visibleRowCount,默认值
//为 8
11.5.5 组合框与列表(续)
选定列表中的选项会引发
ListSelectionEvent等事件。
例 11-18 列表源代码 运 行
11.6 高级 Swing组件
11.6.1 菜单
11.6.2 弹出式菜单
11.6.3 滑块与进度条
11.6.4 消息对话框
11.6.1 菜单
JMenuBar
JMenu
JMenuItem
JCheckBoxMenuItem
JRadioButtonMenuItem
11.6.1 菜单(续)
实现菜单的过程:
1)创建菜单栏,并将它设置到某个容器中:
JMenuBar mb=new JMenuBar();
JFrame frame=new JFrame();
frame.setJMenuBar(mb);
11.6.1 菜单(续)
实现菜单的过程:
2)创建菜单条,并将它们添加到菜单栏中:
JMenu fileMenu=new JMenu("文件 ");
JMenu editMenu=new JMenu("编辑 ");
mb.add(fileMenu);
mb.add(editMenu);
11.6.1 菜单(续)
实现菜单的过程:
3) 创建菜单项,并将它们添加到菜单条中:
JMenuItem[] editm={
new JMenuItem("剪切 "),
new JMenuItem("复制 "),
new JMenuItem("粘贴 "),
new JMenuItem("全选 ")};
for(int i=0;i<editm.length;i++){
editMenu.add(editm[i]);
if(i==2)
editMenu.addSeparator();}
11.6.1 菜单(续)
JCheckBoxMenuItem和
JRadioButtonMenuItem也可用于创建菜单项。
JMenu是 JMenuItem的子类,因此,菜单条组件可以添加到另一个菜单条中,从而实现多重子菜单。
11.6.1 菜单(续)
选定菜单项组件会引发 ActiveEvent
和 ItemEvent等事件。
例 11-19 菜单源代码 运 行
11.6.2 弹出式菜单
弹出式菜单是一个小窗口,其中含有多个菜单项。它通常用于和某个组件结合,
使该组件在某种条件下弹出一个菜单。
11.6.2 弹出式菜单(续)
JPopupMenu popup=new JPopupMenu();
JMenuItem[] popupm=new JMenuItem("剪切 ");
popup.add(popupm);
11.6.2 弹出式菜单(续)
弹出式菜单应和某个组件结合,以使用户在该组件上按下鼠标右键时将它显现出来。因此,程序应该监听希望能弹出菜单的组件的鼠标事件( MouseEvent)
并在相关方法中调用 JPopupMenu类中的下述方法将弹出式菜单显现出来:
public void show(Component invoker,int x,int y)
例 11-20 弹出式菜单源代码 运 行
11.6.3 滑块与进度条
滑块允许用户通过移动一个点的方式在一定范围内输入数据。
进度条通常用来显示某件工作完成的百分比。
11.6.3 滑块与进度条(续)
JSlider(滑块)的构造方法:
– public JSlider()
– public JSlider(int orientation)
– public JSlider(int min,int max)
– public JSlider(int min,int max,int
value)
– public JSlider(int orientation,int
min,int max,int value)
11.6.3 滑块与进度条(续)
滑块的标记可以通过下述方法设定:
public void setMajorTickSpacing(int n)
public void setMinorTickSpacing(int n)
public void setPaintTicks(boolean b)
public void setPaintLabels(boolean b)
调用 JSlider类中的下述方法可以获取滑块的当前数值:
public int getValue()
移动滑块会引发 ChangeEvent等事件。
11.6.3 滑块与进度条(续)
JProgressBar(进度条)的构造方法有:
– public JProgressBar()
– public JProgressBar(int orient)
– public JProgressBar(int min,int max)
– public JProgressBar(int orient,int
min,int max)
11.6.3 滑块与进度条(续)
进度条的最大、最小值等可以通过下述方法设定:
public void setMaximum(int n)
public void setMinimum(int n)
public void setStringPainted(boolean b)
public void setValue(int n)
例 11-21 滑块与进度条源代码 运 行
11.6.4 消息对话框
对话框是一些临时小窗口,通常用来将信息发送给用户或接收用户输入的信息 。
消息对话框用来将消息发送给用户 。
11.6.4 消息对话框(续)
显示消息对话框需调用 JOptionPane中下述静态方法:
public static void showMessageDialog(Component
parentComponent,Object message)
public static void showMessageDialog(Component
parentComponent,Object message,String
title,int messageType)
public static void showMessageDialog(Component
parentComponent,Object message,String
title,int messageType,Icon icon)
11.6.4 消息对话框(续)
ERROR_MESSAGE
INFORMATION_MESSAGE
WARNING_MESSAGE
QUESTION_MESSAGE
PLAIN_MESSAGE
例 11-22 消息对话框源代码 运 行
11.7 习 题