私はカスタムセルエディタでJTable
を持っています。エディタはFocusListener
を実装しているので、ユーザーがセルからクリックするとセルの内容が有効かどうかを確認できます。フォーカスが失われた後にイベントキューを延期する
focusLost
(EventDispatchThread
)内にJOptionPane
を使用して、古い値に戻すか、調整値を受け入れるかを選択できるようにしたいと考えています。
ここに問題があります。ユーザーがセルを編集しているときに、テーブルから離れたボタンをクリックすると、ボタンactionlisteners
がに通知されてからJOptionPane
が返されます。
これは私が起こるしたいものです。
- ユーザーは、セル
- ユーザーがボタン
- セルがフォーカスを含むJOptionPaneが表示され、ユーザがアクション
- のJOptionPaneの閉じを選択
- を失っ検出し、クリック編集とセルの値のセット
- ボタンのアクションリスナーと呼ばれる
その代わり、これが起こっている:
- ユーザーは、セル
- ユーザーがボタン
- セルがフォーカスを含むJOptionPaneが表示され、ユーザが
- というアクション
- ボタンのActionListenerにを選択
- を失っ検出し、クリック編集しますJOptionPaneが閉じ、セルの値のセットが
JOptionPane
が終了するまでボタンのアクションイベントを延期することはできますか?
他のスレッドからは、JDialog
は、イベントのディスパッチが確実に行われるように、ダイアログ自体がイベントを処理できるようにしています。
はい、JDialogがAWTイベントキューからJDialogを表示すると、実際にはJDialogのsetVisible(true)の呼び出しがブロックされているため、新しいイベントが送出されないためです。これを避けるために、JDialogはイベントキューにアクセスし、新しい着信イベントを自動的にディスパッチします。現在処理されているイベントの後にイベントを延期する場合は、 'SwingUtilities.invokeLater(Runnable)'を使用できます。 'Runnable'は、現在のイベントの終了後に実行されます。 –
あなたが何をしていても、特に、テーブル(またはツリーまたはコンボ)編集のコンテキストでは、focusListenerを使用しないでください。テーブル自体が内部の魔法と干渉する) – kleopatra