第八章 Java Swing与事件处理事件触发机制和事件处理机制是围绕 AWT进行的,而 Swing
是在 AWT的基础上构建起来的,所以 Swing组件也使用了
AWT的事件管理机。
本章要点:
理解布局管理器的作用
掌握 FolwLayout,GrildLayout,BorderLayout使用
了解组件之间的关系
掌握常用组件的使用
了解事件处理的原理
掌握事件的注册、监听和处理
了解 WT事件继承层次
理解高级事件和低级事件的概念
掌握窗口事件、鼠标事件、键盘事件的应用为了使 Swing用户界面能在跨平台平台上表现一致,Java布局管理器提供了一层抽象,自动把用户界面映射到所有的窗口系统。当把 Java的 GUI组件添加到容器时,它们由容器的布局管理器来安排位置。
对于 JFrame窗口,程序可以将组件添加到它们的内容面板中。 JFrame的内容面板是一个容器类型的类对象,可以通过 getContentPane()返回该内容面板,内容面板的默认布局是 BorderLayout布局,容器可以使用 setLayout(布局对象)
方法来设置自己的布局。
8.1 布局管理介绍在程序中安排组件的位置和大小时,应注意:
容器中布局管理器负责各组件的大小和位置,用户无法在这种情况下设置组件的这些属性,如试图调用
setLocation(),setSize(),setBounds()等。
如果用户确实需要自己设置组件的大小和位置,则应取消该容器的布局管理器,方法为:
setLayout(null)
但用户必须使用 setLocation(),setSize(),setBounds()等方法为组件设置大小和位置,不过程序将系统相关。
8.1 布局管理介绍
8.1 布局管理介绍在容器中所有组件的布局都由布局管理器来控制,每个容器,如 Panel,Windows或 Frame都有各自缺省的布局管理器,程序员也可以在程序中指定一个新的布局管理器。
java.awt类包中包含五种布局管理器:
FlowLayout,Panel和 Applet的缺省布局管理器
BorderLayout,Window,Dialog和 Frame的缺省布局管理器
GridLayout
CardLayout
GridBagLayout
8.1 布局管理介绍 —— FlowLayout
FlowLayout布局方式是将组件 一排一排地依次 放置,它自动调用组件的 getPreferredSize()方法,使用组件的 最佳尺寸 来显示组件。当容器被重新设置大小后,则布局也会随之发生改变:各组件的大小不变,但相对位置会发生变化。
FlowLayout类有三种构造方法:
public FlowLayout()
使用缺省 居中对齐方式,组件间的水平和竖直间距为缺省值
5个象素 。
public FlowLayout(int alignment)
使用指定的对齐方式( FlowLayout.LEFT,FlowLayout.RIGHT,
FlowLayout.Center),水平和竖直间距为缺省值 5象素。
public FlowLayout(int alignment,int horizontalGap,int verticalGap)
使用指定的对齐方式,水平和竖直间距也为指定值。
import java.awt.*;
import javax.swing.*;
class FrameFlow extends JFrame
{
FrameFlow(String name)
{
super(name);
Container contenetPane=this.getContentPane();
FlowLayout flowLayout=new FlowLayout();
flowLayout.setAlignment(FlowLayout.LEFT); //设置布局的对齐方式
flowLayout.setHgap(4); //设置组件的水平间距
flowLayout.setVgap(6); //设置组件的垂直间距
contenetPane.setLayout(flowLayout); //设置容器的布局为 flowLayout
for(int i=1;i<=10;i++)
{
contenetPane.add(new JButton("按钮 "+i)); //把按钮加入容器
}
contenetPane.validate(); //设置容器有效
setBounds(50,50,100,100);
setSize(300,300);
setVisible(true); //设置组件可见
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); //关闭容口,
Example8_1,java
//并结束程序的运行
}
}
public class Example8_1
{
public static void main(String args[])
{
FrameFlow frame=new FrameFlow("FlowLayout布局窗口 ");
}
} Example8_1,java
8.1 布局管理介绍 —— BorderLayout
BorderLayout布局方式提供了更复杂的布局控制方法,它包括 5个区域,North,South,East,West和 Center,其方位依据上北下南左西右东。 当容器的尺寸发生变化时,各组件的相对位置不变,但中间部分组件的尺寸会发生变化,南北组件的高度不变,东西组件的宽度不变。
BorderLayout类有二种构造方法:
public BorderLayout()
各组件间的水平和竖直间距为缺省值 0个象素 。
public BorderLayout(int horizontalGap,int verticalGap)
各组件间的水平和竖直间距为指定值。
North
South
W
est EastCenter
如果容器使用了 BorderLayout布局方式,则用 add()方法往容器中添加组件时 必须指明添加的位置,否则组件将无法正确显示( 不同的布局管理器,向容器中添加组件的方法也不同 )。
add(“West”,new Button(“West”));
add(“North”,new Button(“North”));
add(new Button(“West”),BorderLayout.SOUTH);
若没有指明放置位置,则表明为默认的,Center”方位。
每个区域只能添加一个组件,若添加多个,则只能显示一个。
如果想在一个区域添加多个组件,则必须先在该区域放一个
Panel容器,再将多个组件放在该 Panel容器中。
若每个区域或若干个区域没有放置组件,东西南北区域将不会有预留,而中间区域将置空。
8.1 布局管理介绍 —— BorderLayout
8.1 布局管理介绍 —— GridLayout
GridLayout布局方式可以使容器中的各组件呈 网格状分布 。
容器中各组件的高度和宽度相同,当容器的尺寸发生变化时,
各组件的相对位置不变,但各自的尺寸会发生变化。
各组件的排列方式:从左到右,从上到下。
与 BorderLayout类相类似,如果想在一个网格单元中添加多个组件,则必须先在该网格单元放一个 Panel容器,再将多个组件放在该 Panel容器中。
8.1 布局管理介绍 —— GridLayout
GridLayout类有三种构造方法:
public GridLayout()
在一行中放置所有的组件,各组件间的水平间距为 0象素。
public GridLayout(int rows,int cols)
生成一个 rows行,cols列的管理器,最多能放置 rows*cols个组件。
rows或 cols可以有一个为 0。若 rows为 0,这表示每行放置
cols个组件,根据具体组件数,可以有任意多行;若 cols为 0,
这表示共有 rows行,根据具体组件数,每行可以放置任意多个组件。
组件间的水平和竖直间距为 0象素。
public GridLayout(int rows,int cols,int horizontalGap,int verticalGap )
各组件间的水平和竖直间距为指定值。
import java.awt.*;
import javax.swing.*;
class FrameGrid extends JFrame
{
FrameGrid(String name)
{
super(name);
Container contenetPane=this.getContentPane(); //获取框架面板
GridLayout flowLayout=new GridLayout(4,3);
flowLayout.setHgap(4); //设置组件的水平间距
flowLayout.setVgap(6); //设置组件的垂直间距
contenetPane.setLayout(flowLayout); //设置容器的布局为
flowLayout
for(int j=1;j<=4;j++)
for(int i=1;i<=3;i++)
{
contenetPane.add(new JButton("按钮 "+i)); //把按钮加入容器
} Example8_2,java
contenetPane.validate(); //设置容器有效
setBounds(10,10,10,10);
setSize(300,300);
setVisible(true); //设置组件可见
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); //关闭窗口,并结束程序的运行
}
}
public class Example8_2
{
public static void main(String args[])
{
FrameGrid frame=new FrameGrid("GridLayout布局窗口 ");
}
} Example8_2,java
8.1 布局管理介绍 —— CardLayout
CardLayout布局方式可以帮助用户处理 两个或更多的组件共享同一显示空间 。共享空间的组件之间的关系就像一摞牌一样,它们摞在一起,只有最上面的组件是可见的。
CardLayout可以象换牌一样处理这些共享空间的组件:为每张牌定义一个名字,可按名字选牌;可以按顺序向前或向后翻牌;也可以直接选第一张或最后一张牌。
public void show(Container parent,String name)
public void next(Container parent)
public void previous(Container parent)
public void first(Container parent)
public void last(Container parent)
其中,Container是拥有该 CardLayout布局管理器的容器。
CardLayout类有二种构造方法:
public CardLayout()
组件距容器左右边界和上下边界的距离为缺省值 0个象素。
public CardLayout(int horizontalGap,int verticalGap)
组件距容器左右边界和上下边界的距离为指定值。
与 BorderLayout类和 GridLayout类相类似,每张牌中只能放置一个组件,如果想在一张牌放置多个组件,则必须先在该牌放一个容器,再将多个组件放在该容器中。
采用 CardLayout布局方式时,向容器中添加组件时可以为组件取一个名字,以供更换显示组件时使用:
add(String,Component);
8.1 布局管理介绍 —— CardLayout
8.1 布局管理介绍 —— CardLayout
CardWindow.java
Frame,Border
North
Center
Panel1
Panel2,Card
Choice
Button
or
Textfield
8.1 布局管理介绍 —— GridBagLayout
GridBagLayout布局方式是 AWT中最灵活、同时也是最复杂的一种布局方式。与 GridLayout相同,它也是将容器中的组件按照行、列的方式放置,但各组件所占的空间可以互不相同 。
GridBagLayout根据对每个组件所施加的空间限制、每个组件自身所设定的最小尺寸和最佳尺寸来为每个组件分配空间。对组件施加空间限制是通过类 GridBagConstraints
来实现的。
8.1 布局管理介绍 —— GridBagLayout
类 GridBagConstraints中提供了一些相应的属性和常量来设置对组件的空间限制:
gridx,gridy
gridwidth,gridheight
fill
ipadx,ipady
insets
archor
weightx,weighty
8.1 布局管理介绍 —— GridBagLayout
( 1) gridx,gridy( int)
gridx指明组件显示区域左端在容器中的位置,若为 0,则组件处于最左端的单元。它是一个非负的整数,其缺省值为 GridBagConstraints.RELATIVE,
表明把组件放在前一个添加到容器中的组件的右端。
gridy指明组件显示区域上端在容器中的位置,若为 0,则组件处于最上端的单元。它是一个非负的整数,其缺省值为 GridBagConstraints.RELATIVE,
表明把组件放在前一个添加到容器中的组件的下端。
( 2) gridwidth,gridheight ( int)
gridwidth指明组件显示区在一行中所占的网格单元数
(宽度)。它是一个非负的整数,其缺省值为 1。若其值为 GridBagConstraints.REMAINDER,表明该组件是一行中最后一个组件;若其值为 GridBagConstraints.RELATIVE,表明该组件紧挨着该行中最后一个组件。
gridheight指明组件显示区在一列中所占的网格单元数
(高度)。它是一个非负的整数,其缺省值为 1。若其值为 GridBagConstraints.REMAINDER,表明该组件是一列中最后一个组件;若其值为 GridBagConstraints.RELATIVE,表明该组件紧挨着该列中最后一个组件。
8.1 布局管理介绍 —— GridBagLayout
( 3) fill ( int)
fill属性指明当组件所在的网格单元的区域大于组件所请求的区域时,是否改变组件的尺寸:是按照水平方向填满显示区,还是按垂直方向填满显示区,其取值可为:
GridBagConstraints.NONE:缺省值,保持原有尺寸,
两个方向都不填满;
GridBagConstraints.HORIZONTAL:按水平方向填满显示区,高度不变;
GridBagConstraints.VERTICAL:按 垂直 方向填满显示区,宽度不变;
GridBagConstraints.BOTH:两个方向上都填满显示区。
8.1 布局管理介绍 —— GridBagLayout
( 4) ipadx,ipady ( int)
ipadx指明组件的宽度与指定的最小宽度之间的关系:组件的宽度为,指定的最小宽度 + ipadx*2,。其缺省值为
0。
ipady指明组件的高度与指定的最小高度之间的关系:组件的高度为,指定的最小高度 + ipady*2,。其缺省值为
0。
8.1 布局管理介绍 —— GridBagLayout
( 5) insets ( Insets)
insets指明了组件与其显示区边缘之间的距离,大小由一个 Insets对象指定。
Insets类有四个属性:
top:上端间距
bottom:下端间距
left:左端间距
right:右端间距其缺省值为一个上述四个属性值都为 0的对象:
new Insets(0,0,0,0);
8.1 布局管理介绍 —— GridBagLayout
( 6) archor ( int)
archor属性指明了当组件的尺寸小于其显示区时,在显示区中如何放置改组件的位置,其值可为:
GridBagConstraints.CENTER(缺省值)
GridBagConstraints.NORTH
GridBagConstraints.NORTHEAST
GridBagConstraints.EAST
GridBagConstraints.SOUTHEAST
GridBagConstraints.SOUTH
GridBagConstraints.SOUTHWEST
GridBagConstraints.WEST
GridBagConstraints.NORTHWEST
8.1 布局管理介绍 —— GridBagLayout
( 7) weightx,weighty( double)
weightx指明当容器扩大时,如何在列间为组件分配额外的空间,其值可以从 0.0到 1.0,缺省值为 0.0。
weighty指明当容器扩大时,如何在行间为组件分配额外的空间,其值可以从 0.0到 1.0,缺省值为 0.0 。
若两者都为 0,所有组件都团聚在容器的中央,因为此时所有额外空间都添加在网格单元与容器边缘之间。
数值越大,表明组件的行或列将占有更多的额外空间。
若两者都为 1.0,表明组件的行或列将占有所有的额外空间。
8.1 布局管理介绍 —— GridBagLayout
当一个容器的布局方式为 GridBagLayout时,往其中添加一个组件,必须先用 GridBagConstraints设置该组件的空间限制。
//在一个容器中
GridBagLayout g = new GridBagLayout();
GridBagConstraints c = new GridBagConstraints();
setLayout( g );
Button b = new Button(“Test”); //生成组件 b
c.fill = … //设置 c的值
……
g.setConstraints( b,c ); //根据 c的值对组件 b进行空间限制
add( b );
8.1 布局管理介绍 —— GridBagLayout
8.2文本输入文本输入中常用的组件有 JTextField,JPasswordField、
JtextArea等。
8.2文本输入 — JTextField
JTextField被称为文本框。它定义了一个单行条形文本区,
可以输出基于任何文本的信息,也可以接受用户的输入。
当输入文本并按下车键时,会发生 ActionEvent事件,可以通过 ActionListener中的 actionPerformed()方法对事件进行相应处理。可以使用 setEditable(boolean)方法设置为只读属性。
8.2文本输入 — JTextField
JTextField构造方法如下:
1.public JTtextField(int n)
创建一个指定列数的文本域
2.public JTextField(String text)
创建一个指定 text文本的文本域
3.public JTextField(String text,int n)
创建一个 text文本和指定列数的文本域
8.2文本输入 — JTextField
JTextField常用的成员方法如下:
1.int getColumns(?) 获取此对象的列数
2.public void setColumns(int Columns) 设置此对象的列数
3.public void setFont(Font f) 设置字体
4.public void setHorizontalAlignment(int alig)
设置文本的水平对齐方式 (LEFT,CENTER,RIGHT)
5.public void setColumnWidth()获取此对象的列宽
6.public String getText()获取文本框中的文本
8.2文本输入 — JTextField
JTextField常用的成员方法如下:
7.public void setEditable(Boolean b)
指定文本框是否可编辑。创建的文本框默认是可编辑的。
8.public void getText(String s)
设置文本框中的文本参数为 s,文本框中原来的文本被清除。
9.public String getText() 获取文本框中的文本。
10.public void setEditablet(Boolean b)
指定文本框是否可编辑,默认为可编辑。
11.public void setHorizontalAlignment(int align)
设置文本的对齐方式,align的有效值为
ield.LEFT,JtextField.CENTER,JtextField.RIGHT
8.2文本输入 — JPasswordField
使用 Jcomponent的子类 JPasswordField可以建立一个密码框对象。即用户可以在此文本框中输入字符,但显示的是
,*”,而不是本身的字符。当然用户也可以设置回显字符。
JPasswordField构造方法如下:
1.JPasswordField()创建一个 JPasswordField
2.JPasswordField( int columns)
创建一个 指定列数的 JPasswordField
3.JPasswordField( String text)
创建一个指定 text文本 JPasswordField
4.JPasswordField( String text,int columns)
创建一个指定 text文本和指定列数的 JPasswordField
8.2文本输入 — JPasswordField
JPasswordField常用的成员方法如下:
getPassword() 获取 JPasswordField的文本内容。
getEchoChar() 获取密码的回显字符。
setEchoChar(char c) 设置密码的回显字符。
8.2文本输入 — JPasswordField
8.2文本输入 — JtextArea
JTextArea被称为文本域。它与文本框的主要区别是:文本框只能输入 /输出一行文本,而文本域可以输入 /输出多行文本。使用 setEditable(boolean)方法,可以将其设置为只读的。在 TextArea中可以显示水平或垂直的滚动条。
要判断文本是否输入完毕,可以在 TextArea旁边设置一个按钮,通过按钮点击产生的 ActionEvent对输入的文本进行处理。
JtextArea构造方法如下:
1.public JtextArea()
用默认构造方法创建一个空文本域。
2.public JtextArea( int columns)
用构造方法创建一个指定列数的空文本域。
3.public JtextArea( String text)
用构造方法创建一个指定 text文本的文本域。
4.public JtextArea( String tex t,int columns)
用构造方法创建一个指定 text文本和指定列数的文本域。
5.JTextArea(String str,int x,int y)
用构造方法创建一个指定 text文本和指定行数、列数的文本域。
8.2文本输入 — JtextArea
JtextArea常用的成员方法如下:
1.public void insert(String str,int pos)
在指定的位置 pos插入指定的文本 str。
2.public void append(String str)
将指定的文本添加到末尾。
3.public void replaceRange(String str start,int end)
用字符串 str替换文本中从 start开始到 end的文字。
4.setLineWrap(Boolean b)
设置文本在文本区域的右边界是否可以自动换行。
5.setWrapStyleWord(Boolean b)
设置以单词为界或以字符为界换行。
6.getCaretPosition() 获取文本区域中输入光标的位置。
7.setCaretPosition(int position) 设置文本区域中输入光标的位置。
8.2文本输入 — JtextArea
8.3按钮与标签 — 按钮按钮是为用户点击时触发行为事件的简单组件。按钮上通常有一行文字 (标签 )或一个图标以表明它的功能。此外,
Swing组件中的按钮还可以实现下述效果:
改变按钮的图标,即一个按钮可以有多个图标,可根据
Swing按钮所处的状态而自动变换不同的图标。
为按钮加入提示,即当鼠标在按钮上稍做停留时,在按钮边可出现提示,当鼠标移出按钮时,提示自动消失。
在按钮上设置快捷键。
设置默认按钮,即通过回车键运行此按钮的功能。
按钮 JButton类的构造方法如下:
1.public JButton () 建立一个没有图像或者没有没有文本的按钮。
2.public JButton (String text) 建立一个显示指定 text文本的按钮。
3.public JButton (Icon icon) 建立一个显示指定 icon图标的按钮。
4.public JButton (String text,Icon icon)
建立一个显示指定 text文本和指定 icon图标的按钮 。
8.3按钮与标签 — 标签按钮 JButton类的 常用的成员方法如下:
1.public void setText(String text) 重新设置当前按钮的名字为 text。
2.public void getText() 获取当前按钮上的名字。
3.public void setIcon(Icon icon) 重新设置当前按钮的图标为 icon。
4.public void getIcon () 获取当前按钮上的图标。
5.public void setHorizontaTextPosistion(int textPosition)
设置按钮名字相对按钮上图标的水平位置。 TextPosition的有效值为
AbstractButton..LEFT,AbstractButton.CENTERT、
AbstractButton.RIGHT。
6.public void setHorizontaTextPosistion(int textPosition)
设置按钮名字相对按钮上图标的水平位置。 TextPosition的有效值为
AbstractButton..TOP,AbstractButton.CENTERT、
AbstractButton.BOTTOM。
8.3按钮与标签 — 按钮按钮 JButton类的 常用的成员方法如下:
7.public void setMnemonic(char mnemonic)
设置按钮的快捷方式,mnemonic的有效值为 ’ a’~’z’。
如果按钮设置了按钮的快捷方式,如参数 mnemonic的取值为 ’ s’,
那么可用键盘操作 ALT+S就可激活键盘。
8.public void setActionListener(ActionListener)
向按钮增加动作临听。
9.public void removeActionListener(ActionListener)
移去按钮上的动作临听。
8.3按钮与标签 — 按钮
8.3按钮与标签 — 标签标签是用户用来显示一小段文本、图片或两者皆有的显示区域,它只起到信息说明的作用,它本身不响应输入事件,
所以不能获取键盘焦点。
JLabel标签类的构造方法如下:
1.public JLabel() 创建一个默认的空标签。
2.public JLabel(String text) 创建一个指定 text文本的标签。
3.public JLabel(String text,int horizontalAlignment)
创建一个指定文本和水平对齐的标签。其中 horizontalAlignment
的有效值为 SwingConstants.LEFT,SwingConstants.CENTER、
SwingConstants.RIGHT。
4.public JLabel(Icon icon) 创建一个指定 icon图标标签。
5.public JLabel(Icon icon,int horizontalAlignment)
创建一个指定 icon图标和水平对齐方式的标签。
6.public JLabel(String text,Icon icon,int horizontalAlignment t)
创建一个指定文本,icon图标和水平对齐方式的标签。
8.3按钮与标签 — 按钮按钮 JButton类的 常用的成员方法如下:
1.public void setText(String text) 重新设置当前按钮的名字为 text。
2.public void getText() 获取当前按钮上的名字。
3.public void setIcon(Icon icon) 重新设置当前按钮的图标为 icon。
4.public void getIcon () 获取当前按钮上的图标。
5.public void setHorizontaTextPosistion(int textPosition)
设置按钮名字相对按钮上图标的水平位置。 TextPosition的有效值为
AbstractButton..LEFT,AbstractButton.CENTERT、
AbstractButton.RIGHT。
6.public void setHorizontaTextPosistion(int textPosition)
设置按钮名字相对按钮上图标的水平位置。 TextPosition的有效值为
AbstractButton..TOP,AbstractButton.CENTERT、
AbstractButton.BOTTOM。
8.3按钮与标签 — 按钮
8.4 选择组件常用的选择组件有复选框组件、单选按钮组件、组合框组件、列表组件等。
8.4 选择组件 — 复选框复选框是一种允许用户打开或关闭某种给定特性,允许用户从一组选项中进行多个选择,当然用户可以不选择。
JCheckbox 的构造方法如下:
public JCheckbox () 创建一个默认的未选的空复选框。
public JCheckbox (String text) 创建一个指定文字的未选的复选框。
public JCheckbox (String text Boolean selected)
创建一个指定文字并指定初始状态是否选中的复选框。
public JCheckbox (Icon icon) 创建一个指定图标的未选的复选框。
public JCheckbox (Icon icon,boolean selected)
创建一个指定图标并指定复选框的初始状态是否选中的复选框。,
public JCheckbox (String text,Icon icon)
创建一个指定文字和指定图标的未选的复选框。
public JCheckbox (String text,Icon icon,boolean selected)
创建一个指定文字和图标并指定复选框的初始状态是否选中的复选框。
8.4 选择组件 — 复选框
JCheckbox的常用成员方法如下:
1.public void setIcon(Icon defaultIcon)
设置复选框上的默认图标。
2.public void setSelctedIcon(Icon selectedIcon)
设置复选框选中状态下的图标。
3.public boolean isselected()
复选框处于选中状态下该方法返回 true,否则返回 false。
Jcheckbox能够产生 ActionEvent和 ItemEvent事件。
8.4 选择组件 — 单选按钮单选按钮让用户从一组选项中选择唯一的选项。单选按钮是圆形的,
同一时刻只能有一个被选中。如果创建多个单选按钮后,应使用
ButtonGroup再创建一个对象,然后用这个若干个单选按钮归于组。归到同一组的单选按钮同一时刻只能有一个被选中。单选按钮也产生
ItemEvent事件。
JRadioButton的构造方法如下:
1.public JRadioButton()
默认的构造方法,创建一个未选中的空单选按钮。
2.public JRadioButton(String text)
创建一个指定文字的未选中的单选按钮。
3.public JradioButton (String text Boolean selected)
创建一个指定文字并指定初始状态是否选中的单选按钮。
8.4 选择组件 — 单选按钮
JRadioButton的构造方法如下:
4.public JRadioButton (Icon icon)
创建一个指定图标的未选的单选按钮。
5.public JRadioButton (Icon icon,boolean selected)
创建一个指定图标并指定初始状态是否选中的单选按钮。,
6.public JRadioButton (String text,Icon icon)
创建一个指定文字和指定图标的未选中的单选按钮。
7.public JRadioButton (String text,Icon icon,boolean selected)
创建一个指定文字和图标并指定初始状态是否选中的单选按钮。 。
8.4 选择组件 — 单选按钮
JRadioButton的构造方法如下:
4.public JRadioButton (Icon icon)
创建一个指定图标的未选的单选按钮。
5.public JRadioButton (Icon icon,boolean selected)
创建一个指定图标并指定初始状态是否选中的单选按钮。,
6.public JRadioButton (String text,Icon icon)
创建一个指定文字和指定图标的未选中的单选按钮。
7.public JRadioButton (String text,Icon icon,boolean selected)
创建一个指定文字和图标并指定初始状态是否选中的单选按钮。 。
8.4 选择组件 — 列表列表是一个向用户展示选项的图形组件。列表一次通常只显示几个选项,它允许用户进行一个或多行选择。当列表清单的事件超出组件的可用空间时,列表常常有一个滚动窗格,可以用它来访问所有选择。
JList的构造方法如下:
1.public JLlist (Vectorl istData)
创建一个指定向量内容的列表对象。
2.public JList (?)
创建一个空的没有内容的列表对象。
3.public JList (Object[?] listData)
创建一个指定对象数组内容的列表对象。
4.public JList (ListModel model)
创建一个指定的数据模型的列表对象。
JList的常用成员方法如下:
1.public int getSelectedIndex (?)
返回列表选项的第一个序号。
2.public int getSelectedIndices (?) 返回所有选项的序号。
3.public void setSelection Background (Color c)
设置单元格的背景颜色。
4.public void setSelection Foreground (Color c)
设置单元格的前景颜色。
5.public int getVisibleRowCount (?) 获取可见的列表选项值。
6.public void setVisibleRowCount (int num) 设置可见的列表选项。
7.public void setSelectedValue(Object obj,Boolean shouldcroll)
设置列表元素,参数 obj是列表中的唯一选择。如果 shouldcroll为
true,列表会自动滚动,以确保可以看见元素。
8.4 选择组件 — 列表
8.4 选择组件 — 下拉列表和组合框组合框可以把按钮、可编辑的组件和列表组成一体的下拉列表框,与列表不同的是组合框只允许用户一次进行一个选择。选择的内容通常被复制到窗口顶端的一个可编辑的组件中,而列表一次可以选择一个或多个。
组合框 JComboBox的构造方法如下,
1.public JComboBox ()
创建一个没有选项的下拉列表。
2.public void addItem (Object anObject)
增加选项。
3.public int getSelectedIndex ()
返回当前下拉列表中被选中的选项有索引,索引的起始值是 0。
8.4 选择组件 — 下拉列表和组合框组合框 JComboBox的构造方法如下,
4.public Object getSelectedItem ()
返回当前下拉列表中被选中的选项。
5.public void removeItemAt (int anIndex)
从下拉列表的选项中删除索引值是 anIndex的选项。 AnIndex值为非负,并且小于下拉列表的选项总数,否则会发生异常。
6.public void removeAllItems ()
删除全部选项。
7public void addItemListener (ItemListener)
向下拉列表中增加 ItemEvent事件的监视器。
8.4 选择组件 — 选项卡
JTabbedPane是一个非常有用的 Swing组件,是目前应用程序中一种常用工具,可以显示选项内容、系统配置参数和其他一些多屏幕用户界面。程序员可以根据需要创建出带有选项卡激活组件的选项窗格。通常,在 JTabbedPane中放置一些面板,每个面板对应一张卡片,用户通过卡片就可以在面板之间切换。
JTabbedPane的构造方法如下:
1.public JTabbedPane() 创建一个空选项卡窗格
2.public JTabbedPane(int tabPlacement)
创建一个指定位置的空选项卡窗格,位置参数 tabPlacement的取值为,SwingConstants.TOP,SwingConstants.BOTTOM、
3.SwingConstants.LEFT,SwingConstants.RIGHT
组合框 JComboBox的常用成员方法如下:
1.public void addTab(String title,Component copm)
往窗格中添加指定标题和组件的选项卡
2.public void addTab(String title,Icon icon,Component copm)
往窗格中添加指定标题、图标和组件的选项卡
3.public void addTab(String title,Icon icon,Component copm,String tip)
往窗格中添加指定标题、图标、组件和工具提示的选项卡。
4.public void insertTab() 插入选项卡
5.public void insertTab(String title,Icon icon,Component copm,
String tip,int index)
插入指定标题、图标、组件和工具提示和指定选项卡数目的选项卡。
8.4 选择组件 — 选项卡
8.4 选择组件 — 滚动条滚动条 (scrollbar)是一个控制器,使用户能从一个范围的值中进行选择。滚动条有垂直方向和水平方向两种滚动条。
滚动条由一个突出的小矩形块组成,这个小矩形块叫滑尺,
它位于两个箭头按钮之间。两端的箭头按钮通过可调整单位数来提升或降低滑尺的位置。此外,单击滑尺之间的区域(调页区)可以将滑尺移动一块,默认情况下是 10个单元。用户可用 3种方法中的任一种来修改滚动条的值:通过在任意方向上拖动滑尺、通过按下箭头按钮、通过单击调页区。
JSrollbar的构造方法如下:
1.public JScrollbar() 创建垂直滚动条。
2.public JScrollbar(int direction)
创建指定 direction方向的滚动条。
direction参数的取值为 JScrollbar.HORIZONTAL和 JScrollbar.VERTICAL。
3.public JScrollbar(int direction,int value,int extent,int minimum,int maximum)
创建指定方向、初值、滚动块大小、最小值、最大值的滚动条。
Direction指定滚动条的方向,JScrollbar.HORIZONTAL( 0)表示水平方向,
JScrollbar.VERTICAL( 1)表示垂直方向。
value 表示滚动条当前值。
extent 表示滚动条长宽值。
minimum 表示滚动条的最小值。
maximum 表示滚动条的最大值。
8.4 选择组件 — 滚动条
8.5 菜单
Swing菜单可提供简单明了的指示说明,广泛应用于各种视窗应用程序,让用户顺利地完成操作,程序员可以将其当做布局管理器或容器看待。 Java 提供了五个实现菜单的类,JMenuBar,JMenu,JMenuItem、
JCheckBoxMenuItem和 JRadioButtonMenuItem..
一般的菜由单菜单栏 (JMenuBar)、菜单 (JMenu)和菜单项
(JMenuItem)三类对象组成,JMenuBar是顶层菜单组件,
添加一个可以 JMenu对象到 JMenuBar内,构造一个菜单,
菜单由用户可以选择的菜单项组成。
8.5 菜单 — 菜单栏
Swing菜单栏 JMenuBar类的主要用途是把 JMenu菜单组合起来,程序员可以用 JMenuBar类的 add()方法添加 JMenu对象。
JMenuBar的构造方法如下:
public JMenuBar() 创建 JMenuBar类菜单栏对象。
8.5 菜单 — 菜单菜单 JMenu类的主要用途是组合 JMenuItem及其子菜单,程序员可以用
JMenu类的 add()方法添加 JMenuItem对象。
JMenu的构造方法如下:
1.public JMenu( ) 创建一个空的 JMenu对象。
2.public JMenu(String text) 使用指定的文本创建一个 JMenu对象。
3.public JMenu(String text,Boolean b)
使用指定的文本创建一个 JMenu对象,
并给出此菜单是否具有下拉式的属性。
4.public JMenu(Action a) 创建一个支持 Action的 JMenu对象。
8.5 菜单 — 菜单项菜单项用来封装与菜单项相关的操作,它是菜单系统中最基本的组件
JMenuItem的构造方法如下:
1.public JMenuItem() 使用空构造一个菜单项对象
2.public JMenuItem(Action a) 创建一个支持 Action的菜单项对象
3.public JMenuItem(String text)
使用指定的文本创建一个菜单项对象
4.public JMenuItem(Icon icon) 创建一个指定图标的菜单项对象
5.public JMenuItem(String text,Icon icon)
创建一个指定文本和图标的菜单项对象
6.public JMenuItem(String text,int mnemonic)
创建一个指定文本和键盘设置快捷的菜单项对象
8.7 对话框对话框的类型很多类型,我们主要分别介绍的是:消息对话框、确认对话框、输入对话框、选项对话框,JOptionPane类提供了用来建立这四种类型对话框的的静态方法。
JOptionPane类建立的对话框由四个基本元素组成,其中的一些可能为
null。这些元素分别是:一个图标、一个消息、一个输入区、一组选项按钮。
8.7 对话框
JOptionPane类的构造函数:
1.public JOptionPane()
2.public JOptionPane(Object message)
3.public JOptionPane(Object message,int messageType)
4.public JOptionPane(Object message,int messageType,int,optionType)
5.public JOptionPane(Object message,int messageType,int,
optionType,Icon icon)
6.public JOptionPane(Object message,int messageType,int,
optionType,Icon icon,,Object[] options)
7.public JOptionPane(Object message,int messageType,int,
optionType,Icon icon,,Object[] options,Object initialValue)
8.7 对话框 —消息对话框消息对话框用于一般消息的显示,要生成消息对话框,可以使用
JOptionPane类中的静态方法,该方法如下:
public ststic void showMessageDialog(Component parent,
Object msg,String int msgType)
参数说明,parent对话框的父类组件,msg要显示的消息,title是对话框的标题,msgType决定所显示消息的类型(取值为,ERROR_MESSAGE、
INFORMATION_MESSAGE,WARNING_MESSAGE,QUESTION_MESSAGE、
PLAIN_MESSAGE,除了 PLAIN_MESSAGE外每种消息都有相应的图标)
8.7 对话框 —确认对话框确认对话框用于接收或拒绝某一动作,要生成确认对话框,可以使用
JOptionPane类中的静态方法,该方法如下:
public intshowConfirmDialog(Component parent,Object
msg,String int optionType)
参数说明,optionType确定用户可以选择的选项分别是:
YES_NO_CANCEL_OPTION 用户选择 YES,No和 Cancel按钮
YES_NO_OPTION 用户选择 YES和 No按钮
OK_CANCEL_OPTION 用户选择 Ok和 Cancel按钮
8.7 对话框 —输入对话框输入对话框接收用户在文本区或选项表中的内容,要生成输入对话框,
可以使用 JOptionPane类中的静态方法,方法如下:
1.public String showInputDialog(Component parent,Object msg,
String int msgType)
2.public String showInputDialog(Component parent,Object msg,
String int msgType,Icon icon,Object option[],Object initialValue)
8.7 对话框 —选项对话框对话框可以让用户自已定义对话框的类型。它的最大好处是可以改变按钮上的文字,对于看不懂英文的用户,使用这种对话框则较为理想。
要生成选项对话框,可以使用 JOptionPane类中的静态方法,方法如下:
1.public int showOptionDialog(Component parent,Object msg,String
int optionType int msgType,Icon icon,Object option[],Object initialValue)
2.public int showInternalOptionDialog(Component parent,Object msg,
String int optionType int msgType,Icon icon,Object option[],Object initialValue)
8.8 事件处理基础所谓事件,就是发生在用户界面上的用户交互行为而产生的一种效果,如鼠标的各种动作、键盘的操作以及发生在组件上的各种动作,因此事件一般也分为三种类型,键盘事件,鼠标事件 以及 组件的动作事件 (对鼠标或键盘事件在一定程度上进行了封装)。
每发生一个事件,程序都需要作出相应的响应,这称为事件处理。在 JDK1.0和 1.1中,事件表示以及事件的处理是采用不同的方式来完成的。
在 JDK1.0中,所有事件都封装在一个单一的类
java.awt.Event中,该类是从 java.lang.Object直接继承而来。
在 Event中,提供了各种常量和变量来描述事件,包括事件的类型、事件的产生者、事件的内容、事件相关信息等,
同时也提供了相关的方法来进一步获取事件相关信息。
例如,为了区分事件类型,需要用其事件分类标志变量
id来判断事件是否属于动作事件:
if( Ev.id == ACTION_EVENT ){… }
8.8 事件处理基础
Event
Object arg
int clickCountint id int key
int modifiers Object target
int x int y
long when
Event类的变量属性
Event类的变量属性
事件类型:如 ACTION_EVENT,KEY_ACTION、
MOUSE_DOWN,MOUSE_ENTER,WINDOW_DISTORY等。
键值:如 F1,DELETE,DOWN,ESCAPE等。
8.8 事件处理基础在 JDK 1.0中,是采用一种叫做 事件传递 的机制来处理发生在用户界面上的事件。
在 AWT组件中,都从 Component中继承了与事件处理有关的方法:
action(Event e,Object arg):处理动作事件
handleEvent(Event e):处理低级键盘事件和鼠标事件每个组件都可以用上述方法处理发生在 自己上面 的事件,
同时,也可以不作处理,而是 交给包含它的容器去处理,并且可以一层一层往上传递,直到最顶层容器。不论哪种方法,
都需要继承已有的 AWT组件,生成其子类,在子类中重写上述方法来对事件进行处理。
8.8 事件处理基础
Event
HandleEvent()
MouseUp()
MouseDown()
MouseDrag()
MouseMove()
MouseEnter()
MouseExit()
keyDown()
KeyUp()
action()
AWT组件如果不覆盖要处理的方法,则缺省的方法返回一个假值,
通知系统没有处理事件
8.8 事件处理基础
handleEvent(Event e)方法一般用来处理低级键盘事件和鼠标事件,其缺省的处理方法为:
public boolean handleEvent(Event evt)
{
switch(evt.id)
{
case Event.MOUSE_ENTER:
return mouseEnter(evt,evt.x,evt.y);
case Event.MOUSE_EXIT:
return mouseExit(evt,evt.x,evt.y);
case Event.MOUSE_MOVE:
return mouseMove(evt,evt.x,evt.y);
case Event.MOUSE_DRAG:
return mouseDrag(evt,evt.x,evt.y);
case Event.MOUSE_UP:
return mouseUp(evt,evt.x,evt.y);
case Event.MOUSE_DOWN:
return mouseDown(evt,evt.x,evt.y);
case Event.KEY_PRESS:
case Event.KEY_ACTION:
return keyDown(evt,evt.key);
case Event.KEY_RELEASE:
case Event.KEY_ACTION_RELEASE:
return keyUp(evt,evt.key);
case Event.ACTION_EVENT:
return action(evt,evt.arg);
case Event.GOT_FOCUS:
return gotFocus(evt,evt.arg);
case Event.LOST_FOCUS:
return lostFocus(evt,evt.arg);
}
return false;
}
8.8 事件处理基础可以看到,在 JDK1.0中,进行事件处理时一般都要 继承已有的组件生成新的子类,并在在子类中重写 action()和
handleEvent()方法进行处理,或沿着组件层次传给上一级容器
(此时容器类也一样要继承生成新的子类),若直到最顶层容器仍没有处理,则合理遗弃。
在第一种方法中,需要为每一种 AWT组件产生子类,处理起来很是麻烦。在第二种方法中,处理起来简单些(只需生成一个容器子类即可),但一个发生在按钮上的事件,处理它的 action方法却属于包含按钮的父类容器,这不符合面向对象的设计原则,并且在事件传递的过程中可能会产生遗漏。
另外,JDK1.0没有 事件过滤机制,事件一旦发生,都会自动传递给组件,不管组件是否需要处理它,这大大降低了程序的运行效率(尤其实鼠标移动这种高频事件)。
还有一点就是会使程序的结构不清晰,可读性差。
8.8 事件处理基础在 JDK1.1中,对事件进行了分类,并且对发生在组件上的事件进行了过滤。所有事件都放在包 java.awt.event中,这些事件都从 java.util.EventObject而来,对于 发生在 组件上的事件,则由 java.awt.event.AWTEvent派生,大致可分为以下十几类,同时又归为两大类:
低级事件:
ComponentEvent,( ContainerEvent,WindowEvent,
FocusEvent,KeyEvent,MouseEvent)
HierarchyEvent,(组件层次)
InputMethodEvent,(文本区内容)
InvocationEvent,(线程调用)
高级事件( 语义事件,一般的 GUI编程,只需对这类事件进行处理即可 )
ActionEvent,AdjustmentEvent,ItemEvent,
TextEvent,……
8.8 事件处理基础在 JDK1.1中,事件处理模型将事件源(产生事件的组件)
和对事件作出的具体处理(利用一种称为监听器 [listener]的实体来对事件进行具体的处理)分开。
一般情况下,组件(事件源)都不处理自己的事件,而是将事件处理委托给外部的处理实体(监听器),这种事件处理模型称为 事件的授权处理模型 。不同的事件,可以交由不同类型的监听器去处理。
所有的组件都从 Component类中继承了将事件处理授权给监听器的方法:
addXXXListener(ListenerType listener)
removeXXXListener(ListenerType listener)
8.8 事件处理基础首先,对于某种类型的事件 XXXEvent,要想接收并处理该类事件,必须定义相应的事件监听器类,这个类需要实现针对该类事件的特定接口 XXXListener。
其次,要实现该类中对事件处理的方法。
第三,对于事件源,必须使用 addXXXListener(XXXListener)注册该类事件的监听器,以便当事件产生时,能够被监听器接收和处理。
Test Exit
ActionEvent
actionPerformed(ActionEvent e)Frame
事件源 监听器( ButtonListener)
8.8 事件处理基础
JDK1.1事件处理模型中的监听器都是通过实现在包
java.awt.event中提供的 监听器接口 来获得的。每种事件都对应有相应的监听器接口,事件的处理方法都已经在该接口中定义了。
interface KeyListener extends java.util.EventListener
{
public void keyPressed(KeyEvent e);
public void keyReleased(KeyEvent e);
public void keyTyped(KeyEvent e);
}
interface ActionListener extends java.util.EventListener
{
public void actionPerformed(ActionEvent e)
}
interface XXXListener extends java.util.EventListener
{
public void XXXEventMethod( XXXEvent e);
}
监听器接口定义监听器接口示例
8.8 事件处理基础
Events Generated by AWT Components.htm
Handling Standard AWT Events.htm
各 AWT事件与其相应的监听器接口:
各 AWT组件所产生的事件:
8.8 事件处理基础由于通过实现接口 XXXListener来完成事件处理时,要同时实现该接口中的所有方法。通常我们只是需要对其中的某些方法做处理,而不想实现所有的无关方法。
因此,为了方便起见,JDK1.1为某些监听器接口提供了适配器类 ( XXXAdapter),当需要对某种事件进行处理时,
只需让事件处理类继承事件所对应的适配器类,只重写需要关注的方法即可,而无关的方法就不必实现了。
适配器是一个类而不是接口,因而处理事件的类只能继承一个适配器。当该类需要处理多种事件时,通过继承适配器类的方式是不行的。但可以基于适配器类,用内嵌类
( Inner Class)的方法来处理这种情况。
8.8 事件处理基础与 AWT有关的所有事件类都由 java.awt.AWTEvent类派生,
它也是 EventObject类的子类。 AWT事件共有 10类,可以归为两大类:低级事件和高级事件。
java.util.EventObject类是所有事件对象的基础父类,所有事件都是由它派生出来的。 AWT的相关事件继承于
java.awt.Event类,这些 AWT事件分为两大类:低级事件和高级事件,低级事件是指基于组件和容器的事件。高级事件是基于语义的事件,它可以不和特定的动作相关联,
而依赖于触发此事件的类,如在 TextField中按 Enter键会触发 ActionEvent事件,滑动滚动条会触发 AdjustmentEvent事件,或是选中项目列表的某一条就会触发 ItemEvent事件。
8.10 AWT的语义事件和低层事件低级事件是指基于组件和容器的事件,当一个组件上发生事件。如鼠标的进入,点击,拖放等,或组件的窗口开关等,触发了组件事件。
8.11 低层事件类型窗口事件是针 java.awt.Window及其子类,包括 Jwindow、
Frame,Dialog,FileDialog。 JFrame类是 Window对象的子类,Window对象都能触发 WindowEvent事件。当一个窗口被激活、撤销激活、打开、关闭等都会触发窗口事件。
窗口使用 addWindowlistener()方法获取监视器。 Java提供了处理窗口事件的 WindowListener监听器接口,该接口中有七个方法如下表所示:
8.11 低层事件类型 —窗口事件
8.11 低层事件类型 —窗口事件成 员 方 法 功能说明
public void WindowActivated(WindowEvent e) 当窗口从非激活状态到激活状态时,窗口的监视器调用该方法
public void WindowDeactivated(WindowEvent e) 当窗口从激活状态到非激活状态时,窗口的监视器调用该方法
public void WindowClosing(WindowEvent e) 当窗口正在被关闭时,窗口的监视器调用该方法
public void WindowClosed(WindowEvent e) 当窗口关闭时,窗口的监视器调用该方法
public void WindowIconiied(WindowEvent e) 当窗口图标化时,窗口的监视器调用该方法
public void WindowDeiconfied(WindowEvent e) 当窗口撤销图标化时,窗口的监视器调用该方法
public void WindowOpened(WindowEvent e) 当窗口打开时,窗口的监视器调用该方法在图形用户界面中,当用户用鼠标进行交互操作时,会产生鼠标事件 MouseEvent。 Java提供了处理鼠标事件的两个监听器接口 MouseListener和 MouseMotionListener接口的类。使用 MouseMotionListener接口监听鼠标的移坳和拖动等行为,使用 MouseListener接口监听鼠标按下、松开、进入、退出和点击行为。
8.11 低层事件类型 —鼠标事件
8.11 低层事件类型 —鼠标事件
MouseEvent事件监听者的常用成员方法事件监听者 成 员 方 法 说 明
MouseListener
mouseClicked(MouseEvent e) 代表鼠标点击事件
mouseEntered(MouseEvent e)
mouseExited(MouseEvent e)
代表鼠标进入事件代表鼠标离开事件
mousePressed(MouseEvent e) 代表鼠标按下事件
mouseReleased(MouseEvent e) 代表鼠标释放事件
MouseMotionListener
mouseDragged(MouseEvent e) 代表鼠标拖动事件
mouseMoved(MouseEvent e) 代表鼠标移动事件
8.11 低层事件类型 —鼠标事件
MouseEvent事件中常用处理方法成 员 方 法 功能说明
public int getX() 返回发生鼠标事件的 X坐标
public int getY() 返回发生鼠标事件的 Y坐标
public Point getPoint() 返回 Point对象,包含鼠标事件发生的坐标点
public int getClickCount() 返回鼠标点击事件的点击次数当用户使用键盘进行操作时就会激发键盘事件 KeyEvent产生的产生。
处理 KeyEvent事件的监听器对象 KeyListener接口的类,或者是继承
KeyAdapter的子类。下面是 KeyListener接口中处理键盘事件的三个事件:
8.11 低层事件类型 —键盘事件
1.public void KeyPressed(KeyEvent e)
键盘按键被按下时调用该事件。
2.public void KeyReleased(KeyEvent e)
键盘按键被放开时调用该事件。
3.public void KeyTyped(KeyEvent e);
键盘按键被敲击时调用该事件。
KeyEvent类中的常用方法有:
8.11 低层事件类型 —键盘事件
1.public char getKeyChar( ) 它返回引发键盘事件的按键对应的
Unicode字符。如果这个按键没有 Unicode字符与之对应,则返回 KeyEvent类的一个静态常量 KeyEvent.CHAR-UNDEFINED。
2.public String getKeyText( )
方法,它返回引发键盘事件的按键的文本内容。