0

我正在开发一个 Java Swing 应用程序。我有一个按钮,其操作在数据库上运行查询,然后绘制结果。这些命令是从“运行”按钮上的侦听器执行的。据我了解,这意味着此时运行的线程来自EventQueue。

给定某些输入,我需要停止处理并等待用户单击绘图区域。我正在努力寻找一种方法来做到这一点。我已经查看了所有内容,但似乎找不到有效的解决方案。我试图创建一个等待用户输入的新线程(我在这个线程上调用 join)。问题是这会使前一个线程(来自 EventQueue)等待。出于某种原因,鼠标点击不会导致中断,因此永远不会捕获鼠标点击。

任何帮助将非常感激。提前致谢。

4

3 回答 3

5

让 EventDispatcherThread 处理输入。相反,您生成的线程应该是进行计算的线程。我在一两年前构建了一个交互式 UI,它做了类似的事情,这就是我实现这种行为的方式。

本质上,您在 GUI 和数据处理线程之间创建了一个生产者/消费者模型。当一个输入被触发时,你会提供给消费者线程并恢复活动。

于 2009-10-20T14:09:03.363 回答
4

使用SwingWorker类。

于 2009-10-20T14:15:37.483 回答
0

看起来你正在做大致正确的事情,但你不应该从 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);
    }
}

请注意,上述不是最优的,有些事情还没有处理(例如多次按下运行按钮)。

于 2009-10-24T11:16:35.267 回答