我有一個使用自定義渲染器/編輯器來保存多個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