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

时间:2011-12-04 02:41:43

标签: java swing model jtree invisible

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

我使用了一个名为java.util.Vector的{​​{1}}扩展的类。

以下是树的外观:

NamedVector

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

enter image description here

以下是我设置新TreeModel的方法:

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){} }); 返回我树的根向量,当我在控制台中打印它时,它会给出正确的结果。)

这是我的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()); } } }} 构建它,它会显示正确的一切,但我想使用自定义模型。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

我最好的猜测,基于你的评论

  

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

是您的TreeModel未触发正确的事件。因此,当向量中发生更改时,JTree不会被通知。之后,当它重新绘制/扩展节点/ ...并向TreeModel询问信息时,此信息将与JTree通过事件收到的信息不同步,通常会导致{{ 1}}如图所示。

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