友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
一世书城 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

Java编程思想第4版[中文版](PDF格式)-第130章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 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 页面的程序片指定的规格),组件的大小,形状和位置都会改变。  

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

器中,调用 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 BorderLayout  

返回目录 上一页 下一页 回到顶部 0 0
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!