Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
强制Java刷新Java Swing GUI_Java_Multithreading_Swing_Events_Refresh - Fatal编程技术网

强制Java刷新Java Swing GUI

强制Java刷新Java Swing GUI,java,multithreading,swing,events,refresh,Java,Multithreading,Swing,Events,Refresh,我把两台电脑编码成反向播放,但是当它们相互播放时。棋盘仅在游戏结束后更新 通过谷歌搜索,我知道它与AWT事件线程有关,但我仍然不知道如何强制JFrame刷新 My函数的工作原理是更改图标,然后调用重新验证和重新绘制。 任何指针都很好。听起来像是线程问题-事件线程没有机会执行。我将从逻辑/操作线程中的一些sleep命令开始,为UI的更新留出时间 此外,您可以有一个“updateUI”线程,并在invokeAndWait上运行该线程,以强制它更新显示。每次移动完成后调用该函数。如果需要强制应用程序重

我把两台电脑编码成反向播放,但是当它们相互播放时。棋盘仅在游戏结束后更新

通过谷歌搜索,我知道它与AWT事件线程有关,但我仍然不知道如何强制JFrame刷新

My函数的工作原理是更改图标,然后调用重新验证和重新绘制。
任何指针都很好。

听起来像是线程问题-事件线程没有机会执行。我将从逻辑/操作线程中的一些sleep命令开始,为UI的更新留出时间


此外,您可以有一个“updateUI”线程,并在invokeAndWait上运行该线程,以强制它更新显示。每次移动完成后调用该函数。

如果需要强制应用程序重新绘制,则应在包含游戏板的组件上调用
repaint()
方法。这将导致Swing重新绘制棋盘。

如果您从
actionPerformed()
启动AI游戏,它将在EDT线程中执行。您应该启动一个新的
线程
,将您的逻辑(和
sleep()
)移动到EDT线程之外,以允许Swing正确地重新绘制UI并将更新发布到UI,如下所示:

SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        myUI.update();  // repaint(), etc. according to changed states
    }
});

还考虑使用<代码> javax .Swing .SaveWorks,代码> javax .Swing。计时器< /C> >查看./P>当你玩你的程序时,它是否显示正确?如果不是这样,你试着模仿点击事件,就像电脑在点击键盘吗?嗯,我没想到。但是我没有。知道它是否能工作。GUI由一个名为

updateBoard()的单独方法更新
,它会根据内部表示更改电路板。虽然与while循环有关的内容意味着它在结束之前不会更新,但您没有使用模型-视图-控制器模式来实现GUI?您的应用程序如何等待用户响应?是使用循环还是事件完成的?您的应用程序GUI是可用的ozen由于CPU负载过重,这就是为什么在计算结束后它不会得到更新。如果你让下一个播放器暂停几秒钟会发生什么?如果GUI得到正确更新,那么我上面的假设应该是正确的。不,这不是MVC。这是我做的第一个GUI,当我了解MV时,我已经基本完成了C.gamme确实适用于一个或多个用户,但当其人工智能非常严重时,它不会更新,可能是因为没有暂停。这是一段时间(gameNotOver)做…所以试着让线程在该循环中休眠。-1:即使其他线程很忙,如果EDT未被阻止,GUI也会保持响应。其逻辑发生在EDT中的几率为99%。鉴于OP提供的信息有限,这个答案可能是正确的。然而,我在我的系统中注意到类似的行为应用程序和我没有在EDT上运行CPU密集型代码。因此,EDT(或其他低级Java代码)可能没有获得需要的CPU时间,因为应用程序已经占用了太多的CPU时间。