いくつかのテキスト フィールドの内容とラジオ ボタンのペア (ボタン グループ内) の設定に基づいて検索を行う Swing プログラムがあります。特定のテキスト フィールドがフォーカスを失うと、プログラムは自動的に検索します。ラジオ ボタンの 1 つをクリックして、フォーカスを失うイベントがトリガーされると、問題が発生します。ラジオ ボタンの isSelected() の値が変更される前に、テキスト フィールドでフォーカスが失われたイベントが処理されるため、ラジオの新しい設定に基づくパラメーターではなく、「間違った」(つまり古い) パラメーターを使用して検索が行われます。ボタン。
イベント キューが落ち着いてから検索を実行するために、独自の invokeWhenIdle メソッド (以下に示す) を使用して検索を呼び出してみましたが、ラジオ ボタンの古い設定がまだ使用されています。
私の唯一の有効な解決策は、検索を実行する前に、フォーカスが失われたイベントで 250 ミリ秒遅延して、ラジオ ボタンが変更される時間を確保することです。これは機能しますが、UI の動作が遅くなります。
より良いアイデアはありますか?
public static void invokeWhenIdle(final int a_max_retry, final Runnable a_runnable) {
if (a_max_retry <= 0) {
throw new IllegalStateException("invokeWhenIdle: Could not run " + a_runnable);
}
// get the next event on the queue
EventQueue l_queue = Toolkit.getDefaultToolkit().getSystemEventQueue();
AWTEvent l_evt = l_queue.peekEvent();
if (l_evt == null) {
// nothing left on the queue (but us), we can do it
SwingUtilities.invokeLater(a_runnable);
} else {
// still something in the queue, try again
SwingUtilities.invokeLater(new Runnable() {
public void run() {
invokeWhenIdle(a_max_retry - 1, a_runnable);
}
});
}
}