Проверьте, когда компонент удален из JTable - PullRequest
1 голос
/ 25 ноября 2011

У меня есть 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);
        }
    }
}

Ответы [ 2 ]

1 голос
/ 25 ноября 2011

У меня есть JTable, который содержит несколько JPanels, используя пользовательский рендерер / редактор.

В DefaultCellEditor есть метод stopCellEditing(), в который вы сможете добавить свой код.

Или, может быть, вы можете добавить PropertyChangeListener в таблицу:

public void propertyChange(PropertyChangeEvent e)
{
    //  A cell has started/stopped editing

    if ("tableCellEditor".equals(e.getPropertyName()))
    {
        if (table.isEditing())
            processEditingStarted();
        else
            processEditingStopped();
    }
}
0 голосов
/ 28 ноября 2011

Я исправил это, создав новую TableModel и переопределив метод setRowCount ().

public class CustomTableModel extends DefaultTableModel
{
    @Override
    public void setRowCount(int rowCount)
    {
        if (rowCount < getRowCount())
        {
            for (int i = getRowCount()-1; i >= rowCount; i--)
            {
                ((CustomPanel)getValueAt(i, 0)).removeListeners();
            }
        }
        super.setRowCount(rowCount);
    }
}
...