Java Swing – удаление строк из таблицы с помощью AbstractTableModel()

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

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

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

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

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

РЕДАКТИРОВАТЬ: Как оказалось, проблема была в другом. Как только я это исправил, удаление строки из самого вектора начало обновление графического интерфейса. :)


person Chaitanya    schedule 13.08.2010    source источник
comment
Я бы ответил, но сначала примите некоторые ответы.   -  person Romain Hippeau    schedule 13.08.2010
comment
@Romain Цель stackoverflow.com - обмен знаниями, а не накопление очков репутации.   -  person Steve Kuo    schedule 13.08.2010
comment
Прошу прощения за невнимательность. Теперь я принял ответы на все свои вопросы. Не могли бы вы передумать отвечать мне?   -  person Chaitanya    schedule 13.08.2010
comment
вы смотрели: download.oracle.com/javase/tutorial/uiswing /компоненты/ ?   -  person Romain Hippeau    schedule 13.08.2010


Ответы (2)


В дополнение к тому, что сказал 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 произойдет позже. Это в значительной степени зависит от того, что вы хотите сделать на самом деле...

person jfpoilpret    schedule 13.08.2010

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

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

public class MyTableModel extends AbstractTableModel {

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

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

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

person mdma    schedule 13.08.2010
comment
Спасибо за ответ. Я попробую это и дам вам знать, как это происходит. - person Chaitanya; 13.08.2010