最近在一个swing项目中碰到这样一个问题:
在一个窗体(Frame1)中某添加或删除某个数据,此时需要另外一个窗体(Frame2)或多个窗体也即时显示变化之后的数据。之前在的实现为在Frame1窗体中添加一个Frame2窗体的引用,这样在Frame1窗体删除数据或增加数据时,通过Frame2的引用调用里面更新显示数据的方法。但之后发现如果一个窗体中数据发生变化,有多个窗体需要及时刷新时,就需要在窗体中创建很多其他窗体的引用,类与类之间的耦合度瞬间增加,而且比较混乱。
今天在这里分享一下在处理窗体之间数据联动的时候自己使用的一个方法。
首先解决该问题的思想是,利用发消息的机制来通知其他窗体数据发生变化。有点模仿android的消息接收器,但这里只是一个只是一个简单的实现,不需android中BroadcastReceiver这么复杂。
接下来贴出代码:
MessageManager,该类为消息的管理器类,采用单例模式,提供了注册消息接收器,撤销消息接收器和发送消息的方法。
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* 消息管理器
* @author Administrator
*/
public class MessageManager {
//消息管理器单例模式
private static MessageManager mm;
private List<MessageReceiver> mrs;
private MessageManager() {
mrs = new ArrayList();
}
public static MessageManager getMessageManager() {
if(mm == null) {
mm = new MessageManager();
}
return mm;
}
/**
* 注册接收器
* @param msgReciver
*/
public void registerReceiver(MessageReceiver msgReciver) {
mrs.add(msgReciver);
}
/**
* 撤销接收器
* @param msgReciver
*/
public void unregisterReceiver(MessageReceiver msgReciver) {
mrs.remove(msgReciver);
}
/**
* 发送一个消息,根据相同Action来判断是执行哪一个消息接收器的receiver方法
* @param filter 过滤器
*/
public void sendMessge(IntentFilter filter) {
String action = filter.getAction();
Iterator it = mrs.iterator();
while(it.hasNext()) {
MessageReceiver mr = (MessageReceiver) it.next();
IntentFilter mrfilter = mr.getFilter();
String mrAction = mrfilter.getAction();
//判断是否为同一个Action
if(action.equals(mrAction)) {
mr.receiver();
}
}
}
MessageReceiver 类,该类是一个抽象类,创建自己的消息接收器需要继承此类,同时实现其中的receiver()方法
/**
* 消息接收器
* @author Administrator
*/
public abstract class MessageReceiver {
private IntentFilter filter;
public MessageReceiver(IntentFilter filter) {
this.filter = filter;
}
/**
* 收到消息时如何处理消息的抽象方法,在消息发送时被调用
*/
public abstract void receiver();
public IntentFilter getFilter() {
return filter;
}
}
接下来就是IntentFilter类,比较简单,就一个action成员,和自己定义的Action字符串
/**
* 意图过滤器
* @author Administrator
*/
public class IntentFilter {
private String action;
public void addAction(String action) {
this.action = action;
}
public String getAction() {
return action;
}
//
public final static String DATA_CHANGE = "data_change";
}
三个类的定义完成,之后就是在项目中的实际使用了:
示例代码:http://download.csdn.net/download/a78460750/5960975