カスタムレンダラー/エディターを使用して複数のJPanelを保持するJTableがあります。JPanelは、変更について別のオブジェクトをリッスンします。これで、JTableから行を削除しても、JPanelはオブジェクトのリスナーリストにまだ存在しているため、JPanelが破棄されることはありません。
以前は、JPanelを別のJPanelに表示していたので、オブジェクトが削除されたときに、removeNotify()メソッドでリスナーの登録を解除するコードを追加できました。
removeNotify()トリックは、JPanelがJTableにある場合は機能しません。これは、JPanelが常に削除され、テーブルのレンダラー/エディターに再度追加されるためです。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);
}
}
}