Java Swing的图形错误 - 从列表中绘制可以使元素跳转

时间:2017-12-04 00:21:59

标签: java swing graphics

所以我在一段时间内第一次搞乱了Swing,我遇到了一个奇怪的问题。所以我要添加"形状"每隔一段时间到一个列表,然后在JPanel的paintComponent方法中,我循环遍历列表并绘制形状。我还在for循环之外绘制一个形状用于测试目的。

for循环中的形状会随机跳转到屏幕上。只有在此循环中绘制形状时才会发生这种情况。

我已经尝试过了:

  • 更新集成GPU和独立GPU的图形驱动程序
  • 使用java.util.Timer而不是Swing Timer
  • 使用Thread / Runnable
  • 使用ArrayList以外的东西,例如LinkedList,Vector和普通数组。
  • 除了基础知识之外,从我的代码中删除了所有内容,这就是我们在这里留下的内容。当我注意到它之前,我正在绘制更复杂的东西。
  • 更改了时间(PERIOD变量,以毫秒为单位)。如果我增加或减少它会变得更糟。
  • 从使用系统时间(以毫秒为单位)更改为系统时间(以纳秒为单位),转换为毫秒。我知道这应该是一样的,但我的想法已经不多了。

这是问题的GIF(15秒长): image

您会注意到小方块会以随机间隔跳转。这不应该发生。我只是试图产生"一个正方形的随机坐标。

以下是pastebin中的代码: code

我已按此顺序包含所有3个类:JPanel类,Main类(扩展JFrame)和形状类

如果任何链接无法正常工作,请通知我,我会及时发布其他链接。

感谢。

1 个答案:

答案 0 :(得分:0)

此设置......

@Override
public final void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;
    if (this.startTime == -1L) {
        this.startTime = Main.timeMillis();
    }
    final long timeDiff = Main.timeMillis() - this.startTime;
    if (this.circlesIndex <= 19 && timeDiff > 2000) {
        final int randX = this.rand.nextInt(this.WIDTH);
        final int randY = this.rand.nextInt(this.HEIGHT);
        this.testShapes.add(new TestShape(randX, randY));
        this.startTime = Main.timeMillis();
    }
    for (TestShape ts : this.testShapes) {
        ts.draw(g);
    }
    g2.setColor(Color.gray);
    g2.fill3DRect(350, 400, 100, 60, true);
}

@Override
public final void actionPerformed(final ActionEvent event) {
    x++;
    if (x > WIDTH) {
        x = -50;
    }
    repaint();
}

错了。

Paint用于绘画 - 您不应该在任何绘制方法中修改UI的状态,在ActionListener中执行此操作。问题是,您的组件可能因任何原因而被绘制,其中许多原因是您无法控制或了解