3

ツリーの構造は次のとおりです。

ルートブランチ--leafs

TreeModel DefaultTreeModelに使用し、オブジェクトはTreeNodeインターフェイスを実装します

葉はいくつかのオブジェクトです:

public class Leaf implements TreeNode
{
   // implementation

ブランチにはリーフのリストがあります:

public class Branch implements TreeNode
{
 private List<Leaf> leafs;

 // implementation

そして、ルートはブランチのコンテナです:

public class Root implements TreeNode
{
  private List<Branch> branches;

  // implementation

新しいリーフを追加してもツリーは更新されません。リーフを追加してルートオブジェクトを使用して新しいDefaultTreeModelを作成すると、ツリーは更新されます。DefaultMutableTreeNodeの実装を監視していますが、子の挿入時にイベントが発生していません...何が間違っていますか?以前は、3つのクラスにTreeNodeインターフェイスを実装するよりもはるかに見栄えの良いTreeModelインターフェイスを実装しようとしましたが、結果は似ていました。GlazedListsについても読みましたが、ツリーの概念が嫌いです。私にとって最良の方法は、TreeModelインターフェースの概念を実装することですが、モデル内の内部リストが新しい要素を追加したときにモデルを更新するにはどうすればよいですか?...

4

2 に答える 2

4

コードを見ずに、確信するのは難しいです-それにもかかわらず、私は私の推測に賭けます:あなたはあなたの挿入についてTreeModelに通知しません;-)

ノード実装がMutableTreeNodeタイプでない場合に実行する必要があることのコードスニペット:

 // do the parent wiring in your custom TreeNode
 int position = myBranch.addChild(node);
 // notify the model 
 model.nodesWhereInserted(myBranch, new int[] {pos}); 

タイプがMutableTreeNodeの場合、より簡単な方法はDefaultTreeModelの便利なメソッドを使用することです。

 model.insertNodeInto(node, myBranch, position)
于 2011-09-23T08:01:54.013 に答える
2

Swingの同時実行性の問題のように見えますが、更新がEDTから外れている可能性があります。

新しいオブジェクトを追加し、新しいオブジェクトが含まれているかどうかをテストDefaultTreeModelするには、オブジェクトが存在する場合は、(すべての更新)をにラップするinvokeLater必要SerializableObservateあります。invokeAndWait

于 2011-09-23T08:07:33.300 に答える