0

Javaでアプリを作成しています。JTable のセルを編集するときに追加の動作を提供する必要があります。したがって、理想的には、編集後にセルがフォーカスを失ったときにこれが発生します。後処理によっては、セルの値をリセットする場合があります。セル エディタを使用してみましたが、望ましい動作が得られません。

デフォルトの JTable では、セルをダブルクリックすると編集可能になります。しかし、CellEditor の私の実装では、セルがフォーカスされるとすぐに編集可能になります。

My カスタム CellEditor のコードは次のとおりです。

public class ParameterDefinitionEditor 
    extends AbstractCellEditor
    implements TableCellEditor{

    private JTable table;
    private DefaultTableModel defaultTableModel;

public ParameterDefinitionEditor(DefaultTableModel defaultTableModel,
JTable table) { 

        super();
        this.table = table;
        this.defaultTableModel = defaultTableModel;

        TableColumnModel columnModel = table.getColumnModel();
        columnModel.getColumn(0).setCellEditor(this);

}

    public Component getTableCellEditorComponent(JTable table, 
                            Object value, 
                         boolean isSelected, 
                        int row, 
                         int column) {

        if (isSelected) {
            // Do some processing.
        } 

        ((JTextField)component).setText((String)value);

        // Return the configured component
        return component;
    }

    public Object getCellEditorValue() {

        return ((JTextField)component).getText();
    }


}

どんな助けでも大歓迎です。ありがとう。

4

3 に答える 3

2

後処理によっては、セルの値をリセットする場合があります。

stopCellEditing() メソッドをオーバーライドすることで、必要に応じてセル エディターでこれを行うことができます。

デフォルトの JTable では、セルをダブルクリックすると編集可能になります。しかし、CellEditor の私の実装では、セルがフォーカスされるとすぐに編集可能になります。

DefaultCellEditor を拡張します。これは setClickCountToStart() メソッドによって制御されます。

理想的には、これは編集後にセルがフォーカスを失ったときに発生します

おそらくTableModelListenerをTableModelに追加する必要があるという他の提案に同意します。要件によっては、 Table Cell Listenerの使用を検討することもできます。

于 2009-11-17T07:18:41.697 に答える
1

カスタムセルエディターを提供することで目的が果たされるとは思いません。

ユーザー アクションに基づいて何らかの処理を実行する場合は、テーブル モデル
に一連のリスナー (TableModelListener を実装する) が必要であり、ロジックを
"tableChanged" メソッドに配置する必要があります。

Swing チュートリアルのこのセクションも確認してください:
http://java.sun.com/docs/books/tutorial/uiswing/components/table.html

于 2009-11-17T06:20:59.393 に答える
1

私は stopCellEditing をオーバーライドすることでそのタイプの動作を実現しました (私は AbstractCellEditor のカスタム実装を使用します)

public boolean stopCellEditing()
{
String s = (String) getCellEditorValue();
if ( ! valueValidator.isValid(s) )
  {
  editorComponent.setBorder(new LineBorder(Color.red));        
  Toolkit.getDefaultToolkit().beep();
  return false;
  }
}
else { ........
于 2009-11-17T07:25:54.550 に答える