おおよそ正しいことをしているように見えますが、バックグラウンドスレッドが完了するまでUIがフリーズするため、UIスレッドからバックグラウンドスレッドでjoinを呼び出さないでください。
これが私が使用する基本的な方法の高度に圧縮された例です(SwingWorkerが利用できない場合):
class QueryPerformer implements Runnable {
private volatile boolean plotAreaClicked;
public void run() {
// Perform query and process
while (!plotAreaClicked) {
try {
Thread.sleep(500);
} catch (InterruptedException exception) {
}
}
// Perform tasks following plot area click
}
public void setPlotAreaClicked(boolean plotAreaClicked) {
this.plotAreaClicked = plotAreaClicked;
}
}
そして、UIリスナーでは:
private QueryPerformer queryPerformer;
public void actionPerformed(ActionEvent event) {
// Run button pressed
queryPerformer = new QueryPerformer();
new Thread(queryPerformer).start();
}
public void mouseClicked(MouseEvent event) {
// Plot area clicked
if (queryPerformer != null) {
queryPerformer.setPlotAreaClicked(true);
}
}
上記は最適ではなく、一部の処理が行われていないことに注意してください(複数の実行ボタンを押すなど)。