在网络上传递Swing类(引用)?

时间:2011-04-29 23:33:43

标签: java model-view-controller swing user-interface rmi

我想知道可以通过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();

    }
}

2 个答案:

答案 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监听事件是一种反模式。流量太大,故障点太多。