我有一个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);
}
}
}
答案 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);
}
}