动态绑定事件(java AWT)
新AWT事件模子给我们带来的一个长处就是机动性。在老的模子中我们被迫为我们的措施行动艰巨地编写代码。但新的模子我们可以用单一要领挪用增加和删除事件行动。下面的例子证明白这一点:
//: DynamicEvents.java // The new Java 1.1 event model allows you to // change event behavior dynamically. Also // demonstrates multiple actions for an event. import java.awt.*; import java.awt.event.*; import java.util.*; public class DynamicEvents extends Frame { Vector v = new Vector(); int i = 0; Button b1 = new Button("Button 1"), b2 = new Button("Button 2"); public DynamicEvents() { setLayout(new FlowLayout()); b1.addActionListener(new B()); b1.addActionListener(new B1()); b2.addActionListener(new B()); b2.addActionListener(new B2()); add(b1); add(b2); } class B implements ActionListener { public void actionPerformed(ActionEvent e) { System.out.println("A button was pressed"); } } class CountListener implements ActionListener { int index; public CountListener(int i) { index = i; } public void actionPerformed(ActionEvent e) { System.out.println( "Counted Listener " + index); } } class B1 implements ActionListener { public void actionPerformed(ActionEvent e) { System.out.println("Button 1 pressed"); ActionListener a = new CountListener(i++); v.addElement(a); b2.addActionListener(a); } } class B2 implements ActionListener { public void actionPerformed(ActionEvent e) { System.out.println("Button 2 pressed"); int end = v.size() -1; if(end >= 0) { b2.removeActionListener( (ActionListener)v.elementAt(end)); v.removeElementAt(end); } } } public static void main(String[] args) { Frame f = new DynamicEvents(); f.addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent e){ System.exit(0); } }); f.setSize(300,200); f.show(); } } ///:~
这个例子采纳的新手法包罗:
(1) 在每个按钮上附着不少于一个的吸收器。凡是,组件把事件作为多造型处理惩罚,这意味着我们可觉得单个事件注册很多吸收器。当在非凡的组件中一个事件作为单一造型被处理惩罚时,我们会获得TooManyListenersException(即太多吸收器异常)。
(2) 措施执行期间,吸收器动态地被从按钮B2中增加和删除。增加用我们前面见到过的要领完成,但每个组件同样有一个removeXXXListener()(删除XXX吸收器)要领来删除各类范例的吸收器。
这种机动性为我们的编程提供了更强大的本领。
我们留意到事件吸收器不能担保在呼吁他们被增加时可被挪用(固然事实上大部门的执行事情都是用这种要领完成的)。