Java 类与 JFrame 之间的通信 JDialog

标签 java communication

我写了一个独立的 Connect 4 游戏。

接下来我希望能够通过网络播放它,并且还具有聊天功能。

连接4 GUI(JFrame)持有->连接4游戏模型

我想实现拥有网络API的connect 4网络GUI(JDialog)(这里用户可以选择充当服务器或客户端)。 (服务器仅提供单个连接)

最后是用于交换消息的聊天 GUI (JDialog)。

我的问题是如何实现类间/GUI 通信?当收到网络消息时,它应该传递到正确的接收者(游戏/聊天),并且从聊天/游戏发送的消息也应该传递到远程计算机。

我研究过内部类,但被告知在单个类中实现这么多内容是一个坏主意,而且我也不太喜欢这个想法。

我用 C# 编写了另一个游戏战舰,它使用委托(delegate)来完成此任务,但遗憾的是我得知委托(delegate)在 Java 中不可用。

我是一名初学者,目前正在探索各种选择,因此我愿意接受您的指导。

谢谢。

最佳答案

这里有两个问题。

首先,您必须记住,所有 GUI 操作都必须从 Swing 的事件调度线程 (EDT) 发出。因此,如果另一个线程(例如监听网络消息的线程)想要更新 GUI,则必须使用 SwingUtilities.invokeLater,如下所示:

 // Network thread
 final Message msg = getMessage();
 SwingUtilities.invokeLater(new Runnable() {
   public void run() {
      // This code will be executed on the EDT
      // it can access the msg variable because it is final
   }
 });

第二点是协调 GUI 对象和网络对象。我认为最好的方法是创建两个Mediator类,它们将从网络对象接收通知并将它们“翻译”为GUI对象上的适当操作(反之亦然)。这些调解器还将确保在 EDT 上分派(dispatch) GUI 事件,如上所述。

关于Java 类与 JFrame 之间的通信 JDialog,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2699816/

相关文章:

java - 如何将 IntelliJ Evaluate Expression 工具与 lambda 和外部作用域一起使用?

java - 不兼容的类型 : inference variable T has incompatible bounds equality constraints: capture#1 of ? 扩展了 java.lang.Object

c - 嵌入式设备上C89字节流转包流的一种方法

c++ - Matlab 与外部应用程序(C++)之间的通信

Android - getTargetFragment 和 setTargetFragment - 它们的用途是什么

java - Mockito Spy 看不到正确的原始值

java - 调用方法时出现问题(扫雷)

java - Docker 无法连接到同一服务器上运行的数据库

java - 如何使用关键字 "include"使用 Thrift 文件中定义的结构

c - 微型计算机,串口。请求多个字节