2012-02-14 29 views
2

私はカスタムセルエディタでJTableを持っています。エディタはFocusListenerを実装しているので、ユーザーがセルからクリックするとセルの内容が有効かどうかを確認できます。フォーカスが失われた後にイベントキューを延期する

focusLostEventDispatchThread)内にJOptionPaneを使用して、古い値に戻すか、調整値を受け入れるかを選択できるようにしたいと考えています。

ここに問題があります。ユーザーがセルを編集しているときに、テーブルから離れたボタンをクリックすると、ボタンactionlistenersに通知されてからJOptionPaneが返されます。

これは私が起こるしたいものです。

  • ユーザーは、セル
  • ユーザーがボタン
  • セルがフォーカスを含むJOptionPaneが表示され、ユーザがアクション
  • のJOptionPaneの閉じを選択
  • を失っ検出し、クリック編集とセルの値のセット
  • ボタンのアクションリスナーと呼ばれる

その代わり、これが起こっている:

  • ユーザーは、セル
  • ユーザーがボタン
  • セルがフォーカスを含むJOptionPaneが表示され、ユーザが
  • というアクション
  • ボタンのActionListenerにを選択
  • を失っ検出し、クリック編集しますJOptionPaneが閉じ、セルの値のセットが

JOptionPaneが終了するまでボタンのアクションイベントを延期することはできますか?

他のスレッドからは、JDialogは、イベントのディスパッチが確実に行われるように、ダイアログ自体がイベントを処理できるようにしています。

+0

はい、JDialogがAWTイベントキューからJDialogを表示すると、実際にはJDialogのsetVisible(true)の呼び出しがブロックされているため、新しいイベントが送出されないためです。これを避けるために、JDialogはイベントキューにアクセスし、新しい着信イベントを自動的にディスパッチします。現在処理されているイベントの後にイベントを延期する場合は、 'SwingUtilities.invokeLater(Runnable)'を使用できます。 'Runnable'は、現在のイベントの終了後に実行されます。 –

+0

あなたが何をしていても、特に、テーブル(またはツリーまたはコンボ)編集のコンテキストでは、focusListenerを使用しないでください。テーブル自体が内部の魔法と干渉する) – kleopatra

答えて

0

私が収集したことから、ユーザーがJOptionPaneから正しい値を選択するまで、ボタンのアクションリスナーがまったくアクティブにならないようにします。

私には、解決策のように、「disabled」フラグを設定して、focusLostがトリガーされたときに上がるように思えます。選択が行われると、無効フラグがダウンします。ボタンアクションがトリガされると、フォームが無効かどうかがチェックされます。そうであれば何もしません。そうでない場合、それは通常通り続きます。

ボタンイベントは、ユーザーがJOptionPaneで何かを選択すると自動的には表示されませんが、ボタンをもう一度クリックする必要があります。私にとっては、これはフォームを変更する必要がある場合に、ボタンをもう一度クリックした方が良い機能のようです。

+0

はい、それはかなり意味がありますが、私はそれを実装するためのきちんとした方法を考えることはできません。 'disable'フラグを知る必要がある他の多くのGUIコンポーネントがあります。 – Andy

0

有効性確認ロジックをTableCellEditor#stopCellEditing()に入れ、ダイアログが表示され、値が有効でない場合はfalseが返されます。

フォーカスが失われたときにテーブルの編集を自動的に停止するには、table.putClientProperty("terminateEditOnFocusLost", true);を使用しますが、ボタンのアクションリスナーの実行を停止するとは思われません。代わりに、私は通常、actionPerformedでテーブル編集を停止し、falseが返されたときは何もしません(または、たとえば、アクションがそのテーブル行を削除する場合など)。

+0

ありがとうございますが、これは私が探しているものではありません。検証は正常に動作しています。 – Andy

+0

@ user1208882 _validationはうまく機能しています_私は同意しません。つまり、入力自体が有効かどうかを判断することができます。ユーザーの操作やトリガーを防ぐなどの全体的なプロセスは機能しません。 – kleopatra

関連する問題