等待Java Swing中的鼠标输入

时间:2009-10-20 14:05:01

标签: java multithreading swing mouseevent wait

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

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

非常感谢任何帮助。提前谢谢。

3 个答案:

答案 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);
    }
}

请注意,上述情况并非最佳,有些事情尚未处理(例如多次按下按钮)。