八宝书库 > 文学其他电子书 > Java编程思想第4版[中文版](PDF格式) >

第104部分

Java编程思想第4版[中文版](PDF格式)-第104部分

小说: Java编程思想第4版[中文版](PDF格式) 字数: 每页4000字

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




  }  

} ///:~  

  

文本字字段中显示的“selected index;〃也就是当前选择的项目的序列号,在事件中选择的字符串就像 

action()的第二个自变量的字串符描述的一样好。  

运行这个程序片时,请注意对 Choice 框大小的判断:在 windows 里,这个大小是在我们拉下列表时确定的。 

这意味着如果我们拉下列表,然后增加更多的项目到列表中,这项目将在那,但这个下拉列表不再接受(我 

们可以通过项目来滚动观察——注释④)。然而,如果我们在第一次拉下下拉列表前将所的项目装入下拉列 

表,它的大小就会合适。当然,用户在使用时希望看到整个的列表,所以会在下拉列表的状态里对增加项目 

到选择框里加以特殊的限定。  

  

④:这一行为显然是一种错误,会 Java 以后的版本里解决。  



13。11 列表框  



列表框与选择框有完全的不同,而不仅仅是当我们在激活选择框时的显示不同,列表框固定在屏幕的指定位 

置不会改变。另外,一个列表框允许多个选择:如果我们单击在超过一个的项目上,未选择的则表现为高亮 

度,我们可以选择象我们想要的一样的多。如果我们想察看项目列表,我们可以调用 getSelectedItem()来 

产生一个被选择的项目列表。要想从一个组里删除一个项目,我们必须再一次的单击它。列表框,当然这里 

有一个问题就是它默认的动作是双击而不是单击。单击从组中增加或删除项目,双击调用action() 。解决这 

个问题的方法是象下面的程序假设的一样重新培训我们的用户。  

  

//: List1。java  

// Using lists with action()  

import java。awt。*;  

import java。applet。*;  

  

public class List1 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;  



                                                                                          390 


…………………………………………………………Page 392……………………………………………………………

  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 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 页面的程序片指定的规格),组件的大小,形状和位置都会改变。  

程序片和帧类都是来源于包含和显示组件的容器。(这个容器也是一个组件,所以它也能响应事件。)在容 

器中,调用 setLayout()方法允许我选择不同的布局管理器。  

在这节里我们将探索不同的布局管理器,并安放按钮在它们之上。这里没有捕捉按钮的事件,正好可以演示 

如何布置这些按钮。  



13。12。1 FlowLayout  



到目前为止,所有的程序片都被建立,看起来使用一些不可思议的内部逻辑来布置它们的组件。那是因为程 

序使用一个默认的方式:FlowLayout。这个简单的“Flow ”的组件安装在窗体中,从左到右,直到顶部的空 

格全部再移去一行,并继续循环这些组件。  

这里有一个例子明确地(当然也是多余地)设置一个程序片的布局管理器去FlowLayout,然后在窗体中安放 

按钮。我们将注意到FlowLayout 组件使用它们本来的大小。例如一个按钮将会变得和它的字串符一样的大 

小。  

  

//: FlowLayout1。java  

// Demonstrating the FlowLayout  

import java。awt。*;  

import java。applet。*;  

  

public class FlowLayout1 extends Applet {  

  public void init() {  

    setLayout(new FlowLayout());  

    for(int i = 0; i 《 20; i++)  

      add(new Button(〃Button 〃 + i));  

  }  

} ///:~  

  

所有组件将在FlowLayout 中被压缩为它们的最小尺寸,所以我们可能会得到一些奇怪的状态。例如,一个标 

签会合适它自已的字符串的尺寸,所以它会右对齐产生一个不变的显示。  



13。12。2 BorderLayout  



布局管理器有四边和中间区域的概念。当我们增加一些事物到使用 BorderLayout 的面板上时我们必须使用 

add()方法将一个字符串对象作为它的第一个自变量,并且字符串必须指定(正确的大写)“North” 

 (上),“South”(下),“west ”(左),“East ”(右)或者“Center”。如果我们拼写错误或没有大 

写,就会得到一个编译时的错误,并且程序片不会像你所期望的那样运行。幸运的是,我们会很快发现在 



                                                                           393 


…………………………………………………………Page 395……………………………………………………………

Java 1。1 中有了更多改进。  

这是一个简单的程序例子:  

  

//: BorderLayout1。java  

// Demonstrating the BorderLayo

返回目录 上一页 下一页 回到顶部 0 1

你可能喜欢的