2

我尝试创建自己的JTree模型,以便可以通过调用更新图形:updateUI(); 当我JTree应该显示深度超过 2 个分支的树时遇到了问题。

我使用了一个自己的类,它通过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

我最好的猜测,根据你的评论

但是对于 DefaultTreeModel,我必须在更改向量时手动添加节点,我只想更改向量并调用 updateUI() 方法,以便我的树由他自己构建

是您TreeModel没有触发正确的事件。因此,当您的向量发生变化时,JTree不会通知。之后,当它重新绘制/扩展一个节点/...并询问TreeModel信息时,此信息将与JTree通过事件接收的信息不同步,通常会导致JTrees 如图所示。

当然,如果您的模型对该addTreeModelListener方法有空实现

于 2011-12-04T14:16:00.670 回答
2

FileTreeModel是实现TreeModel典型分层文件系统的示例。文章这里有一个插图。比较您的实现可能很有用。

于 2011-12-04T04:55:34.223 回答