2011-12-04 2 views
2

私は呼び出すことにより、グラフィックスを更新することができますので、私自身JTreeモデルを作成しようとしました:updateUI();JTreeがでツリーを表示しなければならないときに私が問題に遭遇しました2枝以上の深さ。のJavaのSwing - JTreeの - てsetModelグラフィックバグより、その後2本のチェーン枝に

java.util.Vectorという拡張された独自のクラスを使用します(NamedVector)。ここで

は、ツリーはのようになります方法は次のとおりです。

ROOT 
    Branch 
     BranchInside 
       Leaf 
       Leaf 
       ... 
     OtherBranch 
    AndOneMore 
     ... 
    ... 

そして、ここではそれがどのように見えるかです:

jTree1.setModel(new javax.swing.tree.TreeModel(){ 

     @Override 
     public Object getRoot(){ 
      return core.Project.sharedInstance.getTranslationsTree(); 
     } 

     @Override 
     public Object getChild(Object parent, int index){ 
      if(parent instanceof String) return null; 
      return ((core.NamedVector)parent).get(index); 
     } 

     @Override 
     public int getChildCount(Object parent){ 
      if(parent instanceof String) return 0; 
      return ((core.NamedVector)parent).size(); 
     } 

     @Override 
     public boolean isLeaf(Object node){ 
      if(node instanceof String) return true; 
      return ((core.NamedVector)node).isEmpty(); 
     } 

     @Override 
     public int getIndexOfChild(Object parent, Object child){ 
      if(parent instanceof String) return -1; 
      return ((core.NamedVector)parent).indexOf(child); 
     } 

     @Override 
     public void valueForPathChanged(TreePath path, Object newValue){} 
     @Override 
     public void addTreeModelListener(TreeModelListener l){} 
     @Override 
     public void removeTreeModelListener(TreeModelListener l){} 
    }); 
http://imageshack.us/photo/my-images/39/fehlerqq.png/

enter image description here

はここで私は新しいのTreeModelを設定する方法を説明します

core.Project.sharedInstance.getTranslationsTree()返品。

public class NamedVector extends java.util.Vector{ 
public String name; 
public NamedVector(String name){ 
    this.name = name; 
} 
@Override 
public String toString(){ 
    return name; 
} 
public static void dirToVector(java.io.File sourceLocation, NamedVector target){ 
    if(sourceLocation.isDirectory()){ 
     String[] children = sourceLocation.list(); 
     for(int i=0; i<children.length; i++){ 
      NamedVector vector = new NamedVector(children[i]); 
      target.add(vector); 
      dirToVector(new java.io.File(sourceLocation, children[i]), 
        vector); 
     } 
    } 
} 
public void print(){ 
    print(""); 
} 
private void print(String pre){ 
    System.out.println(pre+name); 
    pre+=" "; 
    for(int i=0;i<this.size();i++){ 
     if(get(i) instanceof NamedVector){ 
      ((NamedVector)get(i)).print(pre); 
     }else{ 
      System.out.println(pre+get(i).toString()); 
     } 
    } 
}} 

私が上で自分のモデルを使用する場合にのみ発生します。ここでは、ルートの私の木のベクトル、私はコンソールでそれを印刷するとき、それは正しい結果が得られる)

そして、私のNamedVectorクラスです私がDefaultMutableTreeNodeでビルドすると、それはすべて正しいものを表示しますが、私はカスタムモデルを使いたいと思います。

+2

のための空の実装を持っている場合は、[SSCCE](http://sscce.org/)を投稿してください。 * "自分のJTreeモデルを作成しようとしました" *なぜですか?この宿題ですか?もしそうなら、そのようにマークしてください。そうでない場合は、分かりやすいものを行い、['DefaultTreeModel'](http://docs.oracle.com/javase/7/docs/api/javax/swing/tree/DefaultTreeModel .html)。 –

+2

GUIのルックアンドフィールを扱っていない場合、Swingコンポーネントで 'udateUI'を呼び出す理由はありません。 –

+0

@Andrewしかし、DefaultTreeModelのために私は私のベクトルを変更するときに自分のノードを手動で追加しなければなりません。私のベクトルを変更してupdateUI()メソッドを呼び出すだけで私のツリーは自分自身でビルドされるようにします:( – Bananni

答えて

2

私の最高の推測で、あなたのコメント

に基づいていますが、DefaultTreeModelのために、私は私のベクトルを変更すると、手動で私のノードを追加する必要があり、私は私のベクトルを変え、私のようのupdateUI()メソッドを呼び出したいですツリーは

彼自身によって建てているあなたのTreeModelが正しいイベントを発生しないということです。したがって、ベクターに変更が生じた場合、JTreeには通知されません。その後、ノード/ ...を再ペイント/展開し、TreeModelに情報を尋ねると、この情報はイベントを通じて受け取ったJTreeの情報と同期しなくなり、通常は画像に示されるようにJTreeになります。確かに

モデルが早いほど良いのヘルプについてaddTreeModelListener方法

+0

+1 'TreeModel'の基本的な実装については' DefaultTreeModel'のソースも参照してください。 – trashgod

関連する問題