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

时间:2016-11-02 18:40:13

标签: java paintcomponent repaint

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

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

piece.x = var;
repaint();
piece.x += 1

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

只需用x的现有值重新绘制框,然后更改其值,但先更改然后重新绘制

谢谢!

2 个答案:

答案 0 :(得分:0)

为什么:重绘在一个单独的线程中发生,只安排重新绘制。 JComponent.paintImmediately(...);可用于强制重绘,而无需在绘制队列的后面安排重绘。

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

有些人使用时间延迟尝试等待重画完成后再继续执行。

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

答案 1 :(得分:-1)

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

有关详细信息,请查看http://www.oracle.com/technetwork/java/painting-140037.html,例如。

基于对实际目标的描述,虽然它仍然含糊不清:

  

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

在重新绘制后,为什么x值应该改变仍然不清楚。 x值发生变化后会发生什么?为什么它不应该涂在它实际上具有的位置?

然而,最后一个问题可能已经导致了一个潜在的答案:当你想要区分“真实”位置和“绘画”位置时,你可以明确而清晰地对此进行建模:除了当前的{{ 1}}变量,该类可以有一个可以被称为x的字段。无论paintX当前具有什么价值,它都是应该绘制框的位置。

当然,这听起来很繁琐,为什么你可能不得不这样做的原因是模型和视图没有明确分开。但无论如何,请记住,即使 if 你可以强制绘制对象并在绘制对象后更改x值,你必须考虑到然后可以在新的x位置再次绘制 。您无法阻止窗口重新绘制,这是您无法控制的。