2010-01-06 70 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