gpt4 book ai didi

java - EDT 和主线程之间的通信

转载 作者:行者123 更新时间:2023-12-01 07:16:34 28 4
gpt4 key购买 nike

我一直在问很多关于我最近正在进行的项目的问题。这是我所处的场景,任何帮助或指出正确方向都会有很大帮助......

这是一个由一个服务器和多个客户端构建的网络程序。每个客户端都有一个 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);
}
}

这也不起作用,因为新 Runnable 对象中的 this 引用的是 Runnable 对象,而不是 玩家

如何在一个线程中的 Player 类与 EDT 线程中相应的 GUI 类之间进行通信?

最佳答案

要处理 this 指针的问题,您应该编写:

class Player
{
public GUI gui;

...

// And then start this gui inside of the EDT.
EventQueue.invokeLater(new Runnable()
{
public void run()
{
Playser.this.gui = new GUI().setVisible(true);
}
}
}

关于java - EDT 和主线程之间的通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/754717/

28 4 0
文章推荐: python - 无法定位元素selenium Python
文章推荐: java - 如何编写java程序获取pid
文章推荐: actionscript-3 - Flash - 播放一次影片剪辑
文章推荐: jquery - 将
  • 聚焦在
  • Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com