2012-02-08 65 views
1

現在我編寫了一個用於擺動程序的方法,該方法應該放慢調用的方法的運行速度(通過thread.sleep(x)),而不是放慢刷新速度只是導致整個程序掛起,屏幕在方法執行結束時刷新。我應該在java swing程序中使用thread.sleep?

這裏是我的代碼:

public final void doBubbleSort(String numbers[], JButton numButton[]){ 
for (int k = 0; k < numbers.length - 1; k++){ 
    String str1 = ""; 
    boolean isSorted = true; 

    for (int i = 1; i < numbers.length - k; i++){ 
    if (Integer.parseInt(numbers[i]) < Integer.parseInt(numbers[i - 1]) ){ 
     try{ 
     String tempVariable = numbers[i]; 
     numbers[i] = numbers[i - 1]; 
     numbers[i - 1] = tempVariable; 
     isSorted = false; 
     str1 = numButton[i].getText(); 
     numButton[i].setText(numButton[i-1].getText()); 
     Thread.sleep(100); 
     }catch(Exception e){ System.err.println("Error: " +e.getMessage()); } 
     numButton[i-1].setText(str1); 
    } 
    } 

    if (isSorted) 
    break; 

}

}

如果有人能告訴我在哪裏我應該把Thread.sleep()方法,使其推遲項目的顯示被交換我將不勝感激。

謝謝!

回答

4

你不應該睡在事件派發線程中。

  1. 創建模型,(在你的情況列表)
  2. 創建視圖(你的揮杆GUI)
  3. 確保視圖獲取一旦模型的變化更新的(通過添加如果你這麼喜歡)監聽器例如)
  4. 創建單獨的線程定期更新模型(使用Thread.sleep
  5. 當改變「速度」 改變睡眠時間的更新線程

你可能想看看在Timer類(它提供了一個更好的接口用於每隔一定的時間做的事情)或搖擺的工人。

4

您不能通過在這樣的事件處理程序中放置循環來執行動畫。您需要必須通過使用一個單獨的線程,明確地或通過使用javax.swing.Timer類。如果你循環並在事件線程上休眠,就像你在做的那樣,然後在循環運行的整個過程中,事件線程不可用於執行其他任務,如繪製屏幕。

有關使用Swing計時器類的信息,請參閱this article