У меня есть JTable, который содержит несколько JPanels, используя пользовательский рендерер / редактор.JPanel слушает другой объект для изменений.Теперь, когда я удаляю строки из JTable, JPanel все еще существует в списке слушателей в объекте, поэтому JPanel не будет уничтожен.
Ранее я отображал JPanel в другом JPanel, поэтому, когда объект был удален, яМожно добавить некоторый код для отмены регистрации слушателя в его методе removeNotify ().
Трюк removeNotify () не работает, когда JPanel находится в JTable, потому что он постоянно удаляется и повторно добавляется в средство визуализации таблицы./редактор.Я пытался использовать addNotify (), чтобы добавить JPanel в качестве слушателя, но почему-то он не удаляется из списка слушателей.Так как мне сделать это как можно более чистым?
Как добавить строки в таблицу:
public void fillTable()
{
DefaultTableModel model = (DefaultTableModel) table.getModel();
model.setRowCount(0);
CustomPanel panel = new CustomPanel(getSomeObject());
model.addRow(new Object[]{panel});
}
Как пользовательская панель регистрируется как слушатель:
public class CustomPanel extends JPanel implements CustomObjectListener
{
public CustomPanel(CustomObjet obj)
{
obj.addListener(this);
}
@Override
public void CustomObjectEvent(Event evt)
{
handle event;
}
}
Как происходит событие:
public class CustomObject
{
ArrayList<CustomObjectListener> listeners = new ArrayList<CustomObjectListener>();
public CustomObject()
{
}
public void addListener(CustomObjectListener listener)
{
listeners.add(listener);
}
public void removeListener(CustomObjectListener listener)
{
listeners.remove(listener);
}
public void fireEvent(Event evt)
{
for (CustomObjectListener listener : listeners)
{
listener.CustomObjectEvent(evt);
}
}
}