1

現在、Java スイングのJTable/にフォーカスの問題があります。JTextEditorにはJTableカスタム セル エディタがあり、JTextField.

問題は、セルの編集中に無効なデータが含まれている場合に、ユーザーが をクリックするJButtonと、テキスト フィールドの編集が停止し、JButtonactionPerformed (クリックされた) が呼び出されることです。はJTable#setValueAt検証を処理するため、 のデータJTextFieldが無効な場合、基になるデータTableModelは更新されません。

JButton理想的には、クリックを発生させたくありません。フォーカスはJTableまたは にとどまる必要がありJTextFieldます。

ボタンをクリックすると、送信アクションが実行され、テーブルが含まれるフレームが閉じられます。 の検証ではTableModel#setValueAt値が更新されないため、古い値が送信されます。

これはできますか?私はまだSwingにかなり慣れていないので、何をチェックすればよいかわかりません。

残念ながら、私たちのコードは簡単ではありません。UI は XML から構築され、ボタンはフォーム上の他のものについて何も認識しません (これは私が継承したコードです)。

.net では、Validating イベントを処理してキャンセル フラグを設定することで、コントロールがフォーカスを失うのを止めることができます。Javaにも同様のメカニズムがありますか。

4

4 に答える 4

3

での編集が完了した後の入力の検証は、setValueAt()不便なほど遅くなる可能性があります。対応するチュートリアル セクションにリンクしているこのに示されているように、エディター自体が無効な値のナビゲーションを除外できます。

有効な値については、フォーカスを失ったときにテーブルをコミットできます。

table.putClientProperty("terminateEditOnFocusLost", true);
于 2012-05-23T17:59:45.990 に答える
0

エディター コンポーネント、つまりテキスト フィールドで inputverifier を使用してみてください。

于 2012-05-23T12:10:59.673 に答える
0

コンポーネントからフォーカスが失われると、失われたフォーカス メソッドが呼び出されます (詳細はhttp://docs.oracle.com/javase/tutorial/uiswing/events/focuslistener.htmlを参照)。したがって、フォーカスを失ったときに検証メソッドを呼び出すことができます。

特定のフィールドが編集されていることを認識する必要がない場合は、ボタン内で検証を実行し、成功しない場合は送信を防止することもできます。

于 2012-05-23T12:14:03.603 に答える
0

stopCellEditingメソッドをオーバーライドすることで、同様の機能を実現しました。JTableCellEditor

@Override
public boolean stopCellEditing() {
   String s = (String) getCellEditorValue();       
   if (s != null) {           
       if (!testYourValue()) {           
           Toolkit.getDefaultToolkit().beep();           
           return false;
       }
   }
   return super.stopCellEditing();
} 
于 2014-09-23T05:36:33.157 に答える