1

カスタムレンダラー/エディターを使用して複数の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);
        }
    }
}
4

2 に答える 2

1

カスタムレンダラー/エディターを使用して複数の JPanel を保持する JTable があります。

にはDefaultCellEditorstopCellEditing()コードを追加できるメソッドがあります。

または、PropertyChangeListener をテーブルに追加することもできます。

public void propertyChange(PropertyChangeEvent e)
{
    //  A cell has started/stopped editing

    if ("tableCellEditor".equals(e.getPropertyName()))
    {
        if (table.isEditing())
            processEditingStarted();
        else
            processEditingStopped();
    }
}
于 2011-11-25T15:51:20.383 に答える
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);
    }
}
于 2011-11-28T08:30:09.650 に答える