1

我正在创建一个简单的游戏,我想在每次移动后重新绘制棋盘。所以,在我调用 move() 之后,我想做的是:(顺便说一下,一个 View 是一个保存碎片的 JComponent;由于移动后碎片的数量发生了变化,因此需要重新绘制)

for(View v : views){            
        v.repaint();
    }

它不工作。当我调用repaint()单个视图时,它工作正常。我尝试使用paintImmediately, and revalidate, and update... 在循环中没有任何作用。

有任何想法吗?提前致谢。

编辑:我应该补充一点,当调整窗口大小时,repaint() 确实会被调用,所以我知道 View 的 paintComponent 方法是有效的并且可以工作。它只是没有从循环中调用。当调试器单步执行循环时,它不会进入 repaint() 并且屏幕没有任何反应。

4

2 回答 2

1

与 UI 相关的所有内容都必须在事件调度线程 (EDT) 中调用:

SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        for(View v : views){
            v.repaint();
        }
    }
});

您也可以使用invokeAndWait代替invokeLater。如果您想要一个响应式应用程序,您应该阅读 EDT。

例如,如果您将一个 actionListener 添加到一个按钮,在该 actionListener 中执行的代码将在 EDT 线程中执行,因此您必须限制进程,否则您的 UI 将停止响应。

另外,看看SwingUtilities.isEventDispatchingThread()

于 2011-01-14T20:21:16.243 回答
0

如果最近的 validateRoot 是 JScrollPane,则有时重新验证不起作用。不知道为什么。尝试在框架本身上调用 revalidate 以查看是否有效。如果是这样,则说明 validateRoot 无法正确验证您的组件。您只需要在循环完成时调用一次 revalidate。

于 2011-01-12T21:41:36.430 回答