我想知道可以通过RMI发送主要的Swing类event / actionlisteners,Events,components。
可能的情况 :如果一个客户端按下按钮或移动滑块,则每个客户端的按钮或滑块移动等对其他swing元素相同。
我期待在RMI和摇摆MVC架构的背景下得到答案,我想调用swing组件的模型,例如ButtonModel,并希望在线上发送swing ActionEvent并将PropertyChangeListener / PropertyChangeSupport注册为远程对象以获取更新在客户现场。
典型例子: 当模型
发生某些变化时,服务器应该为每个客户端调用此方法 public void propertyChange(PropertyChangeEvent evt) {
for (AbstractViewPanel view: registeredViews) {
view.modelPropertyChange(evt);
}
}
如果一个客户端上发生事件,则应从服务器调用每个客户端actionPerformed:
@Override
public void actionPerformed(ActionEvent e) {
}
可行吗?如果没有那么为什么?在哪里我可以面对问题,我的意思是哪些类可以转移(序列化),哪些不是......
编辑: 在这里你看到我远程调用Java Swing defaultbuttonmodel,当它的某些属性或方法改变其他客户端的获取更新时,唯一剩下的就是,最好是如果有人可以帮助我,实现这一点,那么就可以追随swing propertychangelistener,这将是伟大的:
public class RemoteButtonModel extends UnicastRemoteObject implements Model {
private ButtonModel model = new DefaultButtonModel() ;
protected myModel() throws RemoteException {
super();
}
@Override
public void setEnabled(boolean b) throws RemoteException {
if (isEnabled())
model.setEnabled(false);
else{
model.setEnabled(true);
}
}
@Override
public boolean isEnabled() throws RemoteException {
return model.isEnabled();
}
}
答案 0 :(得分:2)
我认为使用命令模式发送诸如“滚动消息”或“按下按钮”消息之类的内容会更有效。这将允许不同的客户端在不同的实现中正确行动。
我在客户端/服务器应用程序中执行此操作的方式(很容易适应您正在进行的此类对等体系结构)就是这样(从我的生产代码中复制并粘贴,请注意)。
abstract public class UserRequest implements Serializable {
public final String username;
private transient ServersideThread thread;
protected UserRequest(String username) {
this.username = username;
this.thread = null;
}
abstract public EngineMessage engineCallback(GenericEngine engine);
public void setThread(ServersideThread thread) {
if(this.thread == null) {
this.thread = thread;
return;
}
throw new IllegalStateException("Cannot set thread when already set:" + thread.getName());
}
public ServersideThread getThread() {
return this.thread;
}
}
所以,通过这种方法,我会做类似的事情......
public class SliderMoveNotification extends UserRequest {
// need some way to say what slider moved
public final int sliderId;
public final int slideDistance;
public SliderMoveNotification(String username) {
super(username);
sliderId = 0;
sliderDistance = 0;
throw new UnsupportedOperationException("Must supply a slider and a distance");
}
public SliderMoveNotification(String username, int sliderID, int slideDistance) {
super(username);
this.sliderId = sliderId;
this.slideDistance = slideDistance;
}
public EngineMessage engineCallback(GenericEngine engine) {
if(engine instanceof WindowEngine) {
WindowEngine manager = (WindowEngine)engine;
manager.slideWindow(sliderId,slideDistance);
// you wouldn't need engine messages like I do in my client/server
// relationship, but the idea stands.
}
}
}
答案 1 :(得分:0)
每个Swing类的Javadoc都说不应该序列化。
更可能你应该传输相关的模型类。
通过RMI监听事件是一种反模式。流量太大,故障点太多。