2011-01-29 8 views
0

I持って以下の方法で構築されJTreeトラブル

void populateTree(BKMNode parent) { 
    for (DataNode node : nodes) { 
     BKMNode treeNode = new BKMNode(node.name,node.fullName,null); 
     // check if this node was already added before 
     if (! existingNodes.contains(ip + "." + node.fullName)) { 
      existingNodes.add(ip + "." + node.fullName); 
      DefaultTreeModel model = (DefaultTreeModel)tree.getModel(); 
      model.insertNodeInto(treeNode, parent, parent.getChildCount()); 
      System.out.println("adding " + ip + "." + node.fullName); 
     } 
     node.populateTree(treeNode); 
    } 

// some more non-relevant code...


は( BKMNodeクラスが DefaultMutableTreeNodeを拡張し、 DataNodeは、単にデータを保持しています)

アプリケーションの起動時にツリーが作成されると、すべて正常です。
しかし、私のアプリケーションは同じ方法でツリーにノードを追加します。
アプリケーションが新しいノードをツリーに追加しようとすると、テキストが印刷されますが、GUIでは何も変更されません。
私はJTree.invalidate()validate()repaint()reload()と呼んでみましたが、何も役に立たないようです。

populateTreeメソッドは、常にEDTから呼び出されます。

ここで何が問題なのか誰も知っていますか?

ありがとうございます!

+2

すぐに役立つように、SSCCE(http://pscode.org/sscce.html)を投稿してください。 –

+0

また、実際にはJTreeをどこで変更していますか?ノードを挿入するたびに新しいDefaultTreeModelを作成するようですか?既存のDefaultTreeModelをクリアしてノードを追加するべきではありませんか? – Pace

+1

新しいモデルを作成せず、ツリーオブジェクト自体への参照を使用してそのモデルへの参照を取得します。モデルのinsertNodeIntoを呼び出すことでJTreeを変更します。 – yacov

答えて

3

信託私、私はすべてを無効に使用してみました、検証、再描画、方法

をリロード申し訳ありませんが、私はあなたを信用していない、人々は愚かな過ちのすべての時間を作ります。そういうわけで、あなたが何をしているのかを正確に見るためにSSCCEが必要です。これらの方法のいずれかを呼び出す理由はありません。 invalidate()、validate()は、コンテナからコンポーネントを追加/削除したときに使用されます。モデルを更新すると、モデルはビューに通知を行い、ビューが再描画できるようにします。

何も変更することを期待しますどのようなGUI

に変更?

ノードを挿入すると、モデルにノードが挿入されます。親ノードが展開されている場合は、挿入ノードが表示されます。ただし、親ノードが折りたたまれている場合は、変更は表示されません。

ノードを挿入した後でノードを表示するには、tree.expandPath(...)メソッドを使用できます。

あなたが投稿した基本コードは、文字列値を含むデフォルトのノードを挿入するとうまく動作します。おそらく問題はあなたのカスタムノードですか?したがって、最初に行う必要があるのは、デフォルトノードで動作するSSCCEを作成することです。それが機能すると、デフォルトのノードをカスタムノードに置き換えます。それがうまくいくなら、素晴らしい。もしあなたが問題があなたのカスタムノードであることがわからなければ。

提供されているコードに基づいて動作するはずですので、私たちにもっと協力していただく必要があります。

+0

編集:私はSSCCEを構築し、同じセルレンダラーを使用してもすべてが完璧に動作します.../ – yacov

+1

だから、 SSCCEとあなたの実際のアプリケーション。ツリーやモデルの参照が2つあるかもしれません。 1つはクラス変数で、1つはローカル変数です。したがって、GUIで表示されない参照を更新することになります。 – camickr

0

解決済み! DefaultTreeModelのソースのnodesWereInsertedメソッドでいくつかのブレークポイントを追加し、デバッガでアプリケーションを実行しました。新しいノードにnullの親が追加されたことが示されました!さらなる調査で問題が明らかになりました - node.populateTree(treeNode);新しいノードが追加されました。 これは新しい(作業中の)コードです。助けてくれてありがとう。

void populateTree(BKMNode parent) { 
    for (DataNode node : nodes) { 
     BKMNode treeNode = new BKMNode(node.name,node.fullName,null); 
     // check if this node was already added before 
     if (! existingNodes.contains(ip + "." + node.fullName)) { 
      existingNodes.add(ip + "." + node.fullName); 
      DefaultTreeModel model = (DefaultTreeModel)tree.getModel(); 
      model.insertNodeInto(treeNode, parent, parent.getChildCount()); 
      node.bkmNode = treeNode; 
      node.populateTree(treeNode); 
     } else { 
      node.populateTree(node.bkmNode); 
     } 
    } // for