Java Swing - удаление строк из таблицы с помощью AbstractTableModel () - PullRequest
2 голосов
/ 13 августа 2010

У меня есть таблица с AbstractTableModel. Данные в таблице хранятся в векторе. Теперь, когда я удаляю строку, я удаляю ее успешно из вектора, но это не обновляется в представлении, т.е. в графическом интерфейсе.

Я читал в другом месте, что мне нужно использовать fireTableRowsDeleted (), и я пытаюсь вызвать его внутри метода-обертки в моем AbstractTableModel:

dataModel = new AbstractTableModel() {
          public void removeAl() {
                  fireTableRowsDeleted(0, getRowCount()-1);
          }
};

Но это удаление для меня недоступно. Я нигде не могу назвать это так: dataModel.removeAl()

Не могли бы вы помочь мне понять, что происходит не так? Как обновить графический интерфейс при удалении строк?

EDIT: Как оказалось, проблема была в другом месте. Как только я исправил это, удаление строки из самого вектора начало обновлять графический интерфейс. :)

Ответы [ 2 ]

3 голосов
/ 13 августа 2010

В дополнение к тому, что сказал mdma, вам также необходимо переопределить следующие методы из интерфейса TableModel (они не реализованы AbstractTableModel), поэтому вы не можете создать экземпляр любого подкласса AbstractTableModel, если он не переопределяет этиметоды:

public int getRowCount();
public int getColumnCount();
public Object getValueAt(int row, int column);

Наконец, простого запуска tableRowsDeleted в вашем методе removeAll() будет недостаточно, вам нужно будет повлиять на то, что возвращают 3 предыдущих метода;т.е. после вызова removeAll() вы должны убедиться, что getRowCount() возвращает 0, иначе у вас будут проблемы (NullPointerException или эквивалент в худшем случае, JTable обновление проблем в лучшем случае)!

Может быть, вам лучше использовать DefaultTableModel на первом этапе, это облегчит вам задачу.Вывод из AbstractTableModel придет позже.Это в значительной степени зависит от того, что ты хочешь делать на самом деле ...

1 голос
/ 13 августа 2010

Вы не можете видеть, что ваш метод removeAll объясняется тем, что он объявлен в анонимном классе - анонимный класс не может быть указан по имени, любые новые объявления в нем недоступны. По этой причине публичные объявления в анонимных классах обычно переопределяются, поскольку они будут доступны с использованием неанонимного базового класса.

Чтобы исправить это, объявите модель таблицы как обычный подкласс AbstractTableModel

public class MyTableModel extends AbstractTableModel {

   public void removeAll() {
      fireTableRowsDeleted(...);
   }
}

Ваш клиентский код затем будет приведен к MyTableModel для доступа к методу removeAll().

Более простое, но более плохое решение - продолжать использовать клиенты AbstractTableModel, а клиенты явно вызывают fireTableRowsDeleted().

...