我有一个使用自定义渲染器/编辑器保存多个 JPanel 的 JTable。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);
}
}
}