複数のJTables
を使用してビルドとアプリを作成していますが、データベースで更新できるように、セル値の変更がいつ発生するかを検出する必要があります。 TableModelListener
を試し、tableChanged
をオーバーライドしましたが、セルを編集した後、クリックしたときのみ(別の行をクリック)が発生します。
これを行う他の方法はありますか?
この example に示すように、 CellEditorListener
インターフェースを実装できます。 JTable
自体はCellEditorListener
であることに注意してください。
次に示すように、フォーカスが失われたときに編集を終了すると便利な場合もあります ここ :
table.putClientProperty("terminateEditOnFocusLost", true);
その他のSwingクライアントプロパティが見つかる場合があります ここ 。
@mKorbelに同意します-すべての入力がチェックボックスとドロップダウンでない限り、セルの編集が停止するまで待つ必要があります(文字が入力されるたびにデータベースにコミットする必要はありませんテキストボックス)。
別のコンポーネントにフォーカスが移動した後、コミットしないことが問題である場合は、テーブルでフォーカスが失われたときにテーブルの編集を停止するFocusListener
を追加します。
例:
final JTable table = new JTable();
table.addFocusListener(new FocusAdapter() {
@Override
public void focusLost(FocusEvent e) {
TableCellEditor tce = table.getCellEditor();
if(tce != null)
tce.stopCellEditing();
}
});
私はEnterキーを使用しているので、ユーザーがEnterキーを押すたびに、セルが更新されます。
DefaultTableModel dtm = new DefaultTableModel(data, columnNames);
JTable table = new JTable(dtm);
table.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
int row = table.getSelectedRow();
int column = table.getSelectedColumn();
// resul is the new value to insert in the DB
String resul = table.getValueAt(row, column).toString();
// id is the primary key of my DB
String id = table.getValueAt(row, 0).toString();
// update is my method to update. Update needs the id for
// the where clausule. resul is the value that will receive
// the cell and you need column to tell what to update.
update(id, resul, column);
}
}
});
これは、選択の変更または保存ボタンからイベントハンドラーの編集を停止する場合にも便利です。
if (table.isEditing())
table.getCellEditor().stopCellEditing();