Каков наилучший способ прослушивания изменений в значениях ячеек 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();