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



我想知道是否有可能通过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侦听事件是一种反模式。流量太大,故障点太多。

相关内容

  • 没有找到相关文章

最新更新