1、为了实现事件的处理,需要执行如下四个步骤:第1步,程序导入java.awt.event包或javax.swing.event包,即import java.awt.event.*; 或 import javax.swing.event.*;通过导入这些关于事件处理的包,可以引入关于事件处理的监听接口,如java.awt.event.ActionListener等以及事件处理中事件类,如java.awt.event.ActionEvent等。第2步,创建事件源,实际上就是通过调用GUI组件的构造方法,创建和初始化GUI组件对象。第3步,给事件源注册事件监听器,形如:事件源对象.addXXXList
2、ener(XXXListener);对于同一个事件源而言,允许有多个事件监听器;但是同一个监听器只能被同一个事件源注册一次。第4步,根据监听得到事件的类型,实现事件监听器接口的对应方法。例9.1 利用Swing包的类JColorChooser,设计一个文字框的文字颜色设置的程序。import javax.swing.*;import java.awt.*; /导入java.awt.event包public class SimpleEventHandling extends JFrame implements ActionListener/实现接口 JTextField text; /定义文本框
3、text JButton colorButton; /定义选颜色的按钮colorButton Container container; public SimpleEventHandling() super(一个简单示例); container=getContentPane(); container.setLayout(new FlowLayout(); text=new JTextField(选择颜色的示例文字 图9-1 例9.1的运行结果 colorButton=new JButton(选择颜色 colorButton.addActionListener(this); /注册监听器 cont
4、ainer.add(text); container.add(colorButton); pack(); setVisible(true); public void actionPerformed(ActionEvent e)/实现接口ActionListener的方法actionPerformed() if(e.getSource()=colorButton) /判断事件源是否是按钮 Color colorstyle=Color.black; /定义颜色对象,默认颜色为黑色 colorstyle=JColorChooser.showDialog(this,colorstyle); /选择颜色
5、 text.setForeground(colorstyle); /设置文本框的前景颜色为选择的颜色 colorButton.setForeground(colorstyle); /设置按钮的前景色为选择的颜色 public static void main(String args) SimpleEventHandling seh=new SimpleEventHandling(); seh.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);从例9.1中可以看出,事件处理的过程是:首先,导入事件处理的软件包java.awt.event,然后定义文本框
6、组件和按钮组件;再将按钮组件注册相应的监听器对象。由于这个例子是实现一个ActionListener接口,所以,注册按钮组件到实现该接口的实例对象。为了让按钮动作发生时,能出现颜色的选择处理,对ActionListener接口的方法actionPerformed()进行定义,来实现颜色选择的动作。9.1.2 事件处理的方式从9.1.1节中,已经了解到在实现事件处理的过程是利用监听器接口实现事件处理,其实就是在同一个类中实现一个事件的接口。对该接口的方法进行定义,实现特定的功能。一般形式如下:public class 事件发生类名 implements 事件监听器接口 public事件发生类名(
7、) 组件.addXXXListener(this); /注册到监听器对象,this表示当前对象。 public void 监听器接口说明的方法1() public void 监听器接口说明的方法n()这种方法的优点在于:可以直接对监听器接口的方法进行处理和调用,并且应用简单方便。但是,这种方式存在一个问题,由于实现接口的方法和定义类的方法处于平行定义,如果要求对多个组件有不同的处理,这种方法无疑会增加阅读程序的困难。Java语言在具体应用中,还允许用其他三种方式来实现事件的处理:利用独立监听器类实现事件处理;利用内部类实现事件处理;以及利用匿名内部类实现事件处理。利用监听器类实现事件处理,就是
8、通过扩展一个监听器接口,定义监听器类,然后对要求发生动作的组件在注册到这个监听器类的对象中。这种方法的一般形式如下:public class 自定义监听类名extends 事件适配器(或 implements事件监听器)/定义监听器类 public class 事件发生类名 /定义事件发生的类 public自定义监听类名() 组件.addXXXListener(new自定义监听类名(); /注册组件到监听器对象 .为了说明问题,我们将例9.1用定义监听器类的方式来改写。例9.2 定义监听器类,实现一个文字框的文字颜色设置的程序。 /定义自定义的按钮public class SimpleButt
9、on extends JButton Color color; public SimpleButton(JTextField text) setText( /设置按钮的文本信息 this.text=text; /接受文本框对象 this.color=Color.black; public void setTextColor(Color c) /设置文本框的前景颜色 text.setForeground(c); /NewActionListener.javapublic class NewActionListener implements ActionListener/定义一个实现ActionL
10、istener的事件类 Color colorstyle=Color.black; public void actionPerformed(ActionEvent e) SimpleButton button=(SimpleButton)e.getSource(); if(e.getSource() instanceof JButton) /如果事件源是按钮 colorstyle=JColorChooser.showDialog(null, button.setTextColor(colorstyle); /SimpleEventTest.javapublic class SimpleEven
11、tTest extends JFrame /定义测试类 private SimpleButton button; private JTextField text; public SimpleEventTest() super( container=getContentPane(); container.setLayout(new FlowLayout(); text=new JTextField(颜色选择的示例文字 /定义文本框对象 button=new SimpleButton(text); button.addActionListener(new NewActionListener();
12、container.add(text); container.add(button); pack(); setVisible(true); SimpleEventTest seh=new SimpleEventTest(); seh.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);观察例9.2,该例通过定义一个关于事件的具体处理的监听器类NewActionListener。而在事件发生的类SimpleEventTest中,只需要创建一个监听器类的对象,将自定义SimpleButton组件对象button注册给监听器对象即可。这种事件处理的方式优点在
13、于,处理事件的方法清晰明了,可读性强。另外,允许扩展事件适配器(具体内容见9.3节)来定义新的监听器的类,可以减少不需要的方法的处理。但是,在事件发生的主类中,会增加事件发生对监听器对象的方法的额外调用。为此,Java语言提供的第三种方式:利用内部类实现事件处理。这种方式无疑可以克服上述方法的缺点。这种方法就是将独立的监听器类定义成事件发生类的内部类。形式如下:public class 自定义监听类名 /定义事件发生的类 /注册组件到监听器对象. class 自定义监听类名extends 事件适配器 (或 implements事件监听器)/定义内部监听器类 public void 监听器接口说
14、明的方法1() /结束内部类为了说明问题,用第三种方法来改写例9.1。具体内容见例9.3。例9.3 定义监听内部类,实现一个文字框的文字颜色设置的程序。public class SimpleEventHandling2 extends JFrame /定义事件发生的类 public JTextField text; public JButton colorButton; public SimpleEventHandling2() /定义文本框 /定义按钮 colorButton.addActionListener(new NewActionListener2(); class NewActio
15、nListener2 implements ActionListener /定义内部类 public void actionPerformed(ActionEvent e) if(e.getSource()=colorButton) colorstyle=JColorChooser.showDialog(null, text.setForeground(colorstyle); colorButton.setForeground(colorstyle); /结束内部类 SimpleEventHandling2 seh=new SimpleEventHandling2();利用内部类来实现事件处
16、理,具有上述两种方法的优点。但是随着发生事件的组件增多,程序会变得比较庞大,增加对程序的理解。为了减少程序代码的长度,以及让发生事件的组件在具体处理的时候更有针对性,可以采用第四种方式:利用匿名内部类实现事件处理。不过,利用匿名内部类更会增加程序阅读的难度。具体实现的情况见例9.4。例9.4 利用匿名内部类实现事件处理的示例。public class SimpleEventHandling3 extends JFrame public SimpleEventHandling3() colorButton.addActionListener(new ActionListener()/定义匿名内部
17、类 public void actionPerformed(ActionEvent e) Color colorstyle=Color.black; if(e.getSource()=colorButton) colorstyle=JColorChooser.showDialog(null,颜色选择 colorButton.setForeground(colorstyle); text.setForeground(colorstyle); ); /结束匿名类定义 SimpleEventHandling3 seh=new SimpleEventHandling3(); 本节介绍的四种方法各有特点
18、,在具体的应用中依据具体情况采用不同事件处理方式。9.1.3 事件处理类型不同的GUI组件会产生不同的事件类型。根据事件类型的不同,会导致需要监听器对事件处理方法的不同。Java语言根据这些情况,针对不同GUI组件,有不同的事件处理类型。在特定事件处理类型中,特定的事件类对应于特定的事件监听接口。Java语言中提供事件处理的包主要有java.awt.event和javax.swing.event包。其中,java.awt.event包提供了对awt包和swing包常见组件的支持,与事件处理相关常见的的事件类和事件监听器接口见表9-1。至于swing包提供了对高级事件处理。本节只对AWT包的事件
19、处理详细介绍。表9-1 常见的事件类和事件监听接口 事件类事件监听器接口ActionEventActionListenerItemEventItemListenerMouseEventMouseMotionListenerMouseListenerMouseWheelEventMouseWheelListenerKeyEventKeyListenerFocusEventFocusListenerAdjustmentEventAdjustmentLlistenerWindowEventWindowListenerWindowStateListenerWindowFocusListener9.2
20、常用的事件处理9.2.1 动作事件处理动作事件处理上最简单和最常用的事件处理。当用户点击按钮或在文本框中按回车键或选择菜单项或使用列表等组件时,都可以采用动作事件来处理这些组件引发的动作。动作事件处理涉及到接口ActionListener与动作事件类ActionEvent。通过接口ActionListener可以实现对组件发生动作事件ActionEvent对象的监听与处理。其中,ActionEvent的主要方法见表9-2。表9-2 ActionEvent的主要方法方 法功 能String getActionCommand()获取动作命令字符串int getModifiers()获取事件发生的期
21、间的组合键long getWhen()获取事件发生的时间戳String paramString()获取标识此动作事件的参数字符串实现动作事件,必须依赖于动作事件的监听器ActionListener接口。动作的执行是通过调用监听器对象的方法来实现的。ActionListner接口的主要方法见表9-3。表9-3 ActionListener的主要方法public void actionPerformed(ActionEvent)动作发生时被调用下面通过几个具体例子来说明如何应用动作事件处理具体问题。例9.5 设计一个程序,可以实现一个由文本框和文本区组成的简易聊天室界面,该程序允许用户启动聊天也可
22、以禁止聊天。public class SimpleChatRoom extends JFrame implements ActionListener JPanel chatPanel; /定义聊天面板; JTextArea displayArea; /定义聊天显示区; JTextField inputText; /定义输入文本框; JButton startButton,stopButton; /定义启用和禁止按钮 JLabel statusLabel; /状态标签 public SimpleChatRoom() setGUIComponent(); getContentPane().setLayout(new BorderLayout(); getContentPane().add(chatPanel,BorderLayout.CENTER); getContentPane().add(statusLabel,BorderLayout.SOUTH); public void setGUIComponent() /设置GUI组件 chatPanel=ne
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1