簡體   English   中英

Java Swing-JTree-超過2個鏈接分支上的setModel圖形錯誤

[英]Java Swing - JTree - setModel graphics bug on more then 2 chained branches

我試圖創建自己的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構建,則它會顯示所有正確的內容,但是我想使用自定義模型。

FileTreeModel是為典型的分層文件系統實現TreeModel的示例。 文章中此處都有一個插圖。 比較您的實現可能很有用。

我的最佳猜測,根據您的評論

但是對於DefaultTreeModel,我必須在更改矢量時手動添加節點,我只想更改矢量並調用updateUI()方法,以便我的樹由他自己構建

是您的TreeModel沒有觸發正確的事件。 因此,當向量發生更改時,不會通知JTree 之后,當它重新繪制/擴展節點/ ...並詢問TreeModel信息時,此信息將與事件中收到的JTree的信息不同步,通常會導致JTree ,如您的圖片所示。

當然,如果您的模型對addTreeModelListener方法有空的實現

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM