0

私はJavaSwingアプリケーションに取り組んでいます。そのアクションがデータベースに対してクエリを実行し、結果をプロットするボタンがあります。これらのコマンドは、リスナーの[実行]ボタンから実行されます。私が理解しているように、これは、この時点で実行されているスレッドがEventQueueからのものであることを意味します。

特定の入力が与えられたら、処理を停止して、ユーザーがプロット領域をクリックするのを待つ必要があります。私はこれを行う方法を見つけるのに苦労しています。私は全体を見てきましたが、うまくいく解決策を見つけることができないようです。ユーザー入力を待つ新しいスレッドを作成しようとしました(このスレッドでjoinを呼び出します)。問題は、これにより(EventQueueからの)前のスレッドが待機することです。何らかの理由で、マウスのクリックによって割り込みが発生しないため、マウスのクリックがキャプチャされることはありません。

どんな助けでも大歓迎です。前もって感謝します。

4

3 に答える 3

5

EventDispatcherThreadに入力を処理させます。むしろ、生成されたスレッドが計算を行うスレッドである必要があります。1、2年前に似たようなことをするインタラクティブなUIを作成し、それがこの動作を実現した方法です。

基本的に、GUIとデータ処理スレッドの間にプロデューサー/コンシューマーモデルを作成します。入力が実行されると、コンシューマスレッドにフィードし、アクティビティを再開します。

于 2009-10-20T14:09:03.363 に答える
4

SwingWorkerクラスを使用します。

于 2009-10-20T14:15:37.483 に答える
0

おおよそ正しいことをしているように見えますが、バックグラウンドスレッドが完了するまでUIがフリーズするため、UIスレッドからバックグラウンドスレッドでjoinを呼び出さないでください。

これが私が使用する基本的な方法の高度に圧縮された例です(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 に答える