Java Swing - JTree - 超过 2 个链接分支上的 setModel 图形错误

标签 java swing model jtree invisible

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

我使用一个由 java.util.Vector 扩展的自己的类,名为:NamedVector

树应该是这样的:

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

它是这样的:http://imageshack.us/photo/my-images/39/fehlerqq.png/

enter image description here

这是我设置新 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() 返回我的树的根 vector ,当我在控制台中打印它时,它会给出正确的结果。)

这是我的 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 构建它,它会显示所有正确的内容,但我想使用自定义模型。

最佳答案

根据您的评论,我的最佳猜测

But for DefaultTreeModel i have to add my nodes manually when i change my vector, i would like only changing my vector and calling the updateUI() method so my tree is builded by his own

是您的TreeModel没有触发正确的事件。因此,当 vector 发生更改时,JTree 不会收到通知。之后,当它重新绘制/展开节点/...并向 TreeModel 请求信息时,该信息将与 JTree 通过事件接收到的信息不同步,通常会生成如图片所示的 JTree

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

关于Java Swing - JTree - 超过 2 个链接分支上的 setModel 图形错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8372840/

相关文章:

java - 为什么术语 "unit of work"如此重要,为什么 JDBC AutoCommit 违反了这个模式?

java - 如何从 JButton 内部调用 Swing 定时器

java - 针对接口(interface) : Do you write interfaces for all your domain classes? 进行编程

ruby-on-rails-3 - Rails 3 - 通过 rspec 正确测试 PUT 方法

ruby-on-rails - 通过虚拟属性选择 Rails 模型

java - 为什么bufferedreader和scanner的输出不同?

java - 使用小程序减少 HTML

java - 创建带有背景图像的表单(JLayeredPane)

java - CardLayout不切换卡片

java - Swing 字体渲染