2つのオプションがあります。
- 新しいスレッドを開始します。スレッドにはwhileループが含まれ、配列を処理するメソッドを実行します。各反復で、
repaint()
またはinvalidate()
ウィンドウを呼び出して、再描画が必要であることを通知します。
- タイマーを使用します。GUIスレッドは、定期的にルーチンを呼び出します。
スレッド:
メソッドで、actionPerformed
新しいスレッドを作成します。そして、そのstartメソッドを呼び出します。スレッドのRunnable
は、(すでに実行したように)whileループを実行してから、単に終了する必要があります。
タイマー:
タイプTimerのクラスにオブジェクトを作成します。java.swing.Timer
スイングを使用している場合は、で1つを使用します( java.util.Timer
GUI操作に適さないものもあります)。タイマーActionListener
には、メソッドを1回呼び出すが必要ですが、タイマーの繰り返しレートは1000msです。
チップ
- アクションを呼び出すには、ボタンハンドラーのすぐ下ではなく、別のメソッドに配置する必要があります。そうすれば、GUIスレッドの外部からGUIのものを呼び出すことはありません。
例えば
tickButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
doTick();
}
});
スレッドを停止するメカニズムも同様に重要です。一般に、スレッドでaを使用しないでくださいwhile(true)
。失われるため、それを終了するためのセマフォを発明します。
JToggleButton
ではなくを使用しButton
ますか?
同期:スレッドを使用する場合、ボタンが押されるたびに新しいスレッドが作成されないようにするために、次のようなものが必要になります。
コード
Thread autoplayThread = null;
Object lock;
boolean autoplaying = false;
public void actionPerformed(ActionEvent e){
synchronized(lock){ // prevent any race condition here
if(!autoplaying && autoplayThread==null ){
autoplaying = true;
autoplayThread = new Thread(new Runnable(){
public void run(){
try{
while(autoplaying){ .... }
}finally{
synchronized(lock) {
autoplaying=false;
autoplayThread=null;
}
}
}
});
autoplayThread.start();
}else{ // stop the thread!
autoplaying=false;
}
}
}