Обновить JTable

У меня есть JTable, созданный из вектора. Как можно обновить JTable для отображения новых данных, добавленных в вектор?


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


Ответы (2)


Ваш JTable должен автоматически обновляться при изменении TableModel. Я делаю прыжок здесь, но я предполагаю, что вы не используете свою собственную TableModel и просто вызываете конструктор JTable со своим вектором. В этом случае вы можете получить крючок для TableModel и привести его к DefaultTableModel, а затем вызвать один из его методов уведомления, чтобы сообщить JTable об изменении, например:

DefaultTableModel model = (DefaultTableModel)table.getModel();
model.fireTableChanged(new TableModelEvent(........));

Что бы я действительно рекомендовал, так это использовать собственную TableModel, если только это не что-то очень тривиальное, но тот факт, что вы обновляете данные, указывает на то, что это не так.

Ознакомьтесь с учебным пособием sun по работе с таблицами, в частности раздел, посвященный прослушиванию изменений данных.

Может показаться, что это требует дополнительной работы, но в конечном итоге это избавит вас от многих головных болей, и это правильный способ сделать это.

person tddmonkey    schedule 29.01.2009
comment
Что ж, в моей таблице сначала я переношу данные из базы данных в векторы, затем помещаю DefaultTableModel объект для отображения в jtable. Теперь, когда я обновляю строку в своей базе данных, разделяя строку и нажимая на созданный editButton и выполняя обновление, мне нужно знать, как повторно передать данные в векторы, а затем вызвать fireTableDataChanged() для изменения. мой код здесь: stackoverflow.com/questions/18282753/ - person Sajad; 21.08.2013

Я вызываю метод initTable, за которым следует loadTable(). Я уверен, что есть много других способов, но это работает как ачарм.

private void initBerkheimerTable() {
        tblBerkheimer = new JTable();
        tblBerkheimer.getSelectionModel().addListSelectionListener(new SelectionListener());
        tblBerkheimer.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        tblBerkheimer.setModel(new DefaultTableModel(
            new Object[][] {
            },
            new String[] {
                "Id", "Name", "Berkheimer PSD", "Rate", "Current PSD", "Current Rate"
            }
        ) {
            Class[] columnTypes = new Class[] {
                String.class, String.class, String.class, String.class, String.class, String.class
            };
            public Class getColumnClass(int columnIndex) {
                return columnTypes[columnIndex];
            }
            boolean[] columnEditables=new boolean[]{false,false,false,false,false,false,false,false,false,false};
            public boolean isCellEditable(int row, int column) {
                return columnEditables[column];
            }
        });
        scrollPane.setViewportView(tblBerkheimer);
        add(scrollPane);
    }

private void loadTable(){
        PreparedStatement ps=null;
        ResultSet rs=null;
        try {
            PayrollPsdAuditing.payroll=Database.connectToSQLServerDataBase(PayrollPsdAuditing.payrollIni);
            ps=PayrollPsdAuditing.payroll.prepareStatement(
                "SELECT a.EMPLOYID, " +
                "   a.NAME, " +
                "   a.PSD_CODE, " +
                "   a.RATE, " +
                "   b.STRINGS_I_2 as CURRENT_PSD, " +
                "   c.lcltaxrt as CURRENT_RATE " +
                "FROM PYRL_PSD_VALIDATION a, " +
                "   EX010130 b, " +
                "   UPR41400 c " +
                "WHERE a.employid=b.empid_i " +
                "   AND c.localtax=b.strings_i_2");
            rs=ps.executeQuery();
            while(rs.next()) {
                Swing.fillJTable(tblBerkheimer,
                        new String[]{rs.getString("EMPLOYID").trim()
                            ,rs.getString("NAME").trim()
                            ,rs.getString("PSD_CODE").trim()
                            ,String.valueOf(rs.getDouble("RATE"))
                            ,rs.getString("CURRENT_PSD").trim()
                            ,String.valueOf(rs.getDouble("CURRENT_RATE")/100000)});
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            Database.close(PayrollPsdAuditing.payroll);
        }
    }
person bmoran    schedule 02.11.2011