Chr*_*anS 7 java user-interface swing network-programming
简短介绍:
我有一个[物理]模拟框架,曾经是一个单用户桌面版本.该框架作为一个工具包,使教师能够在没有深入了解Java编程和/或特定数学的情况下构建各种模拟设置.最终,我们想到将一个客户端 - 服务器范例应用于框架,以允许多个客户端在使用相同的模拟时进行协作(=在所有客户端之间同步模拟).
一些额外的技术事实:
框架/模拟是基于MVC模式设计的.
如果客户端对模拟进行更改 - 例如通过移动滑块或鼠标拖动模拟元素通过Swing GUI - 这些更改必须由服务器授权才能应用于模拟(+服务器必须采取小心将更改分发给所有其他客户端,这些客户端也必须应用它们.
授权本身非常简单,并且基本上只决定时间戳是否应该接受更改(以避免由具有不同延迟的客户端导致的问题导致在[几乎]同时)对同一事物进行更改.
问题分别是问题:
我现在想知道检测(和拦截)用户输入(将它们传递给负责客户端 - 服务器通信的底层消息系统)的最优雅方法是什么?是否存在某种通常用于所描述场景的模式或最佳实践?
我主要关注的一个问题是避免引入新的约束,这些约束必须由使用框架来构建新内容(=模拟)的人员加以考虑.从这个意义上讲,我希望保持现有的模拟工作尽可能少的更改.
我认为可以解决的一个解决方案
我想过引入一个新的界面,如:
public interface Synchronizable {
public boolean appliesChanges();
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,约束是任何类型的更改侦听器如果希望同步它们正在侦听的更改事件,则必须另外实现此接口.通过这样做,底层框架可以用代理对象替换实现Synchronizable的所有对象,代理对象负责验证与服务器的更改[事件](并且成功将事件转发给真正的更改侦听器).
'applyChanges'方法背后的想法是,并非所有对更改侦听器的调用都会导致需要同步的更改.例如,Swing JSlider可能会在旋钮移动时生成事件,但是一旦释放旋钮(即'值不再调整'),更改侦听器的具体实现可能仅应用实际更改.发生在其间的更改事件不需要发送到服务器,因为它们无论如何都不会产生任何影响.这种方法既不方便也不特别漂亮,但我想不出以其他方式解决问题的其他任何可能性?!
除了最终用户必须明确考虑他们想要同步哪些事件(因此为所有特定侦听器声明和实现所提到的接口)的问题之外,剩下的一个问题是如何自动找出哪个特定的method负责处理任意类型的事件(以避免必须为每个可能的更改侦听器实现具体代理).
概述此问题的示例:
public interface SynchronizedChangeListener extends ChangeListener, Synchronizable {}
public interface SynchronizedPropertyChangeListener extends PropertyChangeListener, Synchronizable {}
public static void main(String[] args) {
SynchronizedChangeListener scl = new SynchronizedChangeListener() {
public void stateChanged(ChangeEvent e) {
System.out.println("Hello world - SynchronizedChangeListener");
}
public boolean appliesChanges() {
return true;
}
};
SynchronizedPropertyChangeListener spcl = new SynchronizedPropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
System.out.println("Hello world - SynchronizedPropertyChangeListener");
}
public boolean appliesChanges() {
return true;
}
};
}
Run Code Online (Sandbox Code Playgroud)
代理监听器如何知道对于PropertyChangeEvents,它必须调用'propertyChange'方法,而对于ChangeEvents,它必须调用'stateChanged'方法?反思是否能够解决这个问题?
期待您的投入 - 我会对您可能有的任何想法或任何有关此主题的文学重新指示感到高兴.
在我看来,您有一个用户界面,用户可以在其中提供一些输入。您有另一个正在运行物理模拟的模拟 UI。只有在服务器授权后,才应将来自用户 UI 的输入提供给另一个用户界面。
到目前为止,一切都很好?
现在,您的模拟 UI 最终应该等待来自服务器的事件。我在想这样的事情:
| 归档时间: |
|
| 查看次数: |
267 次 |
| 最近记录: |