gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:49:19 27 4
gpt4 key购买 nike

我想知道是否可以通过 RMI 发送主要的 Swing 类事件/ Action 监听器、事件、组件。

可能的场景:如果一个客户端按下按钮或移动 slider ,每个客户端的按钮或 slider 移动等,对于其他 Swing 元素也是如此。

我期待在 RMI 和 swing 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();

}
}

最佳答案

我认为使用命令模式发送类似“滚动消息”或“按下按钮”的消息会更有效。这将允许不同的客户端使用不同的实现正确操作。

编辑:

我在我的客户端/服务器应用程序(它很容易适应你正在做的这种对等架构)中使用的方式是这样的(请注意,从我的生产代码中复制并粘贴。)

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.
}

}

}

关于java - 在网络上传递 Swing 类(引用)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5838385/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com