我正在创建一个简单的游戏,我想在每次移动后重新绘制电路板。所以,在我调用move()之后,我想做的是:(顺便说一下,View是一个包含片段的JComponent;因为移动后片段的数量已经改变,所以需要重新绘制)< / p>
for(View v : views){
v.repaint();
}
它不起作用。当我在一个View上调用repaint()
时,它运行正常。我尝试使用paintImmediately
,revalidate
和update
......循环内无效。
有什么想法吗?提前谢谢。
编辑:我应该补充说,在调整窗口大小时会调用repaint(),所以我知道View的paintComponent方法是有效的并且有效。它不是从循环中调用的。当调试器逐步完成循环时,它不会进入repaint()并且屏幕上没有任何反应。
答案 0 :(得分:1)
必须在事件调度线程(EDT)中调用与UI相关的所有内容:
SwingUtilities.invokeLater(new Runnable() {
public void run() {
for(View v : views){
v.repaint();
}
}
});
您也可以使用invokeAndWait代替invokeLater。如果您想要一个响应式应用程序,您应该阅读EDT。
例如,如果将actionListener添加到按钮,则在该actionListener中执行的代码将在EDT线程中执行,因此您必须限制该过程,否则UI将停止响应。
答案 1 :(得分:0)
如果最近的validateRoot是JScrollPane,有时revalidate不起作用。不知道为什么。尝试在帧本身上调用revalidate以查看是否有效。如果是这样,那么validateRoot无法正确验证组件时出现问题。您只需要在循环结束时调用一次revalidate。