日期:2011-03-22 16:16:00 来源:本站整理
java action的替用品[Java编程]
本文“java action的替用品[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
正如早先指出的那样,action()并非我们对全部事举行分类后自动为handleEvent()调用的唯一办法.有三个别的的被调用的办法集,假如我们想捕捉某些范例的事件(键盘、鼠标和核心事件),因此我们不得不过载规定的办法.这些办法是定义在底子类组件里,所以他们几近在全部我们大概安设在窗体中的组件中都是有效的.但是,我们也注意到这种办法在Java 1.1版中是不被支持的,一样固然我们大概注意到担当代码操纵了这种办法,我们将会利用Java 1.1版的办法来替换(本章背面有具体介绍).
组件办法 什么时刻调用
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.
我们可以看到构建器利用操纵自变量同名的办法,所以自变量被赋值,并且利用this来辨别://: 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.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编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论