按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
lst。addItem(flavors'count++');
add(t);
add(lst);
add(b);
}
public boolean action (Event evt; Object arg) {
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 if(evt。target。equals(b)) {
if(count 《 flavors。length)
lst。addItem(flavors'count++'; 0);
}
else
return super。action(evt; arg);
return true;
}
} ///:~
按下按钮时,按钮增加项目到列表的顶部(因为addItem()的第二个自变量为零)。增加项目到列表框比到
选择框更加的合理,因为用户期望去滚动一个列表框(因为这个原因,它有内建的滚动条)但用户并不愿意
像在前面的例子里不得不去计算怎样才能滚动到要要的那个项目。
然而,调用 action()的唯一方法就是通过双击。如果我们想监视用户在我们的列表中的所作所为(尤其是单
击),我们必须提供一个可供选择的方法。
13。11。1 handleEvent()
到目前为止,我们已使用了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 {
391
…………………………………………………………Page 393……………………………………………………………
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()
值。这便是程序的核心,如果我们不那样做,其它的任何一个事件处理代码也不会被调用。例如,试注解在
392
…………………………………………………………Page 394……………………………………………………………
上面的代码中返回 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 将所有的鼠标、键盘、焦点事件传
送到列表中,所以我们能够完成它。)
13。12 布局的控制
在Java 里该方法是安一个组件到一个窗体中去,它不同我们使用过的其它GUI 系统。首先,它是全代码的;
没有控制安放组件的“资源”。其次,该方法的组件被安放到一个被“布局管理器”控制的窗体中,由“布
局管理器”根据我们add()它们的决定来安放组件。大小,形状,组件位置与其它系统的布局管理器显著的
不同。另外,布局管理器使我们的程序片或应用程序适合窗口的大小,所以,如果窗口的尺寸改变(例如,
在HTML 页