0

NetBeans Platform 7.1 アプリケーションの Explorer Manager (BeanTreeView または OutlineView のいずれか) が、単一のノードを削除するときはツリー構造で正常に機能するのに、複数のノードを削除するときは機能しない理由がわかりません。問題は、削除自体ではなく、ツリーの更新にあります。削除アクション (システム アクション) を呼び出すと、ノードで destroy() メソッドが呼び出されます。

@Override
public void destroy() throws IOException {
  //removing the business object
  ...

    try {
      IReloadableViewCapability rvc;
      if (getParentNode() != null) {
        rvc = this.getParentNode().getLookup().lookup(IReloadableViewCapability.class);
      }
      rvc.reloadChildren();
    } catch (Exception ex) {
      logger.log(Level.WARNING, null, ex);
    }

    fireNodeDestroyed();
}

そして、私はこの構造を持っているとしましょう:

  • ノード 1
    • 1.1
    • 1.2
    • 1.3
  • ノード 2
    • 2.1
    • ...

ここで、ノード 1.1、1.2、および 1.3 を削除するとします。それらをすべて選択し、delete アクションを呼び出すと、ノード 1.1 の destroy() メソッドが呼び出され、そこでデータが削除され、ノード 1.1 の parentNode で reloadChildren() メソッドが呼び出されます(上記のコードを参照)。その後、ノード 1.2 を削除すると、1.3 になります。1.3 のデータを削除しますが、 getParentNode() は null を返しますが、再び Node 1 を返す必要があります

ノード 1 とノード 2 (またはその他の最上位ノード) を一緒に削除すると、それらが特別な RootNode ノードの子であっても、同様の問題が発生します。ルートの唯一の違いは、最初のノードでのみ問題なく動作することですが、選択された他のノードよりも親を見つけることができません。

どこに問題があるのでしょうか?

4

2 に答える 2

0

この問題に対するより良い解決策は、parentNode の呼び出しを避けることですが、ChildFactory の実装を少し変更することです。私の CHildFactory も NodeListener を実装し、nodeDestroyed のオーバーライドされたメソッドで次のように呼び出します。

refresh(true);

次に、作成したノードにリスナーを追加しました。

@Override
protected Node createNodeForKey(Chapters key) {
    ChapterNode chapterNode = new ChapterNode(key);

    chapterNode.addNodeListener(this);
    return chapterNode;
}

そして、ノードの destroy() メソッドを変更しました。

@Override
public void destroy() throws IOException {
    //removing the business object
    ...

    fireNodeDestroyed();
}
于 2012-03-02T20:06:39.930 に答える