正如早先指出的那样,action()并不是我们对所有事进行分类后自动为handleEvent()调用的唯一方法。有三个其它的被调用的方法集,如果我们想捕捉某些类型的事件(键盘、鼠标和焦点事件),因此我们不得不过载规定的方法。这些方法是定义在基础类组件里,所以他们几乎在所有我们可能安放在窗体中的组件中都是有用的。然而,我们也注意到这种方法在java中是不被支持的,同样尽管我们可能注意到继承代码利用了这种方法,我们将会使用Java的方法来代替。

组件方法 何时调用

action(Event evt, Object what) 当典型的事件针对组件发生(例如,当按下一个按钮或下拉列表项目被选中)时调用

keyDown(Event evt, int key) 当按键被按下,组件拥有焦点时调用。第二个自变量是按下的键并且是冗余的是从evt.key处复制来的

keyup(Event evt, int key) 当按键被释放,组件拥有焦点时调用

lostFocus(Event evt, Object what) 焦点从目标处移开时调用。通常,what是从evt.arg里冗余复制的

gotFocus(Event evt, Object what) 焦点移动到目标时调用

mouseDown(Event evt, int x,int y) 一个鼠标按下存在于组件之上,在X,Y座标处时调用

mouseUp(Event evt, int x, int y) 一个鼠标升起存在于组件之上时调用

mouSEMove(Event evt, int x, int y) 当鼠标在组件上移动时调用

mouseDrag(Event evt, int x, int y) 鼠标在一次mouseDown事件发生后拖动。所有拖动事件都会报告给内部发生了mouseDown事件的那个组件,直到遇到一次mouseUp为止

mouseEnter(Event evt, int x, int y) 鼠标从前不在组件上方,但目前在

mouseExit(Event evt, int x, int y) 鼠标曾经位于组件上方,但目前不在

当我们处理特殊情况时——一个鼠标事件,例如,它恰好是我们想得到的鼠标事件存在的座标,我们将看到每个程序接收一个事件连同一些我们所需要的信息。有趣的是,当组件的handleEvent()调用这些方法时(典型的事例),附加的自变量总是多余的因为它们包含在事件对象里。事实上,如果我们观察component.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);

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

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);

}

} ///:~

我们可以看到构建器使用利用自变量同名的方法,所以自变量被赋值,并且使用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中的字符串陈述。从我们可以真正注意到举出的例子在我们的程序中运行事件时以来,可以发现这个例子运行起来颇为有趣的。

java中的action_浅析java中action的作用相关推荐

  1. java printf与println_浅析Java中print、printf、println的区别

    我们的程序员在开发的时候,都会使用到很多不同的功能,但是有些功能是大同小异,别着急,下文是爱站技术频道小编为大家带来的浅析Java中print.printf.println的区别,希望对你学习有帮助! ...

  2. java 反射 Gc_深入浅析Java反射机制

    Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反 ...

  3. java 线程状态_浅析Java中的线程状态

    一.线程的5种状态 众所周知,Java的线程状态有5种,分别对应上图中五种不同颜色,下面对这5种状态及状态间的转化做相应的解释: 1. 初始化状态:新建一个线程对象 2. 可运行状态:其他线程调用了该 ...

  4. java深度克隆_浅析Java中clone()方法浅克隆与深度克隆

    现在Clone已经不是一个新鲜词语了,伴随着"多莉"的产生这个词语确实很"火"过一阵子,在Java中也有这么一个概念,它可以让我们很方便的"制造&qu ...

  5. java group类_浅析Java中线程组(ThreadGroup类)

    Java中使用ThreadGroup类来代表线程组,表示一组线程的集合,可以对一批线程和线程组进行管理.可以把线程归属到某一个线程组中,线程组中可以有线程对象,也可以有线程组,组中还可以有线程,这样的 ...

  6. java变量同名_浅析Java中局部变量与成员变量同名解决技巧

    要想区分这哥俩,首先,我们得知道它们分别是什么.先从成员变量下刀. 成员变量 我们来研究一个事物: 属性:外在特征:例如人的身高,体重 行为:能够做什么:例如人有说话,打球等行为. 而在Java语言中 ...

  7. java的finally_深入浅析java中finally的用法

    finally作为异常处理的一部分,它只能用在try/catch语句中,并且附带一个语句块,表示这段语句最终一定会被执行(不管有没有抛出异常),经常被用在需要释放资源的情况下. 之前在写爬虫的时候数据 ...

  8. Java的反射作用_浅析Java 反射机制的用途和缺点

    反射的用途 Uses of Reflection Reflection is commonly used by programs which require the ability to examin ...

  9. java 越来越慢_浅析Java语言慢的原因

    Java在早期(比如JDK1.2以前)是很慢的,后续版本由于有许多优化手段的加入,Java正变得越来越快,所以现在也有很多关于Java和C/C++孰快孰慢的争论.我想就我自己的理解,谈一下影响Java ...

最新文章

  1. ClassNotFoundException和NoClassDefFoundError的区别
  2. php+gd库的源码安装
  3. linux rc4,Linux kernel 4.8-rc4发布下载,正式版越来越近
  4. 跨设备链路聚合_路由与交换技术(华为设备)第五讲---链路聚合
  5. java xml html_使用Java将XSL和XML文件输出为HTML(XSL学习笔记二)
  6. HDU2966 In case of failure(浅谈k-d tree)
  7. golang nats request/reply模式
  8. mysql序列化字段反序列化_序列化serialize()与反序列化unserialize()的实例
  9. Unigam标注和Ngram标注
  10. java int转integer方法
  11. 侵入式框架和非侵入式框架的区别
  12. python运维之路
  13. Delphi 2007安装问题
  14. 小确幸BBS论坛-2-首页
  15. php 读写局域网文件,PHP访问局域网共享文件
  16. PE装机工具-U深度制作
  17. pil库修改图片大小_利用pillow库(PIL)批量修改图片尺寸
  18. springboot证书管理系统的设计与实现毕业设计源码162317
  19. java初学者学习路线
  20. 关于java的国内外论坛地址分享

热门文章

  1. Scala函数式编程(三) scala集合和函数
  2. FastThreadLocal吞吐量居然是ThreadLocal的3倍
  3. C++ 笔记(06)— 变量作用域(局部变量、全局变量、静态局部变量)
  4. WCF服务端返回:(413) Request Entity Too Large
  5. JQuery EasyUI的常用组件
  6. 下一个亿万市场:企业级SaaS服务谁能独领风骚
  7. 对比两个同类型的泛型集合并返回差异泛型集合 ——两个List类名的比较
  8. 详述FileUpload 控件上传单文件
  9. 初学 Delphi 嵌入汇编[3] - 第一个 Delphi 与汇编的例子
  10. 大型企业门户网站设计开发一般性原则和建议