Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.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_Paintcomponent_Repaint - Fatal编程技术网

Java 为什么repaint()语句在下一个语句之后执行

Java 为什么repaint()语句在下一个语句之后执行,java,paintcomponent,repaint,Java,Paintcomponent,Repaint,我想在重新绘制组件后在x(piece.x)的值中添加1,但它在x中添加1后重新绘制 我实际需要的是用给定的值(var)绘制组件,并在重新绘制组件后更改piece.x的值 piece.x = var; repaint(); piece.x += 1 已添加 我有一个框(矩形),它每秒左右移动(在x轴上)(需要重新绘制),但我想在重新绘制后更改该框的位置(x轴的值) 只需使用现有值x重新绘制长方体,然后更改其值,但它会先更改,然后重新绘制 谢谢 原因:重新绘制在单独的线程中进行,并且只安排重新绘制

我想在重新绘制组件后在x(piece.x)的值中添加1,但它在x中添加1后重新绘制

我实际需要的是用给定的值(var)绘制组件,并在重新绘制组件后更改piece.x的值

piece.x = var;
repaint();
piece.x += 1
已添加

我有一个框(矩形),它每秒左右移动(在x轴上)(需要重新绘制),但我想在重新绘制后更改该框的位置(x轴的值)

只需使用现有值x重新绘制长方体,然后更改其值,但它会先更改,然后重新绘制


谢谢

原因:重新绘制在单独的线程中进行,并且只安排重新绘制<代码>JComponent.paintInstance(…)可用于强制重新绘制,而无需将其排在绘制队列的后面

piece.x = var; // This happens immediately
repaint(); // This schedules the repaint in a separate thread
piece.x += 1 // This isn't guaranteed to happen before or after the repaint

有些人利用时间延迟,试图在继续执行之前等待重新绘制完成


也许最好评估一下为什么只需要在重新绘制完成后增加变量,看看是否可以更改设计/逻辑以适应单独线程中发生的重新绘制。

正如Andrew指出的,更改x值后重新绘制的原因很简单:
重新绘制()
调用不会导致立即绘制内容。它只告诉窗口系统尽快重新绘制组件。但这可能会在几毫秒后发生在另一个线程上

例如,要了解更多细节,可以看一看

根据对实际目标的描述,尽管仍然模糊不清:

我有一个框(矩形),它每秒左右移动(在x轴上)(需要重新绘制),但我想在重新绘制后更改该框的位置(x轴的值)

仍然不清楚为什么重新绘制后x值应该改变。x值改变后会发生什么?为什么不把它画在它被画的时候实际的位置上呢

但是,最后一个问题可能已经给出了一个可能的答案:当您想要区分“真实”位置和“绘制”位置时,您可以明确地对此进行建模:除了当前的
x
变量外,类还可以有一个名为
paintX
的字段。它是应该绘制长方体的位置,与当前的
x
值无关


当然,这听起来很微妙,您可能不得不这样做的原因是模型和视图没有明确分开。但是在任何情况下,请记住,即使你可以强制对象被绘制并在对象被绘制之后改变X值,你必须考虑到它可以在新的X位置再次被绘制。无法阻止重新绘制窗口,这超出了您的控制范围

尝试在重新绘制之前调用validate()。但在任何情况下,希望与绘画相关的更改值不会意外地重新绘制都是一个坏主意。在大多数情况下,尝试将某些内容与绘画机制同步是设计缺陷的标志。您应该更详细地描述您实际想要实现的目标。@Marco13只是为了在重新绘制后更改x的值。如果您认为这是足够的信息,我鼓励您在这里阅读更多有关stackoverflow的问题,并了解您认为“伙计,有人如何回答如此模糊的问题?”。“这很难,”我补充道。我希望你能理解,我们不能保证它需要多长时间或者多久才能完成。因此,睡眠线程只是猜测它可能需要多长时间。所以你可能等得不够久,也可能等得不够久。我期待着看到“有用”的答案,希望落选者很快就会发布。