我正在开发一个Java Swing应用程序。我有一个按钮,其动作在数据库上运行查询,然后绘制结果。这些命令是从“运行”按钮上的侦听器执行的。据我了解,这意味着此时运行的线程来自EventQueue。
给定某些输入,我需要暂停处理并等待用户点击绘图区域。我正在努力寻找一种方法来做到这一点。我看了一遍,但我似乎无法找到一个有效的解决方案。我试图创建一个等待用户输入的新线程(我在这个线程上调用join)。问题是这使得前一个线程(来自EventQueue)等待。出于某种原因,鼠标点击不会导致中断,因此永远不会捕获鼠标点击。
非常感谢任何帮助。提前谢谢。
答案 0 :(得分:5)
让EventDispatcherThread处理输入。相反,您生成的线程应该是进行计算的线程。我建立了一个交互式用户界面,在一两年前做过类似的事情,这就是我完成这种行为的方式。
基本上,您在GUI和数据处理线程之间创建生产者/消费者模型。当触发输入时,您将进入消费者线程并恢复活动。
答案 1 :(得分:4)
使用SwingWorker类。
答案 2 :(得分:0)
看起来你做的大概是正确的,但你不应该在UI线程中调用后台线程的连接,因为这会冻结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);
}
}
请注意,上述情况并非最佳,有些事情尚未处理(例如多次按下按钮)。