今天比较高兴,再帖一段:做自己的组件。另请看本人下面的关于字符集编码一文,给个评价!

zhangxx73 2003-08-19 05:11:05
8.3.6 高级事件处理
默认情况下,组件屏蔽了对所有事件的响应,也就是不管发生了什么情况,事件都不会在这个组件上发生,组件都不会产生任何事件对象。只有在一个组件上注册某种事件的事件监听器对象后,组件才可以对这种事件做出响应,当发生了对应这种事件的情况后,事件才能在这个组件上发生,组件才会产生这种事件对象。
当一个组件上发生了某种事件后,系统会调用这个组件对象的processEvent方法来处理,默认的processEvent方法将根据事件的类型调用相应的processXxxEvent方法,其中Xxx代表事件类型,processXxxEvent方法接着将Xxx事件传递给注册的监听器去处理。例如,如果组件上发生了鼠标移动事件,组件对象的processEvent方法将调用processMouseMotionEvent方法进行处理。
如果我们想改变某种组件的事件处理方式,需要覆盖该组件的processEvent方法或processXxxEvent方法,processEvent是处理所有事件的总入口,而processXxxEvent是专用于处理某种事件的分岔入口。显然,如果要在一个方法中就改变所有事件的处理方式,我们需要覆盖processEvent,如果只想改变某种或少数几种事件的处理方式,而不想影响其他事件的处理方式,我们还是覆盖processXxxEvent方法,而不再直接覆盖processEvent方法为好。由于我们不可能直接进入到某个组件的processXxxEvent方法中去修改程序代码,我们需要定义一个继承了该组件的子类,在子类中覆盖processXxxEvent方法,并将原先创建的组件对象改为由这个子类创建,就可以达到我们的目的了。
就像前面讲的,如果我们没有在组件上注册Xxx事件监听器,组件就不会发生Xxx事件,我们的processXxxEvent方法根本就不可能被调用。即使没有在组件上注册事件监听器,我们只要调用了enableEvents函数,设置组件能够进行响应的事件,在相应的情况发生后,组件仍然能够产生对应的事件。enableEvents函数的定义如下:
protected final void enableEvents(long eventsToEnable)
其中,参数eventsToEnable指定了需要组件响应的事件类型所对应的数值。在我们的程序中经常要用到一类变量,这个变量里的每一位(bit)都对应某一种特性。当该变量的某位为1时,表示有该位对应的那种特性,当该位为0时,即没有那位所对应的特性。当变量中的某几位同时为1时,就表示同时具有那几种特性的组合。那种特性在我们这里就是要响应的事件类型,我们将不同的事件类型用一个不同的long型数值来表示,且每个这些数值中只有与其事件类型对应的那一位(一个bit)为1,其余的bit都为0,这样,我们就可以对多个事件类型所对应的数值进行相或(|)操作,得到的结果正好就是这几种事件类型的组合。一个数值中的哪一位代表哪种事件类型,是不容易记忆的,所以我们就将这些表示不同事件类型的long型数值定义成常量,常量名就是根据事件类型的英文拼写去定义。可见,参数eventsToEnable可以是多个事件类型所对应的数值相或的结果,我们又怎样找到表示事件类型数值的常量名呢?如果你明白了在Java中是如何定义常量的,你就应该想到在JDK文档中去查找与事件有关的类,在其中的某个类中就会有这些常量的定义的。作者看到processEvent((AWTEvent e))方法中的参数类型是AWTEvent,就很自然地想到了去AWTEvent类中查找,果然在那里看到了这些常量的定义,如鼠标移动事件对应的常量为MOUSE_MOTION_EVENT_MASK,这样,当我们想让组件响应鼠标移动事件时,我们可以使用enableEvents(AWTEvent.MOUSE_MOTION_EVENT_MASK);语句来完成。
明白了组件内部的事件处理过程和相关知识,我们现在就来编写一个这样的程序:在一个窗口上显示一个按钮,一旦鼠标移动到这个按钮上时,按钮就移动到了其他位置,这样,鼠标就永远无法点击到这个按钮。在写这个程序之前,我先讲个故事,假设有两个孙悟空,刚开始时第二个孙悟空使用了隐身术,所以你只能看见第一个孙悟空。当你靠近第一个孙悟空时,这个孙悟空马上使用了隐身术而隐藏,同时通知第二个孙悟空现身,你就会误以为第一个孙悟空跑到了第二个孙悟空的位置上。同样,当你靠近第二个孙悟空时,这个孙悟空马上使用了隐身术而隐藏,同时通知第一个孙悟空现身,这时,你以为还是第一个孙悟空又跑回到了他原来的位置。如此往复,你永远也抓不到孙悟空的,却还以为只有一个孙悟空在跑来跑去的呢!作者就使用抓孙悟空的这个思路来编写我们的程序,首先要对按钮的鼠标移动事件进行处理,所以我定义了一个Button的子类MyButton,在MyButton中对processMouseMotionEvent方法进行覆盖,在该方法中隐藏自己,显示自己的伙伴。下面是程序代码,其中的细节在前面都分析过了,就不再多说了。
程序清单:TestMyButton.java
import java.awt.*;
import java.awt.event.*;
class MyButton extends Button
{
private MyButton friend;
public void setFriend(MyButton friend)
{
this.friend = friend;
}
public MyButton(String name)
{
super(name);
enableEvents(AWTEvent.MOUSE_MOTION_EVENT_MASK);
}
protected void processMouseMotionEvent(MouseEvent e)
{
setVisible(false);
friend.setVisible(true);
}
}
public class TestMyButton
{
public static void main(String [] args)
{
MyButton btn1 =new MyButton("你来抓我呀!");
MyButton btn2 =new MyButton("你来抓我呀!");
btn1.setFriend(btn2);
btn2.setFriend(btn1);
btn1.setVisible(false);
Frame f =new Frame("www.it315.org");
f.add(btn1, "North");//将btn1增加到f的北部
f.add(btn2, "South");//将btn2增加到f的南部
f.setSize(300,300);
f.setVisible(true);
btn1.setVisible(false);
}
}

摘自www.it315.org《Java就业培训教程》
...全文
18 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
allof01 2004-01-11
  • 打赏
  • 举报
回复
是啊,字符集编码呢?我搜都没搜到你的(我只搜了最新的)。哎,太笨了。
han.bingtao 2004-01-11
  • 打赏
  • 举报
回复
字符集编码呢?
zhangxx73 2003-08-19
  • 打赏
  • 举报
回复
up

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧