2011-10-09 42 views
1

我正在ChessBoard Game上做一個演示。我想你一定知道它。我遇到過什麼問題。結果只是顯示得很快。我想看看它是如何緩慢運行的。Java:我如何等待updateUI?

下面是主要代碼:

public void ChessBoard(int tr, int tc, int dr, int dc, int size) throws InterruptedException { 
     if (size == 1) { 
      return; 
     } 
     Random rd = new Random(); 
     float red = rd.nextFloat(); 
     float green = rd.nextFloat(); 
     float blue = rd.nextFloat(); 
     Color col = new Color(red, green, blue); 
     int s = size/2; 
     if (dr < tr + s && dc < tc + s) { 
      ChessBoard(tr, tc, dr, dc, s); 
     } else { 
      button[tr + s - 1][tc + s - 1].setBackground(col); 
      ChessBoard(tr, tc, tr + s - 1, tc + s - 1, s); 
     } 
     if (dr < tr + s && dc >= tc + s) { 
      ChessBoard(tr, tc + s, dr, dc, s); 
     } else { 
      button[tr + s - 1][tc + s].setBackground(col); 
      ChessBoard(tr, tc + s, tr + s - 1, tc + s, s); 
     } 
     if (dr >= tr + s && dc < tc + s) { 
      ChessBoard(tr + s, tc, dr, dc, s); 
     } else { 
      button[tr + s][tc + s - 1].setBackground(col); 
      ChessBoard(tr + s, tc, tr + s, tc + s - 1, s); 

     } 
     if (dr >= tr + s && dc >= tc + s) { 
      ChessBoard(tr + s, tc + s, dr, dc, s); 
     } else { 
      button[tr + s][tc + s].setBackground(col); 
      ChessBoard(tr + s, tc + s, tr + s, tc + s, s); 
     } 


     mainPanel.updateUI(); 
     for (long i=1;i<10000;i++){ 
      for (long j=0;j<10000;j++){ 
       i+=1; 
       i-=1; 
      } 
     } 

    } 

但結果只是在一瞬間變成了似乎mainPanel中並沒有完成其工作。 mainJanel是一個JPanel對象。

+0

也許你應該把用不同的方法繪製動畫的不同部分的代碼,然後,一次一個地調用它們,並在兩者之間進行睡眠?那是你的追求? –

回答

3

我也開始處添加的睡眠,但只有進展緩慢下來,似乎沒有任何與顯示出來

看來你的代碼是在執行事件調度線程。你永遠不要告訴EDT睡覺()。這可以防止GUI重新繪製自己。有關更多信息,請參閱Concurrency的Swing教程部分。

相反,您應該使用擺動計時器來安排每個動作的動畫。該教程還有一個關於定時器的部分。

+0

非常感謝你的建議!我正在嘗試:) –

0

只需使用Thread.sleep(/* time in milliseconds */)即可減慢執行速度。

+0

進度放慢。但結果仍然突然出現。所有的按鈕在一秒鐘內改變了顏色。 –

+0

您必須使用mainPanel.redraw()作爲「Francisco Puga」提到的每一步。 – MasterCassim

+0

是的。我已經更改爲repaint()。我也在開始時加入睡眠,但只有進度放慢,似乎與放映無關。 –

2

updateUI用於更改組件的外觀&。要重畫面板的內容,您應該使用

mainPanel.repaint() 
+0

是的,我犯了一個愚蠢的錯誤... –

+0

+1,歡迎來到論壇。 – camickr

0

使用sleep停止執行。

public class SleepMessages { 
    public static void main(String args[]) throws InterruptedException { 
     String importantInfo[] = { 
      "Mares eat oats", 
      "Does eat oats", 
      "Little lambs eat ivy", 
      "A kid will eat ivy too" 
     }; 

     for (int i = 0; i < importantInfo.length; i++) { 
      //Pause for 4 seconds 
      Thread.sleep(4000); 
      //Print a message 
      System.out.println(importantInfo[i]); 
     } 
    } 
} 

這樣它會你的程序慢下來。

//Pause for 4 seconds 
    Thread.sleep(4000); 
+0

這個例子適用於它。然而它只能減慢進度而不是結果的速度 –