2009-06-19 9 views
1

JTreeの拡張スイング - それは、ルートノードと2つのつの子容器ノード(各リーフノードとそれぞれ)とのJTreeの作成:この場合Javaは予想通り、この方法が機能

private JComponent createSideBar() 
{ 
    final DefaultMutableTreeNode top = new DefaultMutableTreeNode("Projects"); 
    final JTree tree = new JTree(top); 

    DefaultMutableTreeNode project = new DefaultMutableTreeNode("project 1"); 
    DefaultMutableTreeNode version = new DefaultMutableTreeNode("version 1"); 
    project.add(version); 
    top.add(project); 
    TreePath treePath = new TreePath(project.getPath()); 
    // tree.expandPath(treePath); 

    project = new DefaultMutableTreeNode("project 2"); 
    version = new DefaultMutableTreeNode("version 2"); 
    project.add(version); 
    top.add(project); 

    return tree; 
} 

、木閉鎖を開始する。私は、私は次のように追加することによって開始し、完全に拡張し、すべてのノードで起動するアプリケーションたい:

tree.expandPath(treePath); 

が、私は上記のコードから、それをアンコメントするときに、子ノードの第2のセットは表示されません。すなわち、プロジェクト2とバージョン2は表示されません。実際には、その後に追加されるすべてのノードは決して表示されません。

私はJDK 1.5を使用しています。ドキュメントから、私は何の制限も見えていないようです。なぜこのメソッドがそのような悪影響を与えるのか...私はソースを見てみるつもりですが、誰かが良いアイディアを持っていると思っていました。期待される動作です。後続の各ノードの「追加」がどうにかして何らかの形で禁止されているのかどうか疑問に思っていますが、ほとんどのランタイムユースケースではうまくいくとは思いません。

おかげで、

-luther

答えて

2

残念ながら、Swingはしばしば「役に立つ」。この場合、Vectorを入力した場合、JListとほぼ同じモデルを作成して、提供されたデータからモデルを作成しています。

JTreeと共犯者(主にPluggable Look & Feel)は、リスナーをモデルに追加して更新情報を保持します。 (暗黙の)モデルの背後のデータを変更するだけであれば、偶然以外の更新は行われません。

だから、明示的にモデルを作成する必要があります。モデルデータが変更された場合(もちろんEDT上では常に)、関連するイベントを発生させます。

+0

+1、私はそれを知らなかった。 –

1

ノードが既に展開されたノードに追加されている場合は、reload the modelする必要があります。

((DefaultTreeModel)tree.getModel()).reload(); 

または

((DefaultTreeModel)tree.getModel()).reload(top); 

あなたは大きな木の小さい部分だけをリロードしたい場合は、このsecond versionはより有用です。

0

ああ...モデル。

あなたの答えはビットherehere ....さらにはhereで精緻化されています。モデルを保持

DefaultTreeModel model = (DefaultTreeModel) tree.getModel(); 
model.insertNodeInto(newNode, parent, index); 

直接通知:

は、私のような何かをやってしまいました。私の場合、それはちょうど良いスケール。

ここで、これらのいずれかを回答としてマークする方法を教えてください。

関連する問題