Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.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 有时会自动调用repaint()吗?_Java_Swing_Graphics_Paintcomponent_Concurrentmodification - Fatal编程技术网

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

Java 有时会自动调用repaint()吗?,java,swing,graphics,paintcomponent,concurrentmodification,Java,Swing,Graphics,Paintcomponent,Concurrentmodification,我在做游戏。游戏中的每个对象都在注册表中注册。我有一个游戏循环调用的更新和渲染方法。render方法在myJPanel上调用repaint(),我已经覆盖了图形的paintComponent(Graphics g)。当它渲染和更新时,它会遍历每个对象并更新它,然后从注册表中渲染它。有时我会遇到一个并发修改错误,我相信这是因为有东西在调用paintComponent(),而不是从我的游戏循环中调用的。如果一个JPanel或者甚至JFrame自己调用repaint,有没有办法禁用它?否,repain

我在做游戏。游戏中的每个对象都在注册表中注册。我有一个游戏循环调用的更新和渲染方法。render方法在my
JPanel
上调用
repaint()
,我已经覆盖了图形的
paintComponent(Graphics g)
。当它渲染和更新时,它会遍历每个对象并更新它,然后从注册表中渲染它。有时我会遇到一个并发修改错误,我相信这是因为有东西在调用
paintComponent()
,而不是从我的游戏循环中调用的。如果一个
JPanel
或者甚至
JFrame
自己调用repaint,有没有办法禁用它?

否,
repaint()
不会自动被调用,但是
paint(Graphics g)
有时会被调用,您对此没有控制权。此外,如果调用“堆叠”,则可能会忽略
repaint()
调用。有关这方面的更多信息,请查看本文:

希望您的paintComponent方法中没有程序逻辑。如果你这样做了,就把它弄出去

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

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

第二,如果调用repaint,则repaint管理器将安排一个绘制事件,并(最终)由事件调度线程进行处理。何时以及如何完成此操作取决于重绘管理器如何安排这些事件。这意味着所有的绘画都是在EDT的背景下完成的(除非你正在做一些你不应该做的事情)。这意味着绘画永远不会在游戏循环的上下文中完成

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

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


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

“paintComponent(),而不是从我的游戏循环”-首先,您不应该自己调用paint方法(甚至打印也应该通过打印方法完成)。第二,如果调用repaint,则repaint管理器将安排一个绘制事件,并(最终)由事件调度线程进行处理。何时以及如何完成此操作取决于重绘管理器如何安排这些事件。这意味着所有的绘画都是在EDT的背景下完成的(除非你正在做一些你不应该做的事情)。这意味着在游戏环境中永远不会进行绘制。同时修改听起来很可疑,就像是在EDT之外的线程中修改数据,并且在绘制时也访问相同的数据。这本身并没有错,但在这种情况下,您需要提供适当的防护。正如其他人所指出的,绘画的日程安排是不可预测的,并且可能与您的修改重叠。即使没有系统事件导致的额外绘制请求,也可能发生这种情况。@谢谢,这非常有帮助。但是,更新会立即反映出来,不像您在主线程或守护线程中绘制自己或组件内部的所有内容,这取决于GUI体系结构。我注意到
并发修改
。看见