我尝试创建自己的JTree
模型,以便通过调用updateUI();
来更新图形
当我的JTree
应该显示一个深度超过2个分支的树时,我遇到了一个问题。
我使用了一个名为java.util.Vector
的{{1}}扩展的类。
以下是树的外观:
NamedVector
以下是它的样子:http://imageshack.us/photo/my-images/39/fehlerqq.png/
以下是我设置新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());
}
}
}}
构建它,它会显示正确的一切,但我想使用自定义模型。
答案 0 :(得分:2)
FileTreeModel
是为典型的分层文件系统实现TreeModel
的示例。 article和here中有一个插图。比较您的实现可能很有用。
答案 1 :(得分:2)
我最好的猜测,基于你的评论
但是对于DefaultTreeModel我必须在我更改向量时手动添加我的节点,我只想更改我的向量并调用updateUI()方法,以便我的树由他自己构建
是您的TreeModel
未触发正确的事件。因此,当向量中发生更改时,JTree
不会被通知。之后,当它重新绘制/扩展节点/ ...并向TreeModel
询问信息时,此信息将与JTree
通过事件收到的信息不同步,通常会导致{{ 1}}如图所示。
当然,如果您的模型具有JTree
方法的空实现