我一直在问很多关于我最近一直在做的项目的问题。这是我所处的场景,任何帮助或指向正确方向都会有很大帮助......
这是一个由服务器和多个客户端构建的网络程序。每个客户端都有一个 GUI,它必须根据服务器发送的命令进行操作。每个客户端都包装在一个名为Player
. 这Player
有一个 GUI(扩展JFrame
)和一个 main 方法,而服务器只有一个 main 方法(没有 GUI)。起初,这个类是在主线程中创建的,如下所示:
EventQueue.invokeLater(new Runnable()
{
public void run()
{
new Player().setVisible(true);
}
});
这工作得很好,直到我意识到整个Player
类现在都在 EDT 中执行。因此,当我等待来自服务器的命令时,整个 GUI 会锁定,直到发送该命令并执行适当的操作。可以想象,这是一个可怕的设计,并且被证明是编码环境的真正痛苦,因为每次您想要检查某些东西时,您必须找到一些疯狂的工作,以便 GUI 仍然保持完整。
显然,我必须在单独的线程中检查来自服务器的命令并在 EDT 中运行 GUI 组件。我的第二个实现有两个类——一个用于 GUI,一个用于Player
. 这个想法是Player
有一个保存 GUI 的变量,以便我可以从Player
类中访问 GUI,如下所示:
class Player
{
public GUI gui;
...
// And then start this gui inside of the EDT.
EventQueue.invokeLater(new Runnable()
{
public void run()
{
this.gui = new GUI().setVisible(true);
}
}
这也不起作用,因为this
新Runnable
对象内部指的是Runnable
对象,而不是Player
.
如何Player
在一个线程中的类与 EDT 线程中相应的 GUI 类之间进行通信?