1

EventAdmin は Swing 環境で安全に使用できますか? 私は次のシーケンスを持っているので、私は尋ねています:

  • JButton から ActionListener 通知を受け取る
  • JPanel を作成し、イベントのプロパティに配置します。
  • EventAdmin#sendEvent(Event) を使用して、イベントを同期的に送信します
  • サブスクライバーでイベントを受け取る
  • プロパティから JPanel を取得し、EDT にない場合は SwingUtilities#InvokeAndWait を使用して、いくつかの JComponents を内部に配置します。
  • EventAdmin#sendEvent() の呼び出し元で、メソッドが返され、JPanel が入力され、それをダイアログに追加して表示できます。

これの目的は、すべてのサブスクライバーが呼び出されたときに表示される JPanel に必要なものをサブスクライバーがインストールできるようにすることです。

ボタンを初めてクリックすると、すべてが EDT で実行されるため、すべてがうまくいきます。2 回目は、サブスクライバーが EDT ではないスレッドで呼び出されます。したがって、invokeAndWait によって起動された実行可能ファイルで JComponent のインストールを実行します。この呼び出しは 5022 ミリ秒ブロックされます (5000 ミリ秒はデフォルトの EventAdmin タイムアウト時間です)。ブロックが解除されると、私のダイアログが表示されます。次の時間、私のサブスクライバーはもう呼び出されません。EventAdmin によってブラックリストに登録されている必要があります。

サブスクライバーが EDT で 2 回目に呼び出されないのはなぜですか?

4

2 に答える 2

4

いいえ。Event Admin は、イベントが配信されるスレッドを保証しません。また、元の送信スレッドではないことはほぼ確実です。

ハンドラーは自分がどのスレッドにいるかを認識していないため、GUI を直接操作することはできません。代わりにSwingUtilities.invokeLater()、Runnable をイベント キューにプッシュするために使用する必要があり、その Runnable で GUI を変更できます。例えば:

class MyEventHandler implements EventHandler {
    public void handleEvent(final Event event) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                // here you can make the UI changes in response to the event data
            }
        });
    }
}
于 2013-04-20T07:04:12.530 に答える