有时会自动调用repaint()吗?

时间:2014-03-08 22:06:36

标签: java swing graphics paintcomponent concurrentmodification

我正在制作游戏。游戏中的每个对象都在注册表中注册。我有一个游戏循环调用的更新和渲染方法。 render方法在repaint()上调用JPanel,我已覆盖paintComponent(Graphics g)图形。当它呈现并更新时,它会遍历每个对象并对其进行更新并从注册表中呈现它。有时我得到一个并发修改错误,我相信这是因为有些东西正在调用paintComponent()而不是我的游戏循环。如果JPanel或甚至JFrame调用自行重绘,有没有办法禁用它?

2 个答案:

答案 0 :(得分:5)

不,repaint()不会自动调用,但paint(Graphics g)有时会调用,而您无法对此进行控制。此外,如果repaint()来电被“堆叠”,则可能会被忽略。有关详情,请查看此文章:Painting in AWT and Swing

希望paintComponent方法中没有程序逻辑。如果你这样做,就把它拿出来。

答案 1 :(得分:3)

  

“paintComponent(),而不是我的游戏循环”

首先,你不应该自己调用任何绘画方法(甚至打印应该通过打印方法完成)。

其次,如果调用repaint,则重绘管理器将调度一个paint事件,并且(最终)由Event Dispatching Thread处理。何时以及如何完成这取决于重绘经理如何安排这些事件。这意味着所有绘画都是在EDT的背景下完成的(除非你做的事情你不应该这样做)。这意味着绘画永远不会在游戏循环的上下文中完成

这意味着,如果您更改绘制例程所依赖的游戏状态,则会出现并发问题。

您可以同步共享数据结构,以便在其他某些线程访问数据时无法访问它们。

您可以将游戏线程中的状态呈现给后备缓冲区,然后将其分配给活动缓冲区。因此有点像双缓冲方法