2010-01-06 69 views
3

我正在用Java编写一个简单的Game of Life程序,并且让它动起来有点麻烦。我有一个的JComponent类称为LifeDraw,显示像素的网格,具有以下paint方法:使用Java的JComponent repaint()

protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 

    for (int y = 0; y < lGrid.getHeight(); y++) { 
     for (int x = 0; x < lGrid.getWidth(); x++) { 
      if (lGrid.getCell(x,y) == 1) { 
       g.setColor(Color.red); 
       g.fillRect(x * lGrid.getSqSize(), y * lGrid.getSqSize(), lGrid.getSqSize(), lGrid.getSqSize()); 
      } else { 
       g.setColor(Color.white); 
       g.fillRect(x * lGrid.getSqSize(), y * lGrid.getSqSize(), lGrid.getSqSize(), lGrid.getSqSize()); 
      } 
     } 
    } 
} 

然后另一个类LifeGrid,有一个方法run(),其调用时将更新一代像素的网格,然后致电LifeDraw.repaint()。但是,如果我尝试在循环中调用run(),那么在循环完成之前,不会重新绘制,因此所有显示的内容都是第一代和最后一个。我想它可能只是更新太快而无法重新绘制,所以我尝试在迭代之间使用Thread.sleep(),但仍然存在相同的问题。理论上(或者至少我希望是这样),它应该在每次迭代之间重新绘制组件,并显示像素变化的动画。

我不太熟悉Java GUI,所以任何帮助都会非常感激。希望我已经足够清楚地解释了,否则让我知道!

+0

可能与此处的问题相同:http://stackoverflow.com/questions/1843677/why-does-invokelater-cause-my-jframe-not-to-display-correctly – 2010-01-06 21:24:08

回答

1

我不知道它是否可以解决您的问题,但您可以尝试从Timer(而不是简单的for或while循环)调用run()。

+0

非常好,谢谢!完美的作品。不完全确定它为什么不起作用,但我想它与run()仍然处理数组时不同的线程睡眠有关。 非常感谢:) – 2010-01-06 20:14:55

+0

如果这样可以解决问题,那么很可能是您的“run()”方法或其他任何正在调用它的事件正忙于在事件循环中等待。我从名称中假定它是Runnable或Thread中的run()方法,但显然不是。 – 2010-01-06 20:32:22

1

重绘必须在事件循环中触发,而不是在另一个线程中触发。
尝试用下面的代码替换您的来电repaint()

SwingUtilities.invokeLater(new Runnable() 
{ 
    public void run() 
    { 
     repaint(); 
    } 
}); 
+1

我以为你应该在任何你想要的线程中调用repaint(),然后它会在适当的线程中调用paintComponent()。我错了吗? – MatrixFrog 2010-01-06 20:09:58

+0

你可能是对的。我对在事件循环之外不做GUI的事情非常谨慎。 – 2010-01-06 20:15:24

+0

我认为我该买一本关于Swing的书,那里有太多我不知道的东西。虽然我非常肯定,考虑到Swing的大小,我会保持这种状态:) – 2010-01-06 20:20:30

1

从JavaDoc中repaint()

指定的区域添加到脏区列表如果组件 表现。在所有当前的 待处理事件已分派之后,组件将被重新绘制。

所有重绘都表示该区域需要重新粉刷。
尝试paintImmediatelyupdate

+0

非常感谢您的帮助;如上所述,使用Timer而不是loop/sleep()似乎可以解决这个问题,但我还记得其他答案,以防出现其他问题! – 2010-01-06 20:17:09

+2

一般来说,我发现尝试使用线程来解决Swing问题。睡觉()不是一个好主意。 – MatrixFrog 2010-01-06 20:33:29