ボタンを押したときにSwingWorkerスレッドの実行を停止する方法を見つけようとしています。私は周りを見回してきましたが、これを行う方法を考え出すのに問題があります。現在、これは私が持っているものです:
new MySwingWorkerClass(args).execute();
次に、スレッドを停止するために使用するボタンを作成します。
button = new JButton("Stop");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
// Stop the swing worker thread
}
});
私はすでに答えを求めて周りを見回してきたので、これまでのところキャンセル方法を見つけることができました。これを使用してスイングワーカーを停止する方法がわかりません。私は以下を試しましたが、うまくいきませんでした:
SwingWorker.cancel(true);
参照をyourSwingWorkerに保持する必要があり、その参照を使用してワーカースレッドをキャンセルします。
MySwingWorker myWorker = new MySwingWorkerClass(args).execute();
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
// Stop the swing worker thread
myWorker.cancel(true);
}
});
ここに完全な例があります:
public class WorkerDemo extends JFrame {
private boolean isStarted = false;
private JLabel counterLabel = new JLabel("Not started");
private Worker worker = new Worker();
private JButton startButton = new JButton(new AbstractAction("Start") {
@Override
public void actionPerformed(ActionEvent arg0) {
if(!isStarted) {
worker.execute();
isStarted = false;
}
}
});
private JButton stopButton = new JButton(new AbstractAction("Stop") {
@Override
public void actionPerformed(ActionEvent arg0) {
worker.cancel(true);
}
});
public WorkerDemo() {
add(startButton, BorderLayout.WEST);
add(counterLabel, BorderLayout.CENTER);
add(stopButton, BorderLayout.EAST);
pack();
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
class Worker extends SwingWorker<Void, Integer> {
int counter = 0;
@Override
protected Void doInBackground() throws Exception {
while(true) {
counter++;
publish(counter);
Thread.sleep(60);
}
}
@Override
protected void process(List<Integer> chunk) {
// get last result
Integer counterChunk = chunk.get(chunk.size()-1);
counterLabel.setText(counterChunk.toString());
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new WorkerDemo();
}
});
}
}
キャンセルされたフラグを定期的に確認する必要があります(例: isCancelled()
)。 SwingWorker
割り込みの処理方法はユーザーに任されています。
詳細については、「 バックグラウンドタスクのキャンセル 」を参照してください。
done()メソッドをオーバーライドして、try catchに配置し、Java.util.concurrent.CancellationExceptionをキャッチすることができます。何かのようなもの
。 。 。
@Overide
done() {
try {
get();
} catch (CancellationException e) {
// Do your task after cancellation
}
}
。 。 。
停車するたびにカウンターをリスタートする必要があると思います。
StartButtonの場合、次のようにワーカーを再起動する必要があります
private JButton startButton = new JButton(new AbstractAction("Start") {
@Override
public void actionPerformed(ActionEvent arg0) {
if(!isStarted) {
worker = new Worker(); // New line
worker.execute();
isStarted = false;
}
}
});
止めるには
worker.setStopFlag(); // in stopButton actionPerformed block.
workerクラスのプライベートブール値stopFlag = false;
そして追加
if( stopFlag)
break;
thread.sleep(60);の後そして最後に、ワーカークラスの最後にstopFlagのセッターを
void setStopFlag(){
stopFlag = true;
}
ちなみに、例外を終了させたい場合は、cancel(true)を使用できます。