Как удалить строку в JTable с помощью пользовательской TableModel - PullRequest
1 голос
/ 30 декабря 2010

Я читал посты, похожие на мои, и читал страницу по обучению 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 ]

5 голосов
/ 30 декабря 2010

Вызов fireTableRowsDeleted просто запускает событие, чтобы указать, что строки были удалены, вам все равно нужно фактически удалить их из модели.

4 голосов
/ 30 декабря 2010

Сразу после того, как я опубликовал это, я понял это.

Содержимое строк основано на списке фильтров:

public int getRowCount() { return filters.size(); }

Моя проблема заключалась в том, что я пытался удалить строку, не удаляя ее из списка. Поэтому я изменил removeRow() так:

public void removeRow(int row)
{
    filters.remove(row);
    fireTableRowsDeleted(row, row);
}

И это работает как шарм.

ура

0 голосов
/ 02 января 2013

Я думаю, что это ответ:

final int row = selectedRow;
EventQueue.invokeLater(new Runnable() {
       public void run() {
             model.removeRow(row);
       }
});

Строка будет удалена, когда редактирование будет завершено.

...