Java rmi:基于模型更改更新GUI而无需序列化面板和/或轮询

时间:2011-12-10 02:03:46

标签: java model-view-controller rmi

我目前遇到了问题。 我有一个带有Model的RMI服务器,并希望根据模型的变化(一种典型的MVC结构)更新客户端上的View。 我现在的问题是,如果我想从服务器调用更新客户端上的View的方法,则服务器需要对视图的引用。如果在给予服务器的任何类中引用了View,那么View将被发送到服务器,我不想这样做,而我不能这样做,因为View使用的不是Serializable GroupLayout。

有没有办法根据模型更改更新视图而无需轮询和/或需要发送视图?

提前致谢。

编辑:似乎没有人能够回答我的问题。所以这里是我的思考过程的更多细节。 想象一下三个类,一个视图,一个模型和一个控制器。 Controller充当模型和视图之间的桥梁。因此,Controller具有对模型和视图的引用。视图具有对控制器的引用。 Controller实现了PropertyChangeListener接口,并在Model上注册自身。每次在Model中更改Property时,它都会调用firePropertyChange方法,并且控制器会将Event传播到视图,该视图会相应地执行操作。 遗憾的是,由于服务器上的控制器具有对客户端视图的引用,因此视图将被序列化,这对于马蒂斯使用的GroupLayout是不可能的。 GroupLayout未实现Serializable。子类化Grouplayout不起作用,因为GroupLayout没有默认的构造函数。希望这使我的问题足够清楚,让你们都去那里为自己尝试这个结构并给我一个可能的解决方案。 ;)

编辑:似乎没有可能在没有序列化View本身的情况下使用可见组件的RMI启用MVC架构。因此,我必须在服务器上轮询模型以检查属性是否已更改并适当地更改客户端上的视图。 这个解决方案有点糟糕(请原谅我的话),因为它是资源节约和MVC架构的对立面。下一个负面因素是视图将永远不会实时更新。

1 个答案:

答案 0 :(得分:0)

所以我在周围搜索并在其他论坛等做了一些提问。 我终于找到了一个解决方案,让你们所有人都在努力解决类似问题。 答案就是所谓的RMI回调。客户端必须导出自己的存根以发送到服务器,服务器使用该存根来执行回调。

以下是让我走上正轨的示例: ħ**号码://www.javaworld.com/javaworld/javaqa/1999-04/05-rmicallback.html

它有点陈旧但它涵盖了基础知识。

玩得开心!