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

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

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




  

当我们处理特殊情况时——一个鼠标事件,例如,它恰好是我们想得到的鼠标事件存在的座标,我们将看到 

每个程序接收一个事件连同一些我们所需要的信息。有趣的是,当组件的 handleEvent()调用这些方法时 

 (典型的事例),附加的自变量总是多余的因为它们包含在事件对象里。事实上,如果我们观察 

ponent。handleEvent()的源代码,我们能发现它显然将增加的自变量抽出事件对象(这可能是考虑到在一 

些语言中无效率的编码,但请记住 Java 的焦点是安全的,不必担心。)试验对我们表明这些事件事实上在被 

调用并且作为一个有趣的尝试是值得创建一个过载每个方法的程序片,(action()的过载在本章的其它地 

方)当事件发生时显示它们的相关数据。  

这个例子同样向我们展示了怎样制造自己的按钮对象,因为它是作为目标的所有事件权益来使用。我可能会 

首先(也是必须的)假设制造一个新的按钮,我们从按钮处继承。但它并不能运行。取而代之的是,我们从 

画布组件处(一个非常普通组件)继承,并在其上不使用 paint()方法画出一个按钮。正如我们所看到的, 

自从一些代码混入到画按钮中去,按钮根本就不运行,这实在是太糟糕了。(如果您不相信我,试图在例子 

中为画布组件交换按钮,请记住调用称为super 的基础类构建器。我们会看到按钮不会被画出,事件也不会 

被处理。)  

myButton 类是明确说明的:它只和一个自动事件(AutoEvent)“父窗口”一起运行(父窗口不是一个基础 

类,它是按钮创建和存在的窗口。)。通过这个知识,myButton 可能进入到父窗口并且处理它的文字字段, 

必然就能将状态信息写入到父窗口的字段里。当然这是一种非常有限的解决方法,myButton 仅能在连结 

AutoEvent 时被使用。这种代码有时称为“高度结合”。但是,制造myButton 更需要很多的不是为例子(和 

可能为我们将写的一些程序片)担保的努力。再者,请注意下面的代码使用了Java 1。1 版不支持的 API。  

  

//: AutoEvent。java  

// Alternatives to action()  

import java。awt。*;  

import java。applet。*;  

import java。util。*;  

  

class MyButton extends Canvas {  

  AutoEvent parent;  

  Color color;  

  String label;  

  MyButton(AutoEvent parent;   

           Color color; String label) {  

    this。label = label;  

    this。parent = parent;  

    this。color = color;  

  }  

  public void paint(Graphics  g) {  

    g。setColor(color);  

    int rnd = 30;  

    g。fillRoundRect(0; 0; size()。width;   

                    size()。height; rnd; rnd);  

    g。setColor(Color。black);  



                                                                                    397 


…………………………………………………………Page 399……………………………………………………………

    g。drawRoundRect(0; 0; size()。width;   

                    size()。height; rnd; rnd);  

    FontMetrics fm = g。getFontMetrics();  

    int width = fm。stringWidth(label);  

    int height = fm。getHeight();  

    int ascent = fm。getAscent();  

    int leading = fm。getLeading();  

    int horizMargin = (size()。width width)/2;  

    int verMargin = (size()。height height)/2;  

    g。setColor(Color。white);  

    g。drawString(label; horizMargin;   

                 verMargin + ascent + leading);  

  }  

  public boolean keyDown(Event evt; int key) {  

    TextField t =   

      (TextField)parent。h。get(〃keyDown〃);  

    t。setText(evt。toString());  

    return true;  

  }  

  public boolean keyUp(Event evt; int key) {  

    TextField t =   

      (TextField)parent。h。get(〃keyUp〃);  

    t。setText(evt。toString());  

    return true;  

  }  

  public boolean lostFocus(Event evt; Object w) {  

    TextField t =   

      (TextField)parent。h。get(〃lostFocus〃);  

    t。setText(evt。toString());  

    return true;  

  }  

  public boolean gotFocus(Event evt; Object w) {  

    TextField t =   

      (TextField)parent。h。get(〃gotFocus〃);  

    t。setText(evt。toString());  

    return true;  

  }  

  public boolean   

  mouseDown(Event evt;int x;int y) {  

    TextField t =   

      (TextField)parent。h。get(〃mouseDown〃);  

    t。setText(evt。toString());  

    return true;  

  }  

  public boolean   

  mouseDrag(Event evt;int x;int y) {  

    TextField t =   

      (TextField)parent。h。get(〃mouseDrag〃);  

    t。setText(evt。toString());  

    return true;  

  }  

  public boolean   



                                                                                        398 


…………………………………………………………Page 400……………………………………………………………

  mouseEnter(Event evt;int x;int y) {  

    TextField t =   

      (TextField)parent。h。get(〃mouseEnter〃);  

    t。setText(evt。toString());  

    return true;  

  }  

  public boolean   

  mouseExit(Event evt;int x;int y) {  

    TextField t =   

      (TextField)parent。h。get(〃mouseExit〃);  

    t。setText(evt。toString());  

    return true;  

  }  

  public boolean   

  mouseMove(Event evt;int x;int y) {  

    TextField t =   

      (TextField)parent。h。get(〃mouseMove〃);  

    t。setText(evt。toString());  

    return true;  

  }  

  public boolean mouseUp(Event evt;int x;int y) {  

    TextField t =   

      (TextField)parent。h。get(〃mouseUp〃);  

    t。setText(evt。toString());  

    return true;  

  }  

}  

  

public class AutoEvent extends Applet {  

  Hashtable h = new Hashtable();  

  String'' event = {  

    〃keyDown〃; 〃keyUp〃; 〃lostFocus〃;   

    〃gotFocus〃; 〃mouseDown〃; 〃mouseUp〃;   

    〃mouseMove〃; 〃mouseDrag〃; 〃mouseEnter〃;   

    〃mouseExit〃  

  };  

  MyButton   

    b1 = new MyButton(this; Color。blue; 〃test1〃);  

    b2 = new MyButton(this; Color。red; 〃test2〃);  

  public void init() {  

    setLayout(new GridLayout(event。length+1;2));  

    for(int i = 0; i 《 event。length; i++) {  

      TextField t = new TextField();  

      t。setEditable(false);  

      add(new Label(event'i'; Label。CENTER));   

      add(t);  

      h。put(event'i'; t);  

    }  

    add(b1);  

    add(b2);  

  }  



                                                                                             399 


…………………………………………………………Page 401……………………………………………………………

} ///:~  

  

我们可以看到构建器使用利用自变量同名的方法,所以自变量被赋值,并且使用 this 来区分:  

this。label = label;  

paint()方法由简单的开始:它用按钮的颜色填充了一个“圆角矩形”,然后画了一个黑线围绕它。请注意 

size()的使用决定了组件的宽度和长度(当然,是像素)。这之后,paint()看起来非常的复杂,因为有大量 

的预测去计算出怎样利用“font metrics”集中按钮的标签到按钮里。我们能得到一个相当好的关于继续关 

注方法调用的主意,它将程序中那些相当平凡的代码挑出,当我们想集中一个标签到一些组件里时,我们正 

好可以对它进行剪切和粘贴。  

您直到注意到AutoEvent 类才能正确地理解 keyDown();keyUp()及其它方法的运行。这包含一个Hashtable 

 (译者注:散列表)去控制字符串来描述关于事件处理的事件和TextField 类型。当然,这些能被静态的创 

建而不是放入Hashtable 但我认为您会同意它是更容易使用和改变的。特别是,如果我们需要在AutoEvent 

中增加或删除一个新的事件类型,我们只需要简单地在事件列队中增加或删除一个字符串——所有的工作都 

自动地完成了。  

我们查出在 keyDown(),keyup()及其它方法中的字符串的位置回到 myButton 中。这些方法中的任何一个都 

用父句柄试图回到父窗口。父类是一个AutoEvent,它包含Hashtable h 和get()方法,当拥有特定的字符串 

时,将对一个我们知道的TextField 对象产生一个句柄(因此它被选派到那)。然后事件对象修改显示在 

TextField 中的字符串陈述。从我们可以真正注意到举出的例子在我们的程序中运行事件时以来,可以发现 

这个例子运行起来颇为有趣的。  



13。14 程序片的局限  



出于安全缘故,程序片十分受到限制,并且有很多的事我们都不能做。您一般会问:程序片看起来能做什 

么,传闻它又能做什么:扩展浏览器中WEB 页的功能。自从作为一个网上冲浪者,我们从未真正想了解是否 

一个WEB 页来自友好的或者不友好的站点,我们想要一些可以安全地行动的代码。所以我们可能会注意到大 

量的限制:  

(1) 一个程序片不能接触到本地的磁盘。这意味着不能在本地磁盘上写和读,我们不想一个程序片通过WEB 

页面阅读和传送重要的信息。写是被禁止的,当然,因为那将会引起病毒的侵入。当数字签名生效时,这些 

限制会被解除。  

(2) 程序片不能拥有菜单。(注意:这是规定在Swing 中的)这可能会减少关于安全和关于程序简化的麻 

烦。我们可能会接到有关程序片协调利益以作为WEB 页面的一部分的通知;而我们通常不去注意程序片的范 

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