Java Swing - JTree - графическая ошибка setModel в более чем 2 цепочечных ветвях - PullRequest
2 голосов
/ 04 декабря 2011

Я попытался создать свою собственную 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() возвращает корневой вектор моего дерева, когда я печатаю его в консоли, он дает правильные результаты.)

А вот мой 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, она отображает все правильно, но я хотел бы использовать собственную модель.

Ответы [ 2 ]

2 голосов
/ 04 декабря 2011

Моя лучшая догадка, основываясь на вашем комментарии

Но для DefaultTreeModel я должен добавить свои узлы вручную, когда я изменяю свой вектор, я хотел бы только изменить свой вектор и вызвать метод updateUI (), чтобы мое дерево строилось по его собственному

означает, что ваш TreeModel не запускает правильные события. Поэтому, когда в вашем векторе происходит изменение, JTree не сообщается. Впоследствии, когда он перерисовывает / расширяет узел / ... и запрашивает информацию TreeModel, эта информация будет не синхронизирована с информацией, полученной JTree через события, что обычно приводит к JTree s, как показано в ваших фотографиях.

Конечно, если ваша модель имеет пустые реализации для метода addTreeModelListener

2 голосов
/ 04 декабря 2011

FileTreeModel - это пример, который реализует TreeModel для типичной иерархической файловой системы.Есть иллюстрация в статье и здесь .Может быть полезно сравнить вашу реализацию.

...