到今朝为止,我们已利用了action(),现有另一种要领handleEvent()可对每一事件举办实验。当一个事件产生时,它老是针对单独事件或产生在单独的事件工具上。该工具的handleEvent()要领是自动挪用的,而且是被handleEvent()建设并通报到handleEvent()里。默认的handleEvent()(handleEvent()界说在组件里,基本类的所有控件都在AWT里)将像我们以前一样挪用action()或其它同样的要领去指明鼠标的勾当、键盘勾当可能指明移动的核心。我们将会在本章的后头部门看到。
假如其它的要领-出格是action()-不能满意我们的需要怎么办呢?至于列表框,譬喻,假如我想捕获鼠标单击,但action()只响应双击怎么办呢?这个解答是过载handleEvent(),究竟它是从措施片中获得的,因此可以过载任何非确定的要领。当我们为措施片过载handleEvent()时,我们会获得所有的事件在它们发送出去之前,所以我们不能假设“这里有我的按钮可做的事件,所以我们可以假设按钮被按下了”从它被action()设为真值。在handleEvent()中按钮拥有核心且或人对它举办分派都是大概的。岂论它公道与否,我们可测试这些事件并遵照handleEvent()来举办操纵。
为了修改列表样本,使它会响应鼠标的单击,在action()中按钮测试将被过载,但代码会处理惩罚的列表将像下面的例子被移进handleEvent()中去:
//: List2.java // Using lists with handleEvent() import java.awt.*; import java.applet.*; public class List2 extends Applet { String[] flavors = { "Chocolate", "Strawberry", "Vanilla Fudge Swirl", "Mint Chip", "Mocha Almond Fudge", "Rum Raisin", "Praline Cream", "Mud Pie" }; // Show 6 items, allow multiple selection: List lst = new List(6, true); TextArea t = new TextArea(flavors.length, 30); Button b = new Button("test"); int count = 0; public void init() { t.setEditable(false); for(int i = 0; i < 4; i++) lst.addItem(flavors[count++]); add(t); add(lst); add(b); } public boolean handleEvent(Event evt) { if(evt.id == Event.LIST_SELECT || evt.id == Event.LIST_DESELECT) { if(evt.target.equals(lst)) { t.setText(""); String[] items = lst.getSelectedItems(); for(int i = 0; i < items.length; i++) t.appendText(items[i] + "\n"); } else return super.handleEvent(evt); } else return super.handleEvent(evt); return true; } public boolean action(Event evt, Object arg) { if(evt.target.equals(b)) { if(count < flavors.length) lst.addItem(flavors[count++], 0); } else return super.action(evt, arg); return true; } } ///:~
这个例子同前面的例子沟通除了增加了handleEvent()外的确一模一样。在措施中做了试验来验证是否列表框的选择和非选择存在。此刻请记着,handleEvent()被措施片所过载,所以它能在窗体中任何存在,而且被其它的列表当成事件来处理惩罚。因此我们同样必需通过试验来调查方针。(固然在这个例子中,措施片中只有一个列表框所以我们能假设所有的列表框事件必需处事于列表框。这是一个欠好的习惯,一旦其它的列表框插手,它就会酿成措施中的一个缺陷。)假如列表框匹配一个我们感乐趣的列表框,像前面的一样的代码将按上面的计策来运行。留意handleEvent()的窗体与action()的沟通:假如我们处理惩罚一个单独的事件,将返回真值,但假如我们对其它的一些事件不感乐趣,通过handleEvent()我们必需返回super.handleEvent()值。这即是措施的焦点,假如我们不那样做,其它的任何一个事件处理惩罚代码也不会被挪用。譬喻,试注解在上面的代码中返回super.handleEvent(evt)的值。我们将发明action()没有被挪用,虽然那不是我们想获得的。对action()和handlEvent()而言,最重要的是随着上面例子中的名目,而且当我们本身不处理惩罚事件时一直返回基本类的要领版本信息。(在例子中我们将返回真值)。(幸运的是,这些范例的错误的仅属于Java 1.0版,在本章后头将看到的新设计的Java 1.1消除了这些范例的错误。)
在windows里,假如我们按下shift键,列表框自动答允我们做多个选择。这很是的棒,因为它答允用户做单个或多个的选择而不是编程期间牢靠的。我们大概会认为我们变得越发的夺目,而且当一个鼠标单击被evt.shiftdown()发生时假如shift键是按下的将执行我们本身的试验措施。AWT的设计故障了我们-我们不得不去相识哪个项目被鼠标点击时是否按下了shift键,所以我们能打消其余部门所有的选择而且只选择那一个。不管奈何,我们是不行能在Java 1.0版中做出来的。(Java 1.1将所有的鼠标、键盘、核苦衷件传送到列表中,所以我们可以或许完成它。)