在循环中重新绘制组件

时间:2011-01-12 17:09:34

标签: java swing loops repaint

我正在创建一个简单的游戏,我想在每次移动后重新绘制电路板。所以,在我调用move()之后,我想做的是:(顺便说一下,View是一个包含片段的JComponent;因为移动后片段的数量已经改变,所以需要重新绘制)< / p>

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

它不起作用。当我在一个View上调用repaint()时,它运行正常。我尝试使用paintImmediatelyrevalidateupdate ......循环内无效。

有什么想法吗?提前谢谢。

编辑:我应该补充说,在调整窗口大小时会调用repaint(),所以我知道View的paintComponent方法是有效的并且有效。它不是从循环中调用的。当调试器逐步完成循环时,它不会进入repaint()并且屏幕上没有任何反应。

2 个答案:

答案 0 :(得分:1)

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

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

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

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

另外,请查看SwingUtilities.isEventDispatchingThread()

答案 1 :(得分:0)

如果最近的validateRoot是JScrollPane,有时revalidate不起作用。不知道为什么。尝试在帧本身上调用revalidate以查看是否有效。如果是这样,那么validateRoot无法正确验证组件时出现问题。您只需要在循环结束时调用一次revalidate。