2011-12-09 50 views
0

我一直在努力與延遲計時器。我如何使交換對觀察者可見?並在交換正在處理時在選定的欄上添加顏色?順便提一下,這是一個選擇。如何插入定時器來處理排序

selectionSort2.java

/** 
* 
* @author Yuvinng 
*/ 

import java.awt.*; 
import javax.swing.*; 
import java.util.Random; 
import javax.swing.Timer; 
import java.awt.event.*; 
public class SelectionSortPanel2 extends JPanel{ 

protected JButton selection; 
private final int width=400,height=400; 
private static Random generator; 
private int[] list=new int[100]; 
private Timer timer; 


public void selectionSort(int[] list) 
{ 
int min; 
int temp; 
for(int index=0; index<list.length-1;index++) 
{ 
min=index; 
for(int scan=index+1;scan<list.length;scan++) 
if(list[scan]<(list[min])) 
    min=scan; 
temp=list[min]; 
list[min]=list[index]; 
list[index]=temp; 
repaint(); 
}  
} 
private class swapper implements ActionListener 
    { 
     public void actionPerformed(ActionEvent event) 
     { 
     selectionSort(list); 
     } 
    } 
} 
+2

我會先嚐試設置您的代碼格式,使其更易於閱讀。你的IDE應該能夠爲你做到這一點。 –

+0

從格式化代碼開始,讓它更易於閱讀,然後看看你如何處理計時器。你有100毫秒的延遲,但之後你排序整個陣列,然後重畫,我不認爲這是你的目標。你不想在每次交換後延遲,以便看到排序進度? –

+0

@RogerLindsjö是,那是我的目標。但我不知道如何爲定時器創建一個循環,以便每次執行交換,以便交換對用戶可見,併爲正在交換的欄添加顏色,因此使交換更加明顯。 –

回答

1

而不是使用它每次被調用,無需重寫你的排序方法只排序一個元素在每次調用,你可以做到這一點的時間排序你的整個陣列的定時器。

當你使用計時器時,它實際上是在重繪人的同一個線程中執行,所以如果你在這裏做任何睡眠,那麼這個人不會重畫。

取而代之,將您的交換器更改爲可運行,然後用您的交換器創建一個新的線程並啓動線程。

然後,在交換和調用repaint之後,您可以告訴交換線程休眠一段時間Thread.sleep(延遲)

JPanel不會在重新繪製之間自行清除,所以您只會看到列增長,而不會變短。請修復paintComponent以清除圖形或者擴展JComponent。

希望能幫助你的進步。

+0

是唯一的方法?作爲我的講師還沒有想過整個過程,Runnable仍然沒有能力 –

2

javax.swing.Timer是一個不錯的選擇,因爲它隱藏了用於等待並在繪製時觸發的線程。只需將一個的結果繪製在計時器的actionPerformed()方法中。您必須重新組織selectionSort(),以便它可以一次運行一步。有一個相關Timer示例here