我想知道是否有可能通过RMI发送主要Swing类事件/动作监听器,事件,组件。
可能的场景 :如果一个客户端按下按钮或移动滑块,每个客户端的按钮或滑块移动等相同的其他摇摆元素。
我期望在RMI和swing MVC架构的上下文中得到答案,我想调用swing组件的模型,例如ButtonModel,并想在wire上发送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();
}
}
我认为发送像"scroll message"这样的信息会更有效。或按下按钮;消息,使用命令模式。这将允许不同的客户端使用不同的实现正确地操作。
<标题>编辑:我在我的客户端/服务器应用程序(它很容易适应你正在做的这种点对点架构)中使用的方法是这样的(注意,从我的生产代码中复制粘贴)
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.
}
}
}
标题>
每个Swing类的Javadoc都说它不应该被序列化。
更可能的是你应该传输相关的Model类。
通过RMI侦听事件是一种反模式。流量太大,故障点太多。