2009-12-29 6 views
1

JTree에 노드를 동적으로 추가하는 방법을 찾고 싶습니다. 설명서와 예제를 살펴보면 JTree의 생성자에서만 수행 할 수 있습니다.Java 동적 JTree

가능하면 가능한 코드 스 니펫을 보여주십시오.

미리 감사드립니다.

+1

JTree가 모델 파트가 아닌보기 파트이기 때문에 JTree에 노드를 동적으로 추가 할 수 없습니다. 모델을 분리하고 추적해야하며 (Adrian은 사용하기 좋은 모델을 게시했습니다) 노드를 모델에 동적으로 추가 할 수 있습니다. – Pace

답변

3

더 많은 설명과 this

편집을 시도하십시오 : 당신이 당신의 나무 모델이 MutableTreeNode을 기반으로하고 싶다. 위의 링크는 Sun 자습서의 예제입니다.

+0

이 예제를 보았지만 소스 코드를 찾을 수 없으며 런타임에 루트 노드를 설정하거나 루트 노드를 사용하는 방법을 알지 못합니다. 감사합니다. –

6

TreeModel 및 TreeNode의 사용자 정의 구현이 필요합니다 (아래 참조). LazyTreeModel을 확장하고 loadChildren()을 구현하면됩니다.

로거 및 WorkerManager.getInstance(). schedule (new LoadNodesWorker())를 Thread()로 바꿀 수 있습니다. - Worker는 다음과 같습니다. 실행 가능.

public abstract class LazyTreeModel extends DefaultTreeModel implements TreeWillExpandListener { 

public LazyTreeModel(TreeNode root, JTree tree) { 
    super(root); 
    setAsksAllowsChildren(true); 
    tree.addTreeWillExpandListener(this); 
    tree.setModel(this); 
} 

public void treeWillExpand(TreeExpansionEvent event) throws ExpandVetoException { 
    LazyTreeNode node = (LazyTreeNode) event.getPath().getLastPathComponent(); 
    if (node.isLoaded()) { 
     return; 
    } 
    setLoading(node, false); 
    WorkerManager.getInstance().schedule(new LoadNodesWorker(node)); 
} 

public void reloadNode(String id) { 
    LazyTreeNode node = findNode(id); 
    if (node != null) { 
     node.setLoaded(false); 
     setLoading(node, true); 
     WorkerManager.getInstance().schedule(new LoadNodesWorker(node)); 
    } 
} 

public void reloadParentNode(String id) { 
    LazyTreeNode node = findParent(id); 
    if (node != null) { 
     node.setLoaded(false); 
     setLoading(node, true); 
     WorkerManager.getInstance().schedule(new LoadNodesWorker(node)); 
    } 
} 

public LazyTreeNode findParent(String id) { 
    LazyTreeNode node = findNode(id); 
    if (node != null && node.getParent() != null) { 
     return (LazyTreeNode) node.getParent(); 
    } 
    return null; 
} 

public void loadFirstLevel() { 
    setLoading((LazyTreeNode) getRoot(), false); 
    WorkerManager.getInstance().schedule(new LoadNodesWorker((LazyTreeNode) getRoot())); 
} 

public void treeWillCollapse(TreeExpansionEvent event) throws ExpandVetoException { 
} 

protected void setChildren(LazyTreeNode parentNode, LazyTreeNode... nodes) { 
    if (nodes == null) { 
     return; 
    } 
    int childCount = parentNode.getChildCount(); 
    if (childCount > 0) { 
     for (int i = 0; i < childCount; i++) { 
      removeNodeFromParent((MutableTreeNode) parentNode.getChildAt(0)); 
     } 
    } 
    for (int i = 0; i < nodes.length; i++) { 
     insertNodeInto(nodes[i], parentNode, i); 
    } 
} 

private void setLoading2(final LazyTreeNode parentNode, final boolean reload) { 
    if (reload) { 
     setChildren(parentNode, createReloadingNode()); 
    } else { 
     setChildren(parentNode, createLoadingNode()); 
    } 
} 

private void setLoading(final LazyTreeNode parentNode, final boolean reload) { 
    if (SwingUtilities.isEventDispatchThread()) { 
     setLoading2(parentNode, reload); 
    } else { 
     try { 
      SwingUtilities.invokeAndWait(new Runnable() { 
       public void run() { 
        setLoading2(parentNode, reload); 
       } 
      }); 
     } catch (Exception e) { 
      LOG.error("Cannot create loading node", e); 
     } 
    } 
} 

private LazyTreeNode findNode(String id) { 
    return findNode(id, (LazyTreeNode) getRoot()); 
} 

private LazyTreeNode findNode(String id, LazyTreeNode parent) { 
    int count = parent.getChildCount(); 
    for (int i = 0; i < count; i++) { 
     LazyTreeNode node = (LazyTreeNode) parent.getChildAt(i); 
     if (id.equals(node.getId())) { 
      return node; 
     } 
     if (node.isLoaded()) { 
      node = findNode(id, node); 
      if (node != null) { 
       return node; 
      } 
     } 
    } 
    return null; 
} 

public abstract LazyTreeNode[] loadChildren(LazyTreeNode parentNode); 

protected LazyTreeNode createLoadingNode() { 
    return new LazyTreeNode(null, "Loading...", false); 
} 

protected LazyTreeNode createReloadingNode() { 
    return new LazyTreeNode(null, "Refreshing...", false); 
} 

class LoadNodesWorker implements Worker { 

    private LazyTreeNode parentNode; 

    LoadNodesWorker(LazyTreeNode parent) { 
     this.parentNode = parent; 
    } 

    public String getName() { 
     return "Lazy loading of node " + parentNode.getId(); 
    } 

    public void execute() throws Exception { 
     final LazyTreeNode[] treeNodes = loadChildren(parentNode); 
     if (treeNodes == null) { 
      return; 
     } 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       parentNode.setLoaded(true); 
       setChildren(parentNode, treeNodes); 
      } 
     }); 
    } 
} 

}

public class LazyTreeNode extends DefaultMutableTreeNode { 

private boolean loaded; 
private String id; 

public LazyTreeNode(String id) { 
    this(id, null); 
} 

public LazyTreeNode(String id, Object userObject) { 
    this(id, userObject, true); 
} 

public LazyTreeNode(String id, Object userObject, boolean allowsChildren) { 
    super(userObject, allowsChildren); 
    this.id = id; 
} 

public String getId() { 
    return id; 
} 

protected boolean isLoaded() { 
    return loaded; 
} 

protected void setLoaded(boolean loaded) { 
    this.loaded = loaded; 
} 

@Override 
public boolean isLeaf() { 
    return !getAllowsChildren(); 
} 

}