2013-01-16 109 views
2

因此,我正在編寫一個可以對玩家玩黑白棋/黑白棋的程序。我寫了一個方法,使作品的動畫短片flipping-如何讓方法暫停而不暫停整個程序?

public void flip(int row, int col, Graphics window) 
{ 
Color a; 
if (pieces[row][col]==1) 
    a = Color.black; 
else 
    a = Color.white; 
for (int size = 90; size>0; size-=2) 
{ 
    try { Thread.sleep(11,1111); } catch (InterruptedException exc){} 
    window.setColor(new Color(0, 100, 0)); 
    window.fillRect(row*100+3, col*100+3, 94, 94); 
    window.setColor(a); 
    window.fillOval(row*100 + 5, col*100+5+(90-size)/2, 90, size); 
} 
if (a==Color.black) 
    a=Color.white; 
else 
    a=Color.black; 
for (int size = 0; size<90; size+=2) 
{ 
    try { Thread.sleep(11,1111); } catch (InterruptedException exc){} 
    window.setColor(new Color(0, 100, 0)); 
    window.fillRect(row*100+3, col*100+3, 94, 94); 
    window.setColor(a); 
    window.fillOval(row*100 + 5, col*100+5+(90-size)/2, 90, size); 
} 
} 

它工作得很好,看上去很不錯,但問題是,由於暫停了Thread.Sleep整個程序,它只能在翻轉一塊時間。有沒有什麼我可以做,暫停這種方法,而不會中斷程序的其餘部分?

謝謝大家。新的線程工作,但現在我有一個不同的問題。 flip方法中的三種setcolor方法正在混淆。我認爲這是因爲一些線程將顏色設置爲綠色,一些變爲黑色,一些變爲白色。我該如何解決?

回答

3

在這種情況下,您應該在單獨的Thread中運行flip。最簡單的例子:

Thread t = new Thread(new Runnable() { 
    public void run() { 
     flip(); 
    } 
}); 
t.start(); 
7

您應該在您的主程序創建的專用線程內運行此方法。

+1

+1不要做任何可能在GUI線程中花費大量時間的事情。始終將此工作傳遞給antoher線程,並使用SwingUtils.invokeLater從另一個線程更新GUI。 –

1

您需要創建一個單獨的線程來處理動畫。該線程可以調用Thread#sleep,因爲Thread#sleep不會暫停「整個程序」,而只是當前線程。在動畫的每一步中,它應該改變一些狀態來指示片段翻轉動畫的當前階段,然後請求重繪。

3

你的目標是異步編程:安排一個javax.swing.Timer,每次啓動時,執行一個動畫步驟。這將是GUI程序的慣用方式;一個單獨的線程睡眠在一個循環中,並且在每個步驟中都使用invokeLater也可以工作,但不太優雅,因爲它使用了更多的系統資源(另一個線程大多隻是睡眠)。