检查何时从JTable中删除组件

时间:2011-11-25 13:49:02

标签: java swing jtable tablecellrenderer

我有一个JTable,它使用自定义渲染器/编辑器来保存几个JPanel。 JPanel侦听另一个对象以进行更改。现在,当我从JTable中删除行时,JPanel仍然存在于对象的侦听器列表中,因此JPanel不会被破坏。

之前我在另一个JPanel中显示了JPanel,所以当对象被删除后,我可以添加一些代码来取消注册侦听器的removeNotify()方法。

当JPanel位于JTable中时,removeNotify()技巧不起作用,因为它经常被删除并重新添加到表的渲染器/编辑器中。我尝试使用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 个答案:

答案 0 :(得分:1)

  

我有一个使用自定义渲染器/编辑器保存多个JPanel的JTable。

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();
    }
}

答案 1 :(得分:0)

我通过创建一个新的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);
    }
}