您的当前位置:首页正文

AWT编程学习笔记_原创 含简略代码

来源:个人技术集锦


1. AWT

1.1 AWT概念

AWT全称“Abstract Window Toolkit”,即:抽象窗口工具集。为java应用程序提供了基本的图形组件。ATW是窗口框架,它从不同的操作平台提取出共同组件,当程序运行时,将这些组件的创建和动作委托程序所在的运行平台。

2. AWT容器

2.1 基本介绍

什么是容器?

任何窗口都可以被分解成一个空的容器,容器内盛装了大量的基本组件,通过设置这些组件的大小,属性,位置等,就可以将该容器和组件组成一个整体的窗口。 容器(Container)是Commponent的子类,因此容器对象本身也是一个组件。Commponent类有如下的方法来设置组件的大小,位置,属性和可见性等: setLocation(int x,int y):设置组件的位置

setSize(int width,int height):设置组件的宽度,高度

setBounds(int x,int y, int width,int height):同时设置组件的位置,大小。 setVisible(Boolean b):设置组件的可见性。

除此之外,容器还具有盛装其他组件的功能,容器类(Container)主要提供了一下几个常用的方法来访问容器内的组件:

Component add(Component comp)向容器中添加其他组件 Component getCommponentAt(int x,int y):返回指定点的组件 Int getComponentCount():返回容器内的组件个数 Component[] getComponents():返回容器里的所有组件 AWT 主要提供了两种类型的容器 Window: 可独立存在的窗口

Panel: 可作为容器容纳其他组件,但不能独立存在,必须被添加到其他容器中。 AWT 容器的继承关系图:

Container Window Panel ScrollPane Frame Dialog Appelt

ScrollPane:增加滚动条

Frame: 常见的窗口 Dialog: 对话框 例子:

import java.awt.Frame; public class TestFrame { public static void main(String[] args) { Frame f=new Frame(\"测试窗口\"); //设置窗口的大小,位置 f.setBounds(50, 100, 400, 300); //设置窗口的可见性,默认是隐藏的 f.setVisible(true); } }

运行上面的程序,显示了一个简单的窗口

2.2 Panel

Panel 容器具有以下几个特点:

 可作为容器来盛装其他组件,为放置组件提供空间  不能单独存在,必须依附于其他容器  默认使用FlowLayout作为布局管理器

下面的例子使用Panel作为容器来盛装一个文本框和按钮 例子:

import java.awt.Button; import java.awt.Frame; import java.awt.Panel; import java.awt.TextField; public class TestPanel { public static void main(String[] args) {

} } Frame f=new Frame(); //创建一个Panel容器 Panel p=new Panel(); //给Panel容器中添加组件 p.add(new TextField(20)); p.add(new Button(\"按钮\")); //将Panel添加到Frame窗口中 f.add(p); f.setBounds(50, 100, 300,400); f.setVisible(true);

运行之后我们会看到这么一个窗口:

2.3 ScrollPane

ScrollPane是一个带滚动条的容器,不能独立存在。ScrollPane具有以下特点:  可以作为容器来盛装其他组件,当组件占用空间过大时会自动产生滚动

条。

 不能单独存在

 默认使用BorderLayout作为布局管理器 我们看一个简单的例子:

import java.awt.Button; import java.awt.Frame; import java.awt.ScrollPane;

import java.awt.TextField; public class TestScrollPane { public static void main(String[] args) { Frame f=new Frame(\"测试窗口\"); //创建一个ScrollPane容器,指定总是显示滚动条 ScrollPane sp=new ScrollPane(ScrollPane.SCROLLBARS_ALWAYS); //为ScrollPane容器添加组件 sp.add(new TextField(20)); sp.add(new Button(\"按钮\")); f.add(sp); f.pack(); f.setVisible(true); } }

运行上面的程序我们会看到如下的结果:

3. 布局管理器

为了使生成的图形用户界面具有良好的与平台无关性,java语言中,提供了布局管理器来管理组件在容器中的布局,而不使用直接设置的位置和大小。

AWT 提供了FlowLayout,BorderLayout,GridLayout,GridBigLayout,CardLayout五个常用的布局管理器。

3.1 FlowLayout布局管理器

在FlowLayout布局管理器中,组件像流水一样向某个方向流动(排列),遇到边界就折回。

FlowLayout有如下三个构造器

 FlowLayout();使用默认的排序方式,默认垂直,水平创建FlowLayout布

局管理器

 FlowLayout(int align)使用指定的对齐方式。

 FlowLayout(int align,int hgap,int vgap)使用指定的对齐方式,指定水平,

垂直,水平间距,创建FlowLayout布局管理器 Hgap,vgap代表水平,垂直间距 我们来看下边的例子:

import java.awt.Button; import java.awt.FlowLayout; import java.awt.Frame; public class TestFlowLayout { public static void main(String[] args) { Frame f=new Frame(\"测试窗口\"); //设置Frame容器使用FlowLayout布局管理器 f.setLayout(new FlowLayout(FlowLayout.LEFT,20,5)); } } //向窗口中添加按钮 for(int i=0;i<20;i++) { f.add(new Button(\"按钮\"+i)); } f.pack(); f.setVisible(true);

运行上边的代码我们会看到如下结果:

3.2 BorderLayout布局管理器

BorderLayout 布局管理器将容器分为WAST,SOUTH,WEST,NORTH,CENTER五个区域。

使用BorderLayout时需要注意两点:

1. 向使用BorderLayout布局管理器的容器中添加组件时,如果没指定哪个区域,则默认为中间

2. 如果向同一区域添加组件时,前边的会被后边的覆盖 BorderLayout布局管理器有如下两个构造器

 BorderLayout();使用默认水平,垂直间距来创建布局管理器

 BorderLayout(int hagp,int vagp);使用指定的水平,垂直间距来创建布局管理

器。 例子:

import java.awt.BorderLayout; import java.awt.Button;

import java.awt.Frame; import javax.swing.border.Border; public class TestBorderLayout { public static void main(String[] args) { Frame f=new Frame(\"测试窗口\"); f.setLayout(new BorderLayout(30,5)); f.add(new Button(\"北\"),BorderLayout.SOUTH); f.add(new Button(\"西\"),BorderLayout.WEST); f.add(new Button(\"南\"),BorderLayout.NORTH); f.add(new Button(\"东\"),BorderLayout.EAST); f.add(new Button(\"中\")); f.pack(); f.setVisible(true); } }

运行结果:

3.3 GirdLayout 布局管理器

GridLayout布局管理器将容器分割成纵横线分割的网络,每个网格所占的区域大小不同,往使用GirdLayout的容器中添加组件时,默认从左向右,从上往下。 GridLayout有如下两个构造器

 GirdLayout(int rows,int cols);采用指定的行数,列数,默认横向间距,纵向间

距将容器分割成多个网络

 GridLayout((int rows,int cols,int hagp,int vagp);

我们用 GridLayout和BorderLayout开发一个计算器的界面:

import java.awt.BorderLayout; import java.awt.Button; import java.awt.Frame; import java.awt.GridLayout; import java.awt.Panel; import java.awt.TextField; public class TestGridLayout { public static void main(String[] args) { Frame f = new Frame();

Panel p1 = new Panel(); p1.add(new TextField(30)); f.add(p1, BorderLayout.NORTH); // 设置Panel使用GridLayout布局 Panel p2 = new Panel(); p2.setLayout(new GridLayout(3, 5, 4, 4)); String[] name = { \"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"+\", \"-\", \"*\", \"/\", \".\" }; } } //向Panel2中添加按钮 for(String n:name) { p2.add(new Button(n)); } f.add(p2); f.pack(); f.setVisible(true);

运行后我们看到这么一个简单的计算器界面

3.3 GridBagLayout 布局管理器

GirdBagLayout 布局管理器功能最强大。但也是最复杂的。于GridLayout布局管理器不同的,一个组件可以跨越多个网格。并可以设置网格的大小,从而增加了布局的灵活性

使用GridBagLayout布局管理的步骤如下:

 创建GridBagLayout布局管理器,并指定GUI容器使用该布局,代码如下: GridBagLayout gb=new GridBagLayout(); Constainer.setLayout(gb);

 创建GridBagLayout对象,并设置该对象的相关属性,代码如下: gbc ,gridx=2;//设置受该对象控制的GUI组件位于网格的横向索引 gbc ,gridy=2;//设置受该对象控制的GUI组件位于网格的纵向索引 gbc ,gridwidth=2;//设置受该对象控制的GUI组件位横跨多少网格

gbc ,gridwidth=2;//设置受该对象控制的GUI组件位纵跨多少网格

 调用 GridBagLayout对象的方法来建立GridBagConstainer对象和受控组件

之间的关联,代码如下:

gb .setConstainer(c,gbc);//设置c组件受gbc对象控制  添加组件 Constainer.add(c);

使用GridBagLayout布局管理器的关键在于GridBagConstainer,他才是精确控制某个GUI组件的核心,该类有如下几个方法:

 Gridx gridy 设置受该对象控制的GUI组件的左上角所在的横向索引,纵向

索引。

 Gridwidth gridheight 设置受该对象控制的GUI组件横向,纵向跨越了多少个

网格

 Fill:设置受该对象控制的GUI组件如何占领空白区域。

 Ipadx、ipady:设置受该对象控制的GUI组件横向,纵向的内部填充大小,

即在该组件的最小尺寸的基础上还需要增加多大。

 Insets:何止受该对象控制的GUI组件的外部填充大小,即组件边界于显示

区域边界之间的距离

 Anchor : 设置受该对象GUI组件在其显示区域之中的定位方式。

 Weightx,weighty:设置受该对象控制的GUI组件占领多余空间的水平,垂

直增加比例。默认值都是0,即不占用多余空间

3.4 CardLayout

CardLayout布局管理器以时间而非空间来管理组件,他将加入容器的组件看成一叠卡片,每次只有最上边的Commponent才可以显示。CardLayout提供了如下两个构造器:

 CardLayout(): 创建默认的CardLayout布局管理器

 CardLayout(int hgap,int vgap): 通过指定卡片于容器边界的距离,来创建

CardLayout布局管理器

CardLayout 用于控制组件可见的5个方法:

 First(Canstainer target):显示target容器中的第一张卡片  Last(Canstainer target):显示target容器中的最后一张卡片  Previous(Canstainer target):显示target容器中前一张卡片  Next(Canstainer target):显示target容器中下一张卡片

 Show(Canstainer target,String name):显示target容器中指定卡片的名字 如下的例子程序示范了CardLayout布局管理器的用法:

public class TestCardLayout { Frame f = new Frame(); String[] name = { \"第一张\", \"第二张\", \"第三张\", \"第四张\", \"第五张

\" }; Panel p = new Panel(); CardLayout c = new CardLayout(); public void init() { p.setLayout(c); for (int i = 0; i < name.length; i++) { p.add(name[i], new Button(name[i])); } Panel p2 = new Panel(); // 控制显示上一张的按钮 Button previous = new Button(\"上一张\"); previous.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { c.previous(p);// 显示容器里的钱一张卡片 } }); // 控制显示下一张的按钮 Button next = new Button(\"下一张\"); next.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { c.next(p);// 显示容器里的钱一张卡片 } }); // 控制显示第一张的按钮 Button first = new Button(\"第一张\"); first.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { c.first(p);// 显示容器里的钱一张卡片 } }); // 控制显示最后一张的按钮 Button last = new Button(\"最后一张\"); last.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { c.last(p);// 显示容器里的钱一张卡片 } }); // 控制显示第三章的按钮 Button third = new Button(\"第三张\"); third.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { c.show(p, \"第三张\");// 显示容器里的钱一张卡片 }

} } }); p2.add(previous); p2.add(last); p2.add(first); p2.add(next); p2.add(third); f.add(p); f.add(p2,BorderLayout.SOUTH); f.pack(); f.setVisible(true); public static void main(String[] args) { new TestCardLayout().init(); }

运行结果如下:

绝对定位:

Java可以对GUI组件进行绝对定位,在java中采用绝对定位的步骤如下:  将Container的布局管理器设置车改null:setLayout(null);

 往容器中添加组件时,先调用setBounds()或setSize()的方法来设置组件的

大小,位置。或直接创建GUI组件时通过构造器来指定该组件的位置,大小,然后将该组件添加到容器中。

下面的程序示范了如何使用绝对定位来控制窗口中的GUI组件

public class TestNullLayout { Frame f = new Frame(); Button b1 = new Button(\"第一个按钮\"); Button b2 = new Button(\"第二个按钮\"); public void init() { } //将容器的布局管理器设置为null f.setLayout(null); //定义按钮的位置,大小 b1.setBounds(20, 30, 90, 28); f.add(b1); b2.setBounds(50, 45, 120, 35); f.add(b2); f.setBounds(50, 100, 400, 300); f.setVisible(true); } public static void main(String[] args) { new TestNullLayout().init(); }

运行效果如下:

3.5 BoxLayout 布局管理器

GridBagLayout布局管理器功能虽然强大,但是太复杂了。所以Swing引入了一个新的布局管理器。BoxLayout布局管理器可以在水平和垂直位置上放置组件。BoxLayout提供了如下的简单构造器:

 BoxLayout(Container target,int axis):创建基于target容器的布局管理器、该

布局管理器里的组件按照axis方向排列。 我们来写一个简单的例子:

public class TestBoxLayout { Frame f=new Frame(); public void init() { //添加BOxLayout布局管理器到容器中,并指定排列方式:垂直 f.setLayout(new BoxLayout(f, BoxLayout.Y_AXIS)); f.add(new Button(\"按钮一\")); f.add(new Button(\"按钮二\")); f.add(new Button(\"按钮三\"));

} f.pack(); f.setVisible(true); } public static void main(String[] args) { new TestBoxLayout().init(); } 运行结果如下:

BoxLayout通常和Box容器结合使用,Box是一个特殊的容器。他有点像Panel,但该容器默认使用BoxLayout布局管理器。Box提供了如下两个静态方法来床架Box对象

 CreateHorizontalBox();创建一个水平排列的Box容器  CreateVeriticalBox();创建一个垂直排列的Box容器 我们写个程序来测试一下Box容器

public class TestBox { Frame f=new Frame(); //定义一个水平放置组件的BOx对象

} Box x=Box.createHorizontalBox(); //定义一个垂直房子组件的Box对象 Box y=Box.createVerticalBox(); public void init() { x.add(new Button(\"按钮一\")); x.add(new Button(\"按钮二\")); y.add(new Button(\"按钮三\")); y.add(new Button(\"按钮四\")); f.add(x,BorderLayout.NORTH); f.add(y); f.pack(); f.setVisible(true); } public static void main(String[] args) { new TestBox().init(); }

运行结果如下:

看到运行结果,我们发现一个问题,所有的按钮紧挨在一起,为了解决这个问题,Box提供了如下的5个静态方法

 CreateHorizontalGlue();可以在水平同时拉伸的间距  CreateVerticalGlue();可以在垂直两个方向同时拉伸。  CreateVerticaStrut(int height);在水平方向上拉伸  CreateHorizontalStrut(int width);在垂直方向上拉伸

 CreateRigArea(Dimension d);创建指定宽度,高度。不可拉伸

4. 常用组件

4.1 基本组件

AWT 提供了如下基本组件:  Button:按钮,可接受单击操作  Canvas:用于绘制画布

 Checkbox:复选框组件,也可以作为单选框

 CheckboxGroup:用于将多个CheckBox组合成一组,一组CheckBox中只有

一个可以被选中,即全部变成单选框组件  Choice:下拉式选择框组件  Frame:窗口

 Label:标签类,用于放置提示性文本  List:列表组件框,可以添加多个项目。  Panel:不能单独存在的基本容器类

 ScrollBar:滑动条组件。如果需要用户输入位于某个范围的值。可以使用滑

动条组件

 ScrollPane:带水平,垂直的滚动条容器组件  TextArea:多行文本域  TextField:单行文本域

这些组件的用法都比较简单,可以查阅API文档来获取他们各自的构造器,方法等详细信息。

下面的程序示范了他们的基本用法:

public class CommonComponent { Frame f = new Frame(\"常用组件演示\"); Button ok = new Button(\"确定\"); CheckboxGroup cbg = new CheckboxGroup(); Checkbox male = new Checkbox(\"男\", cbg, true); Checkbox female = new Checkbox(\"女\", cbg, false);

} Checkbox married = new Checkbox(\"是否结婚?\", false); Choice colorChooer = new Choice(); List colorList = new List(6, true); TextArea ta = new TextArea(5, 20); TextField tf = new TextField(50); public void init() { colorChooer.add(\"红色\"); colorChooer.add(\"绿色\"); colorChooer.add(\"黄色\"); colorList.add(\"红色\"); colorList.add(\"绿色\"); colorList.add(\"黄色\"); //创建一个Panel,装载文本框,按钮 Panel bottom=new Panel(); bottom.add(tf); bottom.add(ok); f.add(bottom,BorderLayout.SOUTH); //创建一个装载下拉框,三个Checkbox的Panel Panel checkPanel=new Panel(); checkPanel.add(male); checkPanel.add(female); checkPanel.add(married); //创建一个垂直排列的Box,装载多行文本域,panel Box left=Box.createVerticalBox(); left.add(ta); left.add(checkPanel); //创建一个水平排列的Box,装咋left和colorList Box top=Box.createHorizontalBox(); top.add(left); top.add(colorList); //将top Box添加到窗口中 f.add(top); f.pack(); f.setVisible(true); } public static void main(String[] args) { new CommonComponent().init(); }

运行结果如下:

4.2 对话框

对话框是Window的子类,是一个容器类,属于特殊组件。对话框也是可以存在的顶级窗口,因此于普通窗口的用法几乎一样。但对话框有两点需要注意:  对话框通常依赖于其他窗口

 对话框有非模式窗口和模式窗口两种。注意模式窗口于非模式窗口的区别 对话框有多个重载的构造器。他的构造器可能有如下三个参数:

 Owner:指定该对话框所依赖的窗口,即可使是窗口,也可以是对话框  Title:指定该对话框的标题

 Modal:指定该对话框是否是模式的,值为true或者false; 下面的程序示范了模式对话窗口和非模式对话窗口

public class TestDialog { Frame f = new Frame();

} Button b1 = new Button(\"模式窗口\"); Button b2 = new Button(\"非模式窗口\"); Dialog d1 = new Dialog(f, \"模式窗口\", true); Dialog d2 = new Dialog(f, \"非模式窗口\", false); public void init() { d1.setBounds(20, 30, 300, 150); d2.setBounds(20, 30, 300, 150); b1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { d1.setVisible(true); } }); b2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { d2.setVisible(true); } }); f.add(b1); f.add(b2,BorderLayout.SOUTH); f.pack(); f.setVisible(true); } public static void main(String[] args) { new TestDialog().init(); }

Dialog还有一个子类,FileDialog,他代表一个文件对话框。用于打开或者保存文件,FileDialog也提供了几个构造器,分别支持parent,title,mode三个参数。其中parent,title指定文件对话框所属的父窗口和标题。Mode只用窗口用于打开或保存文件。该参数支持如下两个参数值:FileDialog.LOAD,和FileDialog.SAVE.

FileDialog提供了如下两个方法来获取打开/保存文件的路径  GetDirectory():获取被打开/保存文件的绝对路径  GetFile():获取打开/保存文件的文件名 下面的程序分别示范了使用FileDialog打开/保存文件

public class TestFileDialog { Frame f = new Frame(); Button b1 = new Button(\"打开\"); Button b2 = new Button(\"保存\"); FileDialog open=new FileDialog(f,\"选择要打开的文件\",FileDialog.LOAD); FileDialog save=new FileDialog(f,\"选择要打开的文件\",FileDialog.LOAD); public void init() { b1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { open.setVisible(true); System.out.println(open.getDirectory()+open.getFile()); } }); b2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { save.setVisible(true);

} System.out.println(save.getDirectory()+save.getFile()); } }); f.add(b1); f.add(b2,BorderLayout.SOUTH); f.pack(); f.setVisible(true); } public static void main(String[] args) { new TestFileDialog().init(); }

5. 事件处理

5.1 java事件模型的流程

为了使图形界面能够接收用户的操作,必须给各个组件加上事件处理机制。在事件处理机制中,主要涉及三类对象:

 Event Source(事件源):事件发生的场所,通常就是各个组件,按钮等等  Event(事件):事件封装了GUI组件上发生的特定事情(通常就是指用户的一

次操作)。如果程序需要获得GUI组件上发生的特定事情,都通过Event对象来获取

 Event Listener(事件监听器):负责监听事件源发生的事件,并对各种事件做

出响应处理。

AWT的事件处理机制是一种委派的方式:普通组件(事件源)将整个事件处理委托个特定的对象(事件监听器);当事件源发生指定事件时,就通知委托的事件监听器,由事件监听器来处理这个事件。 下图展示了AWT事件处理机制流程图:

事件 外部动作 2.触发事件源上事件 4.触发事件监听器,事件被作为参数传递到事件处理器 3.生成事件对象 事件源 1.将事件监听器注册到事件源 事件监听器 5.调用事件处理器做出响应 事件处理器 事件处理器 … …

下面写一个简单的Hello world程序来示范AWT事件处理器 public class EventQs { Frame f = new Frame(\"测试事件\"); Button ok = new Button(\"确定\"); TextField tf = new TextField(30); public void init() { // 注册事件监听器 ok.addActionListener(new OKListener()); f.add(tf); f.add(ok, BorderLayout.SOUTH); f.pack();

f.setVisible(true); } //定义事件监听器类 class OKListener implements ActionListener { //下面的方法就是事件处理器,用于响应特定事件 public void actionPerformed(ActionEvent e) { System.out.println(\"用户单击了确定按钮\"); tf.setText(\"hello world\"); } } public static void main(String[] args) { new EventQs().init(); } } 运行后结果如下:

从上面的程序可以看出,实现AWT事件处理机制的步骤如下:

 实现事件监听器类,该监听器类是一个特殊的java类,必须实现一个

XxxListeren接口。

 创建普通组件,创建事件监听器对象。

 调用addXxxListener方法,将事件监听器对象注册给普通组件。当事件源上

发生特定事件时,AWT会触发事件监听器,由事件监听器调用相应的方法来处理事件,事件源上发生的事件会作为参数传入事件处理器。

5.2 事件和事件监听

AWT事件机制涉及到三个成员:事件源,事件和事件监听器。其中事件源最容易创建,只要通过new来创建一个AWT组件,该组件就是事件源;事件的产生无须程序员关心。它是由系统自动产生的。所以,实现时间监听器是整个事件处理的核心。

事件监听器必须实现时间监听器接口,AWT提供了大量的事件监听器接口用于实现不同类型的事件监听器,用于监听不同类型的事件。

AWT中提供了丰富的事件类,用于封装不同组件上所发生的特定操作:AWT事件都是AWTEvent类的子类,它是EventObject类的子类。 AWT事件分为两大类:低级事件和高级事件。

低级事件:

低级事件是指基于特定动作的事件。如鼠标进入、点击、拖放等动作的鼠标事件,当组件得到焦点,失去焦点时触发的事件。

 ComponentEvent:组件事件,当组件尺寸发生变化时,位置发生移动时,显

示和隐藏状态发生改变时触发事件。

 ContainerEvent:容器事件,当容器里发生组件添加,移除时触发该事件  WindowEvent:窗口事件,当窗口状态发生改变时触发  FocusEvent:焦点事件,当组件获得或者失去焦点时触发的事件  KeyEvent:键盘事件,当按下,松开,单击键盘时触发  PaintEvent:组件绘制事件。

高级事件(语意事件):

高级事件是基于语意的事件,他可以和不特定的动作想关联,而依赖于触发此事件的类,比如:FieldText中按Enter键会触发ActionEvent事件。  ActionEvent:动作事件,当按钮,菜单项被单击。

 AdjuestmentEvent: 调节事件,在滑动条上移动滑块以调节数值时触发。  itemEvent:选项事件,当用户选中某项或取消某项时触发

 TextEvent:文本事件,当文本框,文本域里的文本发生改变时触发。 AWT中事件继承层次如图:

EventObject ActuinEvebt AWTEvent TextEvent AdjuestmentEvenItemEvent COntainerEvent ComponentEvent FocusEvent PaintEvent WindowEvent InputEvent KeyEvent MouseEvent

不同的事件需要使用不同的事件监听,不同的监听器需要实现不同的事件监听器接口,当指定事件发生后,事件处理器就会调用所包含的事件处理器来处理事件。 下表显示了常用的事件、监听器接口和处理器之间的对应关系。

事件 监听器接口 处理器及触发时机 ActionEvent ActionListeren ActionPreformed:按钮、文本框、菜单项被单击时

触发 ContainerEvent ContainerListeren adjustmentValueChanged:滑块位置发生改变时触发 FocusEvent FocusListeren focusGained:组件得到焦点时触发 focusLost::组件失去焦点时触发 ComponentEvent ComponentListeren comPonentHidden:组件被隐藏时触发 comPonentMoved:组件被移动时触发 comPonentResize:组件大小改变时触发 comPonentShown:组件被显示时触发 keyPressed:按下某个键

KeyEvent KeyListeren keyReleased:松开某个键 keyTyped:单击某个键 MouseEvent MouseListeren mouseClicked:在某个组件上单击时触发 mouseEntered:鼠标进入鼠标进入某个组件时触发 mouseExited:鼠标离开某个组件时触发 mousePressed:在某个组件上按下鼠标时触发 mouseReleased:在某个组件上松开鼠标时触发 MouseEvent MouseMotionListener mouseDragged:鼠标在某个组件上移动,并且按下时触发 mouseMoved:在某个组件上移动,并没有按下时触

发 TextEvent TextListeren textValueChanged:文本组件里的文本发生改变时触发 ItemEvent ItemListeren itemStateChanged:某项被选中或取消时触发 WindowEvent WindowListeren windowActivated:窗口被激活时触发 windowCloed:窗口调用dispose即将关闭时触发 windowDeacticated:窗口失去焦点时触发 windowDeiconified:窗口被恢复时触发 windosIconified:窗口最小化时触发 windowOpened:窗口首次

打开时触发 windowClosing:用户单击窗口右上角X时触发 下面的程序示范了一个监听器监听多个组件,一个组件被多个监听器监听

public class Test_Event { Frame f=new Frame(\"演示一个监听器监听多个组建,一个组建被多个监听器监听\"); TextArea ta=new TextArea(); Button b1=new Button(\"按钮一\"); Button b2=new Button(\"按钮二\"); public void init() { f.add(ta); Panel p=new Panel(); p.add(b1); p.add(b2); f.add(p,BorderLayout.SOUTH); f.pack(); f.setVisible(true); FirstListener first=new FirstListener(); //一个组建被多个监听器监听 b1.addActionListener(first); b1.addActionListener(new SecondListener()); //一个监听器监听读个组建 b2.addActionListener(first); } class FirstListener implements ActionListener { public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub ta.append(\"第一个事件监听器被触发,事件源是\"+e.getActionCommand()+\"\\n\"); } } class SecondListener implements ActionListener {

public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub ta.append(\"第二个事件监听器被触发,事件源是\"+e.getActionCommand()+\"\\n\"); } } public static void main(String[] args) { Test_Event te=new Test_Event(); te.init(); } } 运行效果如下:

下面的程序程序为窗口添加窗口监听器。从而示范了窗口监听器的用法。并允许用户单击X来关闭窗口:

public class Test_WindowListener { Frame f=new Frame(\"监听window窗口事件\"); TextArea ta=new TextArea(6,40); public void init() { f.add(ta);

f.pack(); f.setVisible(true); f.addWindowListener(new MyListener()); } class MyListener implements WindowListener { //激活 public void windowActivated(WindowEvent e) { // TODO Auto-generated method stub ta.append(\"窗口激活\"+\"\\n\"); } //关闭后 public void windowClosed(WindowEvent e) { ta.append(\"已经关闭\"+\"\\n\"); } //关闭时 public void windowClosing(WindowEvent e) { // TODO Auto-generated method stub ta.append(\"正在关闭\"); System.exit(0); } //失去焦点 public void windowDeactivated(WindowEvent e) { // TODO Auto-generated method stub ta.append(\"失去焦点 \\n\"); } //获得焦点 public void windowDeiconified(WindowEvent e) { // TODO Auto-generated method stub ta.append(\"获得焦点\\n\"); } //窗体最小化 public void windowIconified(WindowEvent e) { // TODO Auto-generated method stub ta.append(\"窗体最小化\\n\"); } public void windowOpened(WindowEvent e) { // TODO Auto-generated method stub ta.append(\"窗体第一次打开\\n\"); } } public static void main(String[] args) { Test_WindowListener tw=new Test_WindowListener();

} tw.init(); }

因篇幅问题不能全部显示,请点此查看更多更全内容