Java开发中的事件驱动模型实例详解
在Softworks软件人才培训中心的两年教学过程,笔者深刻的感受到了这一点,因此下文将会结合笔者的教学经验来讲解可视化编程过程中最为关键的“事件驱动模型”……
当JButton感知到自己被点击以后会将这种感觉传递给某个侦听器对象,该侦听器对象原先已被告知对该类事件感兴趣,侦听器对象仅是一种侦听特定事件的对象。这里的“将事件传递给侦听器”仅意味着事件源调用侦听器对象中的一个特定方法,并以事件对象作为实参。侦听器对象可以侦听一个特定对象的事件(比如一个按钮)。
其实可以使任何类的对象成为侦听器对象,只要使该类实现侦听器接口。你将会发现有各种各样的侦听器接口,以满足不同类型事件的需要。在这个单击按钮的例子中,需要实现ActionListener接口以便接收按钮事件。在侦听器接口声明的方法中,实现了接受这个事件对象并响应该事件的代码。在本例中,在事件发生时,调用了ActionListener接口中的actionPerformed()方法。每种侦听器接口都定义了特定的方法,用来接收该侦听器计划要处理的事件。
仅仅实现侦听器接口还不足以将侦听器对象连接到事件源上,仍需要把侦听器与希望处理的事件单个源或多个源连接起来。通过调用事件源对象的特定方法,可以注册带有事件源的侦听器对象。例如,为了注册侦听单击按钮事件的侦听器,需要调用JButton对象的addActionListener()方法,该操作可以使侦听对象和事件源绑定。
每个事件响应时只涉及到对该事件感兴趣的侦听器。由于侦听器只要求实现一个合适的接口,所以实际上,可以在任何希望的地方接收和处理事件。在Java中使用侦听器对象处理事件的方式,称为委托事件模型,这是因为对于诸如按钮这种组件引起的事件响应,并不是由引起事件的对象本身处理,而是委托独立的侦听器对象进行处理,刚才的actionPerformed()其实就是一个委托处理方法。现在让我们来看一下,JButton是如何将用户的点击转化成方法处理的(如图1-2)。
图1-2

JButton组件初始化代码片断:
| private void initialize() { frame = new JFrame(); frame.getContentPane ().setLayout (null); frame.setBounds (100, 100, 247, 165); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setTitle ("事件驱动程序"); //btnPress就是这次点击操作中的事件源 btnPress = new JButton(); btnPress.setText ("Press"); btnPress.setName ("Press"); btnPress.setBounds (63, 98, 99, 23); //向事件源btnPress植入侦听器对象ButtonEventHandler btnPress.addActionListener (new ButtonEventHandler(this)); frame.getContentPane ().add(btnPress); frame.getContentPane ().add(txtMessage); } |
侦听器创建的代码片断:
| //侦听器对象ButtonEventHandler(用来侦听按钮的点击操作) class ButtonEventHandler implements ActionListener { //窗体对象 private EventDemo form = null; //通过构造体传入窗体对象, //作用在于让侦听器对象明白事件源处于 //哪个窗体容器中 public ButtonEventHandler(EventDemo form) { this.form = form; } //委托方法 public void actionPerformed(ActionEvent e) { //该方法将会把事件的处理权交给窗体容器类的 //btnPress_Click方法处理。 this.form.btnPress_Click(e); } } |
代码工作原理:
JButton组件初始化代码片断已经明确阐述了按钮被创建后放置于窗体上,关键在于本代码片断的以下语句:
btnPress.addActionListener(new ButtonEventHandler(this));
该语句就是向事件源植入了侦听器对象ButtonEventHandler,该类实现了ActionListener结构,因此JButton类的对象btnPress这个时候已经具有了处理用户点击按钮的能力了。
当用户点击btnPress这个按钮的时候,按钮对象会直接把这次点击感觉传递给ButtonEventHandler的actionPerformed方法处理,为养成较好的编程习惯,我们中心并不建议学员直接在该委托方法中编写代码,而是需要将该事件处理再次转发给窗体中的某个方法来处理,这个方法的命名也必须是有规则的,就是事件源名+下划线+事件名(btnPress_Click),并且该方法必须具有事件参数ActionEvent,因为在该对象中明确指明了,哪个按钮受到了点击了。e.getSource()方法返回了被点击按钮的对象,由于这次被点击的是一个按钮,因此我们需要使用JButton对e.getSource()的返回值进行强转,随后通过getName()方法得到这个按钮的名字。至此整个点击事件处理完了。
- 本文关键词:

