У меня есть JTable, созданный из вектора. Как можно обновить JTable для отображения новых данных, добавленных в вектор?
Обновить JTable
Ответы (2)
Ваш JTable должен автоматически обновляться при изменении TableModel. Я делаю прыжок здесь, но я предполагаю, что вы не используете свою собственную TableModel и просто вызываете конструктор JTable со своим вектором. В этом случае вы можете получить крючок для TableModel и привести его к DefaultTableModel, а затем вызвать один из его методов уведомления, чтобы сообщить JTable об изменении, например:
DefaultTableModel model = (DefaultTableModel)table.getModel();
model.fireTableChanged(new TableModelEvent(........));
Что бы я действительно рекомендовал, так это использовать собственную TableModel, если только это не что-то очень тривиальное, но тот факт, что вы обновляете данные, указывает на то, что это не так.
Ознакомьтесь с учебным пособием sun по работе с таблицами, в частности раздел, посвященный прослушиванию изменений данных.
Может показаться, что это требует дополнительной работы, но в конечном итоге это избавит вас от многих головных болей, и это правильный способ сделать это.
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);
}
}