JTree에 노드를 동적으로 추가하는 방법을 찾고 싶습니다. 설명서와 예제를 살펴보면 JTree의 생성자에서만 수행 할 수 있습니다.Java 동적 JTree
가능하면 가능한 코드 스 니펫을 보여주십시오.
미리 감사드립니다.
JTree에 노드를 동적으로 추가하는 방법을 찾고 싶습니다. 설명서와 예제를 살펴보면 JTree의 생성자에서만 수행 할 수 있습니다.Java 동적 JTree
가능하면 가능한 코드 스 니펫을 보여주십시오.
미리 감사드립니다.
더 많은 설명과 this
편집을 시도하십시오 : 당신이 당신의 나무 모델이 MutableTreeNode을 기반으로하고 싶다. 위의 링크는 Sun 자습서의 예제입니다.
이 예제를 보았지만 소스 코드를 찾을 수 없으며 런타임에 루트 노드를 설정하거나 루트 노드를 사용하는 방법을 알지 못합니다. 감사합니다. –
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();
}
}
I82Much에 의해 언급 된 일 예 튜토리얼, 데모 프로젝트, DynamicTreeDemo, 즉 두 개의 소스 파일 DynamicTreeDemo.java 및 DynamicTree.java 구성되어 포함되어 있습니다. 당신은이 연결에서 그 (것)들을 얻을 수 있어야합니다.
JTree가 모델 파트가 아닌보기 파트이기 때문에 JTree에 노드를 동적으로 추가 할 수 없습니다. 모델을 분리하고 추적해야하며 (Adrian은 사용하기 좋은 모델을 게시했습니다) 노드를 모델에 동적으로 추가 할 수 있습니다. – Pace