我写了一个独立的 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/