java捕捉事件
各人可留意到如果编译和运行上面的措施片,按下按钮后不会产生任何工作。必需进入措施片内部,编写用于抉择要产生什么工作的代码。对付由事件驱动的措施设计,它的根基方针就是用代码捕捉产生的事件,并由代码对那些事件作出响应。事实上,GUI的大部门内容都是环绕这种事件驱动的措施设计展开的。
颠末本书前面的进修,各人应该有了面向工具措施设计的一些基本,此时大概会想到该当有一些面向工具的要领来专门节制事件。譬喻,也许不得不担任每个按钮,并过载一些“按钮按下”要领(尽量这显得很是贫苦有有限)。各人也大概认为存在一些主控“事件”类,个中为但愿响应的每个事件都包括了一个要领。
在工具以前,事件节制的典范方法是switch语句。每个事件都对应一个唯一无二的整数编号;并且在主事件节制要领中,需要专门为谁人值写一个switch。
Java 1.0的AWT没有回收任何面向工具的手段。另外,它也没有利用switch语句,没有规划依靠那些分派给事件的数字。相反,我们必需建设if语句的一个嵌套系列。通过if语句,我们需要实验做的工作是侦测到作为事件“方针”的工具。换言之,那是我们体贴的全部内容——如果某个按钮是一个事件的方针,那么它必定是一次鼠标点击,并要基于谁人假设继承下去。可是,事件里也大概包括了其他信息。譬喻,如果想观测一次鼠标点击的像素位置,以便画一条引向谁人位置的线,那么Event工具里就会包括谁人位置的信息(也要留意Java 1.0的组件只能发生有限种类的事件,而Java 1.1和Swing/JFC组件则可发生完整的一系列事件)。
Java 1.0版的AWT要领串联的条件语句中存在action()要领的挪用。固然整个Java 1.0版的事件模子不兼容Java 1.1版,但它在还不支持Java1.1版的呆板和运行简朴的措施片的系统中更遍及地利用,忠告您利用它会变得很是的舒适,包罗对下面利用的action()措施要领而言。
action()拥有两个自变量:第一个是事件的范例,包罗所有的触发挪用action()的事件的有关信息。譬喻鼠标单击、普通按键按下或释放、非凡按键按下或释放、鼠标移动可能拖动、事件组件获得或丢失核心,等等。第二个自变量凡是是我们忽略的事件方针。第二个自变量封装在事件方针中,所以它像一个自变量一样的冗长。
需挪用action()时环境很是有限:将控件置入窗体时,一些范例的控件(按钮、复选框、下拉列表单、菜单)会产生一种“尺度动作”,从而随相应的Event工具提倡对action()的挪用。好比对按钮来说,一旦按钮被按下,并且没有再多按一次,就会挪用它的action()要领。这种行为凡是正是我们所但愿的,因为这正是我们对一个按钮正常观感。但正如本章后头要讲到的那样,还可通过handleEvent()要领来处理惩罚其他很多范例的事件。
前面的例程可举办一些扩展,以便象下面这样节制按钮的点击:
//: Button2.java // Capturing button presses import java.awt.*; import java.applet.*; public class Button2 extends Applet { Button b1 = new Button("Button 1"), b2 = new Button("Button 2"); public void init() { add(b1); add(b2); } 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 } } ///:~
为相识方针是什么,需要向Event工具询问它的target(方针)成员是什么,然后用equals()要领查抄它是否与本身感乐趣的方针工具句柄相符。为所有感乐趣的工具写好句柄后,必需在末端的else语句中挪用super.action(evt, arg)要领。我们在第7章已经说过(有关多形性的那一章),此时挪用的是我们过载过的要领,而非它的基本类版本。然而,基本类版本也针对我们不感乐趣的所有环境提供了相应的节制代码。除非明晰举办,不然它们是不会获得挪用的。返回值指出我们是否已经处理惩罚了它,所以如果确实与一个事件相符,就应返回true;不然就返回由基本类event()返回的对象。
对这个例子来说,最简朴的动作就是打印出到底是什么按钮被按下。一些系统答允你弹出一个小动静窗口,但Java措施片却防碍窗口的弹出。不外我们可以用挪用Applet要领的getAppletContext()来会见欣赏器,然后用showStatus()在欣赏器窗口底部的状态栏上显示一条信息(注释③)。还可用同样的要领打印出对事件的一段完整说明文字,要领是挪用getAppletConext().showStatus(evt + "")。空字串会强制编译器将evt转换成一个字符串。这些陈诉对付测试和调试出格有用,因为欣赏器大概会包围我们的动静。
③:ShowStatus()也属于Applet的一个要领,所以可直接挪用它,不必挪用getAppletContext()。
尽量看起来好像很奇怪,但我们确实也能通过event()中的第二个参数将一个事件与按钮上的文字相配。回收这种要领,上面的例子就酿成了:
//: Button3.java // Matching events on button text import java.awt.*; import java.applet.*; public class Button3 extends Applet { Button b1 = new Button("Button 1"), b2 = new Button("Button 2"); public void init() { add(b1); add(b2); } public boolean action (Event evt, Object arg) { if(arg.equals("Button 1")) getAppletContext().showStatus("Button 1"); else if(arg.equals("Button 2")) getAppletContext().showStatus("Button 2"); // Let the base class handle it: else return super.action(evt, arg); return true; // We've handled it here } } ///:~
#p#分页标题#e#
很难确切知道equals()要领在这儿要做什么。这种要领有一个很大的问题,就是开始利用这个新技能的Java措施员至少需要耗费一个受荆棘的时期来在较量按钮上的文字时发明他们要么大写了要么写错了(我就有这种履历)。同样,假如我们改变了按钮上的文字,措施代码将不再事情(但我们不会获得任何编译时和运行时的信息)。所以假如大概,我们就得制止利用这种要领。