我有一个使用自定义渲染器/编辑器来保存多个JPanel的JTable。 JPanel监听另一个对象进行更改。现在,当我从JTable中删除行时,JPanel仍然存在于对象的侦听器列表中,因此JPanel不会被销毁。检查组件是否从JTable中删除
此前我在另一个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);
}
}
}
你能展示一些代码吗? – Jonas
不要将_components_添加到模型中。相反,添加由定制cellRenderers呈现/编辑的_data_ /编辑器 – kleopatra