Как удалить строку в JTable с помощью пользовательской TableModel
Я читал посты, похожие на мои, и читал страницу с учебником по Java, но я просто не могу заставить это работать. Я не уверен, что я упускаю что-то фундаментальное или нет...
У меня есть пользовательская модель таблицы ниже, из которой я должен иметь возможность удалять строки. Таблица инициализируется пустой, а строки добавляются через поле со списком и кнопку добавления. Также есть кнопка удаления, которая должна удалить выбранную строку из таблицы.
class TableModel extends AbstractTableModel
{
private String[] columnNames = {"Enabled", "Value" };
protected Class[] columnClasses = new Class[] { Boolean.class, String.class };
public int getColumnCount() { return columnNames.length; }
public int getRowCount() { return filters.size(); }
public String getColumnName(int col) { return columnNames[col]; }
public Class getColumnClass(int col) { return columnClasses[col]; }
public Object getValueAt(int row, int col) { ... }
public void setValueAt(Object value, int row, int col) { ... }
public void addRow(String value)
{
fireTableRowsInserted(filters.size() - 1, filters.size() - 1);
int row = filters.size() -1 ;
int col = 1;
setValueAt(value, row, col);
}
public void removeRow(int row)
{
fireTableRowsDeleted(selectedRow, selectedRow);
}
}
Я подтвердил, что selectedRow
содержит правильную строку сквозных отпечатков в консоли. fireTableRowsDeleted
Функция просто ничего не делает. Ряд все еще существует. Как вы просто удалите конкретную строку?
Спасибо,
3 ответа
Сразу после того, как я опубликовал это, я понял это.
Содержимое строк основано на списке фильтров:
public int getRowCount() { return filters.size(); }
Моя проблема заключалась в том, что я пытался удалить строку, не удаляя ее из списка. Поэтому я модифицировал removeRow()
быть следующим:
public void removeRow(int row)
{
filters.remove(row);
fireTableRowsDeleted(row, row);
}
И это работает как шарм.
ура
Призыв к fireTableRowsDeleted
просто запускает событие, чтобы указать, что строки были удалены, вам все равно нужно фактически удалить их из модели.
Я думаю, что это ответ:
final int row = selectedRow;
EventQueue.invokeLater(new Runnable() {
public void run() {
model.removeRow(row);
}
});
Строка будет удалена после завершения редактирования.