Java Swing中处理各组件事 件的一般步骤.doc_第1页
Java Swing中处理各组件事 件的一般步骤.doc_第2页
Java Swing中处理各组件事 件的一般步骤.doc_第3页
Java Swing中处理各组件事 件的一般步骤.doc_第4页
Java Swing中处理各组件事 件的一般步骤.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java Swing中处理各组件事件的一般步骤是:1新建一个组件(如JButton)。2将该组件添加到相应的面板(如JPanel)。3注册监听器以监听事件源产生的事件(如通过ActionListener来响应用户点击按钮)。4定义处理事件的方法(如在ActionListener中的actionPerformed中定义相应方法)。以上步骤我们可以用多种方法实现。但人们通常用二种方法。第一种方法是只利用一个监听器以及多个if语句来决定是哪个组件产生的事件;第二种方法是使用多个内部类来响应不同组件产生的各种事件,其具体实现又分两种方式,一种是匿名内部类,一种是一般内部类。为了说明如何使用上述三种方法实现事件的处理方法,我们建立一个简单的应用程序。该程序界面有两个按钮,当用户点击相应的按钮,就会弹出一个对话框显示相应的内容。通过这个简单程序,你可以实现自己更多、更复杂的用户界面程序。首先,我们利用单个监听器来实现该程序。我们定义一个名为Simple1的类来包括所有代码。所有的用户行为(如点击按钮)由一个监听器SimpleListenner中的actionPerformed方法来处理。以下是代码:import java.awt.*;import java.awt.event.*;import javax.swing.*;public class Simple1private static JFrame frame;/ 定义为静态变量以便main使用private static JPanel myPanel; / 该面板用来放置按钮组件private JButton button1;/ 这里定义按钮组件private JButton button2;/ 以便让ActionListener使用public Simple1()/ 构造器, 建立图形界面/ 新建面板myPanel = new JPanel();/ 新建按钮button1 = new JButton(按钮1);/ 新建按钮1button2 = new JButton(按钮2);SimpleListener ourListener = new SimpleListener();/ 建立一个actionlistener让两个按钮共享button1.addActionListener(ourListener);button2.addActionListener(ourListener);myPanel.add(button1); / 添加按钮到面板myPanel.add(button2);private class SimpleListener implements ActionListenerpublic void actionPerformed(ActionEvent e)/ 利用getActionCommand获得按钮名称/ 也可以利用getSource()来实现/ if (e.getSource() =button1)String buttonName = e.getActionCommand();if (buttonName.equals(按钮1)JOptionPane.showMessageDialog(frame,按钮1 被点击);else if (buttonName.equals(按钮2)JOptionPane.showMessageDialog(frame,按钮2 被点击);elseJOptionPane.showMessageDialog(frame,Unknown event );public static void main(String s)Simple1 gui = new Simple1(); / 新建Simple1组件frame = new JFrame(Simple1);/ 新建JFrame/ 处理关闭事件的通常方法frame.addWindowListener(new WindowAdapter() public void windowClosing(WindowEvent e)System.exit(0); );frame.getContentPane().add(myPanel);frame.pack();frame.setVisible(true);让我们来看看以上代码是如何工作的。在main方法中,我们定义了一个JFrame,然后将面板Jpanel添加到窗体中,该面板包括两个按钮。相应的变量Frame,button1,button2定义在程序的开头部分。在程序入口main方法中,首先新建Simple1组件,通过构造器建立用户GUI,定义一个面板Jpanle,,增加两个按钮,然后利用 JButton.addActionListerner将两个按钮加入到一个活动监听器SimpleLister中,最后,两个按钮添加到面板。当GUI 建立后,我们将面板添加到窗体并显示结果。当用户点击按钮时,程序调用actionPerformed方法,通过if语句来判断是哪一个按钮被点击,然后 在对话框中显示相应的内容。利用一个监听器来处理事件的缺点是,当程序比较复杂时,需要一大串的if 语句来实现,程序代码较难阅读与维护。当然,如果处理的事件较少,这种方式比较简单。通过使用匿名内部类可以解决上述存在的问题。使用简单的匿名内部类作为addActionListener的变量即可。以下是实现代码:import java.awt.*;import java.awt.event.*;import javax.swing.*;public class Simple2private static JFrame frame;/ 定义为静态变量以便main使用private static JPanel myPanel; / 该面板用来放置按钮组件private JButton button1;/ 这里定义按钮组件private JButton button2;/ 以便让ActionListener使用public Simple2()/ 构造器, 建立图形界面/ 新建面板myPanel = new JPanel();/ 新建按钮button1 = new JButton(按钮1);/ 新建按钮1button2 = new JButton(按钮2);/ 每一个事件源需要一个监听器/ 定义一个匿名内部类来监听事件源产生的事件button1.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e)JOptionPane.showMessageDialog(frame,按钮1 被点击););button2.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e)JOptionPane.showMessageDialog(frame,按钮2 被点击););myPanel.add(button1);/ 添加按钮到面板myPanel.add(button2);public static void main(String s)Simple2 gui = new Simple2(); / 新建Simple2组件frame = new JFrame(Simple2);/ 新建JFrame/ 处理关闭事件的通常方法frame.addWindowListener(new WindowAdapter() public void windowClosing(WindowEvent e)System.exit(0); );frame.getContentPane().add(myPanel);frame.pack();frame.setVisible(true);使用匿名内部类同样存在许多另外的问题。首先,根据组件在代码中被定义的不同位置,类的定义以及处理事件的代码将分散在程序的各个部分,不是集中 在一块,同样不便于阅读与维护。各事件的处理全部由嵌套的程序块组成,视觉上很难定位程序代码。如果事件处理程序比较复杂,内部类中的代码将变得很长,你 将找不到相应的组件定义位置。最后,当工具栏、菜单栏目等需要处理同样的用户行为时,该方法将使代码更难维护。我们使用一般的命名内部类可以解决以上许多问题。所有的事件处理方法都集中在一块,并且都具有有意义的名称,程序非常容易阅读与维护。单个的事件处理程序也可以被工具栏、菜单栏等重复使用,以下是实现代码:import java.awt.*;import java.awt.event.*;import javax.swing.*;public class Simple3private static JFrame frame;/ 定义为静态变量以便main使用private static JPanel myPanel; / 该面板用来放置按钮组件private JButton button1;/ 这里定义按钮组件private JButton button2;/ 以便让ActionListener使用/ 利用一般内部类来监听每一个事件源产生的事件如(button1, button2)private class Button1Handler implements ActionListenerpublic void actionPerformed(ActionEvent e)JOptionPane.showMessageDialog(frame,按钮1 被点击);private class Button2Handler implements ActionListenerpublic void actionPerformed(ActionEvent e)JOptionPane.showMessageDialog(frame,按钮2 被点击);public Simple3()/ 构造器, 建立图形界面/ 新建面板myPanel = new JPanel();/ 新建按钮button1 = new JButton(按钮1);/ 新建按钮1button2 = new JButton(按钮2);/ 对每一个组件注册监听内部类button1.addActionListener(new Button1Handler();button2.addActionListener(new Button2Handler();myPanel.add(button1);/ 添加按钮到面板myPanel.add(button2);public static void main(String s)Simple3 gui = new Simple3();/ 新建Simple3组件frame = new JFrame(Simple3);/ 新建JFrame/ 处理关闭事件的通常方法frame.addWindowListener(new WindowAdapter() public void windowClosing(WindowEvent e)System.exit(0); );frame.getContentPane().add(myPanel);frame.pack();frame.setVisible(true);任何时候,按下键盘或鼠标的键就产生了事件。组件接受和处理事件的方式自JDK1.1以来都保持不变。Swing组件能够产生许多不同类别的事件,包括那些在Java.awt.event包以及在javax.swing.event包中的事件。Swing新引入的那些事件类别往往是与特定Swing组件相关的。每一个事件类别都是一个对象,它至少指明了事件的发生源,往往还带有其它消息,如该事件的类别、在事件发生前和发生后事件源状态的变化,等等。事件源大部分是普通的组件或模型(models, 即MVC中的M,在以后的blog中可能会介绍Swing组件的MVC结构)。其它的对象也可能产生事件。要想收到事件产生的通知,我们需要在目标对象上注册事件监听器。事件监听器是任意XXListener类或接口的具体实现(XX代指事件的类型)。XXListener是定义在java.awt.event、java.beans和javax.swing.event包中的类或接口。在每个接口中至少定义了一个方法(method),该方法以对应的XXEvent作为参数。支持发送XXEvent事件发生通知的类都须实现XXListener接口,同时提供相应的addXXListener()和removeXXListener()方法来注册和移除这些事件监听器,大部分的事件目标对象(target)都允许注册任意多个事件监听器。通常支持 XXEvent的类都提供受保护的方法(protected method)fireXX()来构造事件对象及将它送至事件处理器(event handler)进行处理。javax.swing.event.EventListenerList类EventListenerList是一个包含XXEvent/XXListener对(pairs)的阵列(数组)。JComponent及其派生类使用一个EventListenerList对象来维护其事件监听器。所有默认的模型(models)同样维护事件监听器和一个EventListenerList。当一个监听器被注册到一个Swing组件或模型(model)时,对应的事件的Class实例(用来标识事件类别)被添加至EventListenerList阵列,后面紧随该监听器本身(即一个XXEvent/XXListener对)。因为这些对是储存在阵列而不是在可变的集合(mutable collection)中(出于对效率的考虑),每一次添加和移除都会调用System.arrayCopy()来生成一个新的阵列。当收到事件时,阵列被遍历,事件就会被送至拥有其类型的每一个事件监听器。由于阵列是按XXEvent, XXListener, YYEvent, YYListener, . 的方式排列的,某个事件类别

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论