2

JTree次のように呼び出してグラフィックを更新できるように、独自のモデルを作成しようとしました。2つのブランチを超える深さのツリーを表示する必要があるupdateUI(); ときに、問題が発生しました。JTree

java.util.Vector呼び出されて拡張された独自のクラスを使用しますNamedVector

ツリーは次のようになります。

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

そして、これがどのように見えるかです:http: //imageshack.us/photo/my-images/39/fehlerqq.png/

ここに画像の説明を入力してください

新しいTreeModelを設定する方法は次のとおりです。

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){}
    });

core.Project.sharedInstance.getTranslationsTree()ツリーのルートベクトルを返します。コンソールで印刷すると、正しい結果が得られます。)

そして、これが私のNamedVectorクラスです:

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());
        }
    }
}}

これは、ツリーで独自のモデルを使用する場合にのみ発生します。それを使用してモデルを構築すると、DefaultMutableTreeNodeすべてが正しく表示されますが、カスタムモデルを使用したいと思います。

4

2 に答える 2

2

FileTreeModelTreeModelは、一般的な階層ファイルシステムを実装する例です。記事ここにイラストがあります。実装を比較すると便利かもしれません。

于 2011-12-04T04:55:34.223 に答える
2

あなたのコメントに基づいて、私の最善の推測

ただし、DefaultTreeModelの場合、ベクターを変更するときにノードを手動で追加する必要があります。ベクターを変更してupdateUI()メソッドを呼び出すだけで、ツリーが独自に構築されます。

TreeModel正しいイベントを発生させないということです。したがって、ベクトルに変更が発生しても、JTreeは通知されません。その後、ノードを再描画/拡張/ ...しTreeModelて情報を要求すると、この情報はJTreeイベントを通じて受信した情報と同期しなくなり、通常はJTree写真に示すようにsになります。

確かに、モデルにaddTreeModelListenerメソッドの空の実装がある場合

于 2011-12-04T14:16:00.670 に答える