Каков наилучший способ прослушивания изменений в значениях ячеек JTable и соответствующего обновления базы данных?
Я создаю приложение с несколькими JTables
и мне нужно определить, когда происходит изменение значения ячейки, чтобы я мог обновить его в базе данных. Я пытался!--1--> и переопределить tableChanged
, но он стреляет только когда я клик (нажмите на другую строку) после того, как я отредактировал ячейку.
любой другой способ сделать это?
4 ответов
можно использовать тег CellEditorListener
интерфейс, как показано в этой пример. Обратите внимание, что это CellEditorListener
.
также может быть удобно завершить редактирование, когда фокус потерян:
table.putClientProperty("terminateEditOnFocusLost", true);
Я согласен с @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, поэтому каждый раз, когда пользователь попадает в ячейку, будет обновляться.
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();