У меня есть JTable в моем графическом интерфейсе, который я хочу динамически обновлять. С Jtable, конечно же, связана TableModel, где я расширил AbstractTableModel и переопределил соответствующие методы.
У меня есть четыре метода для моего JTable:
- Добавить ряд
- КопироватьSelectedRow
- УдалитьSelectedRow
- Удалить все
Когда я запускаю AddRow или CopySelectedRow, таблица «отстаёт на одно обновление»:
Если я нажму newRow один раз, визуально ничего не произойдет.
Если я дважды нажимаю newRow, первый отображается, а второй нет.
Однако использование deleteSelected или deleteAll обновляет таблицу, когда я нажимаю (т.е. не отстаю).
Выдержка из моего класса TableModel:
public class TableModel extends AbstractTableModel {
private List<String[]> data;
public TableModel() {
data = new ArrayList<String[]>();
}
...
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
data.get(rowIndex)[columnIndex] = aValue.toString();
fireTableCellUpdated(rowIndex, columnIndex);
}
public void addRow(String[] aValue) {
data.add(aValue);
fireTableRowsInserted(data.size()-1, data.size()-1);
}
public void copyRow(int rowIndex) {
addRow(data.get(rowIndex));
}
public void removeRow(int rowIndex) {
data.remove(rowIndex);
fireTableRowsDeleted(rowIndex, rowIndex);
}
И как я их называю:
JButton newRow = new JButton("New row");
newRow.addActionListener(new ActionListener() {
// Handling newRow event
public void actionPerformed(ActionEvent e) {
tableModel.addRow(new String[]{"", "", "", "", "", "", "", "", "", "", ""});
}
});
JButton copyRow = new JButton("Copy selected row");
copyRow.addActionListener(new ActionListener() {
// Handling copyRow event
public void actionPerformed(ActionEvent e) {
if (table.getSelectedRow() != -1) {
tableModel.copyRow(table.getSelectedRow());
}
}
});
JButton deleteRow = new JButton("Delete selected row");
deleteRow.addActionListener(new ActionListener() {
// Handling deleteRow event
public void actionPerformed(ActionEvent e) {
if (table.getSelectedRow() != -1) {
tableModel.removeRow(table.getSelectedRow());
}
}
});
JButton deleteAllRows = new JButton("Delete all rows");
deleteAllRows.addActionListener(new ActionListener() {
// Handling deleteAllRows event
public void actionPerformed(ActionEvent e) {
for (int i = tableModel.getRowCount() - 1; i >= 0; i--) {
tableModel.removeRow(i);
}
}
});
РЕДАКТИРОВАТЬ:
Я решил использовать AbstractTableModel, потому что у меня была такая же проблема с DefaultTableModel (всякий раз, когда я добавлял строку, она не добавлялась до тех пор, пока не была «добавлена» следующая), а с AbstractTableModel я мог бы сам запускать события изменения. Однако это ничего не исправило. Может ли кто-нибудь пролить свет на мою проблему здесь? Я был бы рад более подробно рассказать о деле, если кому-то понадобится дополнительная информация.