看起来你正在做大致正确的事情,但你不应该从 UI 线程调用后台线程上的 join,因为这将冻结 UI,直到后台线程完成。
这是我将使用的基本方法的高度压缩示例(如果 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);
}
}
请注意,上述不是最优的,有些事情还没有处理(例如多次按下运行按钮)。