这里写得是后面数据报编程用到的测试程序,这个程序包括一套自定义事件,一个能滚动的显示图象的java bean组件。
在面向对象的程序设计中,事件消息(event message)是对象间通信的基本方式。在图形用户界面程序中,gui组件对象根据用户的交互产生各种类型的事件消息,这些事件消息由应用程序的事件处理代码捕获,在进行相应的处理后驱动消息响应对象做出反应。
对于本程序,需求是这样的:数据接收器把数据接收完毕时,要产生事件,该事件将激活事件处理器.为此要自定义相关对象类,在java中定义用户事件对象包括定义事件监听器和定义事件类,使用上和标准事件方式是一样的.
要定义的类包括:dataswapevent,dataswaplistener,同时还实现了一个包装器类dataswaplisteneradapter类.
dataswapevent是一个事件类,类清单:
package recmail.multiservice;
import java.awt.*;
import java.net.datagrampacket;
public class dataswapevent
extends java.util.eventobject {
object source;
string id;
java.awt.image image;
private datagrampacket dp;
public dataswapevent() {
super(null);
}
public dataswapevent(object ob) {
super(ob);
this.source = ob;
}
public string getid() {
return id;
}
public void setid(string id) {
this.id = id;
}
public void setimage(image img) {
this.image = img;
}
public image getimage() {
return image;
}
public datagrampacket getdatagram() {
return dp;
}
public void setdatagram(datagrampacket dp1) {
dp = dp1;
}
}
dataswaplistener类,这是监听器接口类.
package recmail.multiservice;
public interface dataswaplistener extends java.util.eventlistener{
public void ondatasendfinished(object s,dataswapevent e);
public void ondatarecvfinished(object s,dataswapevent e);
}
dataswaplisteneradapter包装器类,这不是一个简单的包装类,把注册监听器的功能也放在这里了.
package recmail.multiservice;
import java.util.*;
public class dataswaplisteneradapter implements dataswaplistener{
protected arraylist listener;
public dataswaplisteneradapter() {
listener = new arraylist();
}
protected void adddataswaplistener(dataswaplistener dsl) {
listener.add(dsl);
}
protected void removedataswaplistener(dataswaplistener dsl) {
listener.remove(dsl);
}
protected void processrecvfinishedevent(dataswapevent e) {
for (int i = 0; i < this.listener.size(); i++) {
( (dataswaplistener)this.listener.get(i)).ondatarecvfinished(this, e);
}
}
protected void processsendfinished(dataswapevent e) {
for (int i = 0; i < this.listener.size(); i++) {
( (dataswaplistener)this.listener.get(i)).ondatasendfinished(this, e);
}
}
public void ondatasendfinished(object s, dataswapevent e) {
iterator it = listener.iterator();
while (it.hasnext())
( (dataswaplistener) it.next()).ondatarecvfinished(s, e);
}
public void ondatarecvfinished(object s, dataswapevent e) {
iterator it = listener.iterator();
while (it.hasnext())
( (dataswaplistener) it.next()).ondatarecvfinished(s, e);
}
}
用这个类连接事件源和事件处理器即可达到更新目的.
最后这个类jimagepanel,用于显示图象,清单为:
package recmail.multiservice;
import java.awt.*;
import javax.swing.*;
public class jimagepanel extends jscrollpane{
jimagepane imagepane = null;
public jimagepanel() {
imagepane = new jimagepane();
this.getviewport().add(imagepane);
}
public synchronized void setimage(image image) {
imagepane.setimage(image);
}
class jimagepane
extends jpanel {
image img;
insets insets;
dimension d;
public jimagepane() {
insets = this.getinsets();
}
public synchronized void setimage(image image) {
if (img != null) {
img.flush();
img = null;
}
this.img = image;
if (img != null)
setsize(image.getwidth(this), image.getheight(this));
else
setsize(0, 0);
this.repaint();
}
public void paintcomponent(graphics g) {
super.paintcomponent(g);
if (img != null)
g.drawimage(img, insets.left, insets.top, this);
}
public dimension getpreferredsize() {
if (img != null) {
return new dimension(img.getwidth(this), img.getheight(this));
}
else {
return new dimension(320, 160);
}
}
public dimension getminimumsize() {
if (img != null) {
return new dimension(img.getwidth(this), img.getheight(this));
}
else {
return new dimension(320, 160);
}
}
public dimension getmaximumsize() {
if (img != null) {
return new dimension(img.getwidth(this), img.getheight(this));
}
else {
return new dimension(320, 160);
}
}
public dimension getsize() {
if (img != null) {
return new dimension(img.getwidth(this), img.getheight(this));
}
else {
return new dimension(320, 160);
}
}
private void setsiz() {
this.setpreferredsize(d);
this.setminimumsize(d);
this.setmaximumsize(d);
this.setsize(d);
}
}
}
对于这些类使用接下来就将使用.