2011-12-09 8 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öはい、それは私の目標でした。しかし、私はどのようにスワップがより明白なように交換されているバーのための色とadditiionのユーザーのために見えるようにスワッピングを実行するタイマーのループを作成する方法を知りません。 –

答えて

1

の代わりに、それが呼び出されるたびにあなたの全体の配列をソートし、あなたがこれを行うことができますそれぞれの呼び出しにのみソート一つの要素にあなたのsortメソッドを書き換えることなく、タイマーを使用。

タイマーを使用すると、実際には同じスレッドで実行されますので、ここで何か眠っても再描画しません。

スワッパをRunnableに変更し、スワッパで新しいスレッドを作成してスレッドを開始してください。

スワップしてrepaintを呼び出した後、スワップスレッドにしばらくの間スリープ状態を知らせることができますThread.sleep(delay)

JPanelは再塗りつぶしの間にそれ自身をクリアしないので、カラムが拡大するだけで、決して短くなることはありません。 paintComponentを修正してグラフィックスをクリアするか、代わりにJComponentを拡張してください。

あなたの進歩に役立つ希望。

+0

それは唯一のアプローチですか?私の講師が全部のスリルについて考えることができないので、Runnableはまだ私の能力から外れています –

2

javax.swing.Timerは、待つのに使用されたスレッドを非表示にし、描画するときに起動するので、良い選択です。タイマーのactionPerformed()メソッドにの結果を1つだけスワップします。一度に1ステップずつ実行できるように、selectionSort()を再編成する必要があります。関連するTimerhereがあります。

関連する問題