Обновление значения ячейки (JTable)

У меня возникла проблема при обновлении значения ячейки JTable. Что я хочу сделать, так это после выбора конкретной ячейки из JTable, я должен иметь возможность редактировать, и действие должно отражать базу данных на заднем конце. Я использую HSQL. В моей таблице 4 столбца с одним ПК. Пожалуйста, дайте мне альтернативу и/или предоставьте мне некоторый код, заменив * s. Я новенький, только начинающий.

d_view.addActionListener(new ActionListener() { //----action listener of a button
    public void actionPerformed(ActionEvent po) {
        try {
            Connection connec;
            Class.forName("org.hsqldb.jdbcDriver");
            connec = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/","SA", "");
            java.sql.Statement stt=connec.createStatement();
            ResultSet rs=stt.executeQuery("select * from DepReg");//----------TO VIEW DATA IN TABULAR FORMAT
            ResultSetMetaData rt=rs.getMetaData();
            int cols=rt.getColumnCount();
            String c[] =new String[cols];
            for(int i=0;i<cols;i++){
                c[i]=rt.getColumnName(i+1);
                dm.addColumn(c[i]);
            }
              Object row[]=new Object[cols];
                while(rs.next()){
                     for(int i=0;i<cols;i++){
                            row[i]=rs.getString(i+1);
                        }
                    dm.addRow(row);
                }
                table.setModel(dm);
                connec.close();
            }
        catch (Exception ty) {}
    }
});//--------HERE THE PROBLEM STARTS
table.getModel().addTableModelListener(new TableModelListener() {
    public void tableChanged(TableModelEvent tme) {
        int rows=tme.getFirstRow();
        int colms=tme.getColumn();
        TableModel model=(TableModel)tme.getSource();
        String colname=model.getColumnName(colms);
        Object data=model.getValueAt(rows, colms);
//*********EDIT/REPLACE THE CODE ***************//
        try {
            Connection connec;
            Class.forName("org.hsqldb.jdbcDriver");
            connec = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/","SA", "");
            java.sql.Statement stt=connec.createStatement();
//-----------I WILL INCLUDE AN UPDATE STATEMENT OVER HERE BASED ON THE VALUE SELECTED
        }
        catch (Exception ae) {}
        }
});

person Community    schedule 03.10.2012    source источник


Ответы (1)


  • Соединения с базой данных не должны выполняться в потоке отправки событий. Они просто слишком медленные. Переместите это в фоновый поток. Дополнительную информацию см. в руководстве по Swing concurrency.
  • Мне не совсем ясно, можете ли вы уже редактировать свою таблицу, но если нет, это достигается путем проверки TableModel того, что метод isCellEditable возвращает true для ячеек, которые вы хотите редактировать, и что вы установили TableCellEditor на вашем JTable
  • Вместо добавления TableModelListener для обновления вашей базы данных я бы перенес эту логику в пользовательский TableModel. Каждый раз, когда вызывается метод setValueAt, вы знаете, что были внесены изменения. Затем вы можете обновить базу данных (опять же, не в потоке отправки событий).
  • Если базу данных можно обновлять и из других мест, вы, вероятно, захотите опросить базу данных в определенные моменты времени, чтобы обновить TableModel, чтобы отразить последнее состояние базы данных. Убедитесь, что вы выполняете опрос в рабочем потоке. Затем вы можете либо создать новый TableModel в рабочем потоке, либо заменить TableModel таблицы в потоке отправки событий. Или вы можете обновить существующую модель в EDT (не забудьте активировать события, или, если ваша модель расширяется от DefaultTableModel/AbstractTableModel, вы можете использовать доступный API).

Я также рекомендую прочитать руководство по Swing table для получения дополнительной информации.

person Robin    schedule 03.10.2012
comment
Да, я могу редактировать ячейки и выбирать всю строку... Кроме того, есть ли альтернативный метод для получения последнего состояния базы данных? как использование таймеров (которые будут проверять и/или обновлять JTable через несколько секунд)?? - person ; 03.10.2012