什么是事件,其实很简!

shangqiao 2003-08-08 10:00:46
我们在自己建立事件时,一般都是先建立一个自定义的事件类MyEvent继承于EventObject,再建立一个事件响应MyEventListener继承与EventListener,然后是建立一个自己的应用类来用我们自己这个事件:
如下:
public class MyFontEvent extends java.util.EventObject{
private int fontSize;;
private String fontName;
private int fontStyle;
private Object source;
public int getID(){return this.id;}
public int getFontStyle(){return this.fontStyle;}
public String getFontName(){return this.fontName;}
public MyEvent(Object source,String fontName,int fontStyle,int fontSize){
super(source);
this.fontName=fontName;
this.fontSize=fontSize;
this.fontStyle=fontStyle;
}
}
public interface MyEventListener extends java.util.EventListener{
public void myEventChanged(MyEvent event);
}
public class MyButton extends JButton{
public MyButton(String str){
super(str);
}
public void setFontSize(int size){
Font font=this.getFont();
Font newFont=new Font(font.getName(),font.getStyle(),size);
this.setFont(newFont);
fireFontChanged(new MyFontEvent(this,newFont.getName(),newFont.getStyle(),newFont.getSize());
}
public void setFontName(String fontName){
...
}
public void setFontStyle(int style){
...
}
public void addMyFontEventListener(MyEventListener listener){
listenerList.add(MyEventListener.class,listener);//其中的listenerList是继承与JComponet而来的
}
public void removeMyFontListener(MyEventListener listener){
listenerList.remove(MyEventListener.class,listener);
}
protected void fireFontChanged(MyFontEvent event){
EventListener[] list=(MyEventListener)(listenerList.getListerner(MyEventListerList.class));
for(int i=0;i<list.length;i++){
list[i].myEventChanged(event);
}
}
}
现在我们只是写一个类来用我们这个例子而已,在这里就不在写了。我们要做的就只是在这个类中的某个地方调用setFontSize(),setFontName()...而已,这可以在某个响应中如actionPerformed(),propertChanged()...
我们现在来分析一下他怎么实现的呢?

我们在代码中调用setFontSize()时,先是改变字体大小,然后是调用 fireFontChanged(),这时候先是在整个listenerList中取出所有MyEventListener(我们在写addMyFontListener()时已经添加了进去,其实listenerList就是一个数组,他的元素必须是EventListerer而已),再挨个激发每个listerner的myEventChanged.

那么为什么我们要继承EventObject,EventListener呢,那只是因为listenerList里面只能添加EventListener元素而已,假如你愿意你也可以不用listenerList,就可以不用继承了。

现在看来,事件响应的过程就是一个反射机制(不要说你不懂反射是何物!)

附:上面的代码是继承与JComponent,假如是其他的基类,只要你添加一个EventListener[] listenerList就可以了。

我的java也是刚学不久,不知道上面的说错了没有,好望高手指点,斧正,在此谢过!
...全文
46 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
gridcomputing 2003-08-09
  • 打赏
  • 举报
回复
sign
shangqiao 2003-08-09
  • 打赏
  • 举报
回复
上面有个地方错了,listenerList是EventListenerList类型,抱歉!
还有好多笔误(楼上说的构造函数,还真谢谢你能够细心看完),不好意思呀!哈哈...
至于为什么都是public class,这有什么关系么,只要不写在一个文件里面就可以.
baozi3026 2003-08-08
  • 打赏
  • 举报
回复
public int getID(){return this.id;}

id在哪儿定义了的????

public class MyFontEvent extends java.util.EventObject

你的构造函数却是MyEvent...

而且你怎么都是public class啊...

我也才学不久~~`不知道上面我说的这么是不是错误~`如果是我不懂的请讲讲~
baozi3026 2003-08-08
  • 打赏
  • 举报
回复
啊~~~~~~~~~~~~~~``````

^^
duoshanx 2003-08-08
  • 打赏
  • 举报
回复
指点,斧正 还想一两银子也不拿呀?!

sign 春天来了......
beyondii 2003-08-08
  • 打赏
  • 举报
回复
sign

62,614

社区成员

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

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