新的事件模子(java)
在新的事件模子的组件可以开始一个事件。每种范例的事件被一个个此外类所描画。当事件开始后,它受理一个或更多事件指明“吸收器”。因此,事件源和处理惩罚事件的地点可以被疏散。
每个事件吸收器都是执行特定的吸收器范例接口的类工具。因此作为一个措施开拓者,我们所要做的是建设吸收器工具而且在被激活事件的组件中举办注册。event-firing组件挪用一个addXXXListener()要领来完成注册,以描写XXX事件范例接管。我们可以容易地相识到以addListened名的要领通知我们任何的事件范例都可以被处理惩罚,假如我们试图吸收事件我们会发明编译时我们的错误。Java Beans同样利用这种addListener名的要领去判定那一个措施可以运行。
我们所有的事件逻辑将装入到一个吸收器类中。当我们建设一个吸收器类时独一的一点限制是必需执行专用的接口。我们可以建设一个全局吸收器类,这种环境在内部类中有助于被很好地利用,不只仅是因为它们提供了一个理论上的吸收器类组到它们处事的UI或业务逻辑类中,但因为(正像我们将会在本章后头看到的)事实是一个内部类维持一个句柄到它的父工具,提供了一个很好的通过类和子系统界线的挪用要领。
一个简朴的例子将使这一切变得清晰明晰。同时思考本章前部Button2.java例子与这个例子的差别。
//: Button2New.java // Capturing button presses import java.awt.*; import java.awt.event.*; // Must add this import java.applet.*; public class Button2New extends Applet { Button b1 = new Button("Button 1"), b2 = new Button("Button 2"); public void init() { b1.addActionListener(new B1()); b2.addActionListener(new B2()); add(b1); add(b2); } class B1 implements ActionListener { public void actionPerformed(ActionEvent e) { getAppletContext().showStatus("Button 1"); } } class B2 implements ActionListener { public void actionPerformed(ActionEvent e) { getAppletContext().showStatus("Button 2"); } } /* The old way: public boolean action(Event evt, Object arg) { if(evt.target.equals(b1)) getAppletContext().showStatus("Button 1"); else if(evt.target.equals(b2)) getAppletContext().showStatus("Button 2"); // Let the base class handle it: else return super.action(evt, arg); return true; // We've handled it here } */ } ///:~
我们可较量两种要领,老的代码在左面作为注解。在init()要领里,只有一个改变就是增加了下面的两行:
b1.addActionListener(new B1());
b2.addActionListener(new B2());
按钮按下时,addActionListener()通知按钮工具被激活。B1和B2类都是执行接口ActionListener的内部类。这个接口包罗一个单一的要领actionPerformed()(这意味着当事件激活时,这个行动将被执行)。留意actionPreformed()要领不是一个普通事件,说得更得当些是一个非凡范例的事件,ActionEvent。假如我们想提取非凡ActionEvent的信息,因此我们不需要存心去测试和下溯造型自变量。
对编程者来说一个最好的事即是actionPerformed()十分的简朴易用。它是一个可以挪用的要领。同老的action()要领较量,老的要领我们必需指出产生了什么和适当的行动,同样,我们会担忧挪用基本类action()的版本而且返回一个值去指明是否被处理惩罚。在新的事件模子中,我们知道所有事件测试推理自动举办,因此我们不必指出产生了什么;我们方才暗示产生了什么,它就自动地完成了。假如我们还没有提出用新的要领包围老的要领,我们会很快提出。