簡體   English   中英

等待Java Swing中的鼠標輸入

[英]Waiting for mouse input in Java Swing

我正在開發Java Swing應用程序。 我有一個按鈕,該按鈕的操作在數據庫上運行查詢,然后繪制結果。 這些命令在“運行”按鈕上從偵聽器執行。 據我了解,這意味着此時運行的線程來自EventQueue。

給定一定的輸入后,我需要停止處理並等待用戶單擊繪圖區域。 我正在努力尋找一種方法來做到這一點。 我已經四處張望,但似乎找不到有效的解決方案。 我試圖創建一個等待用戶輸入的新線程(我稱此線程為join)。 問題在於,這會使先前的線程(來自EventQueue)等待。 由於某些原因,鼠標單擊不會引起中斷,因此永遠不會捕獲鼠標單擊。

任何幫助將非常感激。 提前致謝。

讓EventDispatcherThread處理輸入。 相反,您生成的線程應該是進行計算的線程。 我構建了一個交互式UI,在一兩年前做了類似的事情,這就是我實現此行為的方式。

本質上,您可以在GUI和數據處理線程之間創建生產者/消費者模型。 觸發輸入后,您將進入使用者線程並恢復活動。

使用SwingWorker類。

似乎您在做正確的事,但是您不應該在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);
    }
}

請注意,上述操作不是最佳方法,某些事情尚未得到處理(例如多次按下運行按鈕)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM