Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java动态JTree_Java_Swing - Fatal编程技术网

Java动态JTree

Java动态JTree,java,swing,Java,Swing,我想找到一种动态地将节点添加到JTree的方法,查看文档和示例,这只能在JTree的构造函数中完成 如果可能,请向我展示执行此操作的代码片段 提前谢谢。试试看 编辑并提供更多说明:您希望树模型基于。上面的链接是Sun教程中的一个示例。试试看 编辑并提供更多说明:您希望树模型基于。上面的链接是Sun教程中的一个示例。您需要一个TreeModel和TreeNode的自定义实现,请参见下文。只需扩展LazyTreeModel并实现loadChildren() 您必须用实现替换几个依赖项:LOG-you

我想找到一种动态地将节点添加到JTree的方法,查看文档和示例,这只能在JTree的构造函数中完成

如果可能,请向我展示执行此操作的代码片段

提前谢谢。

试试看

编辑并提供更多说明:您希望树模型基于。上面的链接是Sun教程中的一个示例。

试试看


编辑并提供更多说明:您希望树模型基于。上面的链接是Sun教程中的一个示例。

您需要一个TreeModel和TreeNode的自定义实现,请参见下文。只需扩展LazyTreeModel并实现loadChildren()

您必须用实现替换几个依赖项:LOG-yourlogger 和WorkerManager.getInstance().schedule(new LoadNodesWorker())您可以用线程()替换它-Worker相当于Runnable

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);
            }
        });
    }
}

}

您需要有树模型和树节点的自定义实现,请参见下文。只需扩展LazyTreeModel并实现loadChildren()

您必须用实现替换几个依赖项:LOG-yourlogger 和WorkerManager.getInstance().schedule(new LoadNodesWorker())您可以用线程()替换它-Worker相当于Runnable

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);
            }
        });
    }
}

}I82Much提到的Sun示例教程包括一个演示项目,它由两个源文件和。您应该可以通过这些链接访问它们。

I82Much提到的Sun示例教程包括一个演示项目,该项目由两个源文件和一个示例文件组成。您应该可以通过这些链接访问它们。

我看到了这个示例,但我找不到它的源代码,也不知道如何设置根节点或在运行时让根节点使用它。谢谢你的关注。我看到了这个示例,但是我找不到它的源代码,也不知道如何设置根节点或在运行时让根节点使用它。感谢您的关注。您不能动态地将节点添加到JTree,因为JTree是视图部分,而不是模型部分。您需要分离并跟踪您的模型(Adrian发布了一个很好的模型供您使用),然后您可以将节点动态添加到您的模型中。您不能将节点动态添加到JTree中,因为JTree是视图部分,而不是模型部分。您需要分离并跟踪您的模型(Adrian发布了一个好的模型供您使用),然后您可以动态地将节点添加到您的模型中。