当前位置: 首页 > 知识库问答 >
问题:

从字符串构建JTree

爱刚捷
2023-03-14

我有两个字符串 node1/node2/node3/node4“和”node1/node2/node5/node6“。...我怎样才能从这个字符串中构建一个摇摆的JTree?这是我构建一个字符串的代码....

import java.awt.*;  
import java.util.ArrayList;

import javax.swing.*;  
import javax.swing.tree.*;  

public class PathTest  
{  
    public PathTest()  
    {  

    DefaultMutableTreeNode   node = buildNodeFromString();   


        DefaultTreeModel model = new DefaultTreeModel(node);  
        JTree tree = new JTree(model);  
        JFrame f = new JFrame();  
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
        f.add(tree);  
        f.setSize(300,300);  
        f.setLocation(200,200);  
        f.setVisible(true);  
    }  

private DefaultMutableTreeNode buildNodeFromString() {



String qqq= "node1/node2/node3/node4";
DefaultMutableTreeNode node, lastNode = null, root = null;

    String[] s = qqq.split("/");
    for (String str : s) {
    node = new DefaultMutableTreeNode(str);     
    if (root == null)
        root = node;
    if (lastNode != null)
        lastNode.add(node);
    lastNode = node;
    }

return root;
}

    public static void main(String[] args)  
    {  
        new PathTest();  
    }  
}  

共有2个答案

颜志业
2023-03-14
for (String str : s) {
    node = new DefaultMutableTreeNode(str);     
    if (root == null)
         root = node;
    if (lastNode != null)
        lastNode.add(node);
    lastNode = node;
}

在代码段中,检查lastNode是否已经有同名的子节点,而不是创建新的DefaultMutableTreeNode实例。

丌官远
2023-03-14

试试这个,这段代码为树创建一个根,然后开始在它下面添加字符串,如果你不想让那个根显示,只需调用< code > tree . setrootvisible(false);

import java.util.Enumeration;

import javax.swing.JFrame;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;

public class PathTest {
    public PathTest() {
        // Create the root node, I'm assuming that the delimited strings will have
        // different string value at index 0
        DefaultMutableTreeNode root = new DefaultMutableTreeNode("ROOT");

        // Create the tree model and add the root node to it
        DefaultTreeModel model = new DefaultTreeModel(root);

        // Create the tree with the new model
        JTree tree = new JTree(model);

        // Build the tree from the various string samples
        buildTreeFromString(model, "Node 1/Node 2/Node 3/Node 4");
        buildTreeFromString(model, "Node 1/Node 2/Node 3/Node 5");
        buildTreeFromString(model, "Node 1/Node 2/Node 3/Node 6");
        buildTreeFromString(model, "Node 1/Node 2/Node 4/Node 5");
        buildTreeFromString(model, "Node 1/Node 1/Node 3/Node 5");

        // UI
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(tree);
        f.setSize(300, 300);
        f.setLocation(200, 200);
        f.setVisible(true);
    }

    /**
     * Builds a tree from a given forward slash delimited string.
     * 
     * @param model The tree model
     * @param str The string to build the tree from
     */
    private void buildTreeFromString(final DefaultTreeModel model, final String str) {
        // Fetch the root node
        DefaultMutableTreeNode root = (DefaultMutableTreeNode) model.getRoot();

        // Split the string around the delimiter
        String [] strings = str.split("/");

        // Create a node object to use for traversing down the tree as it 
        // is being created
        DefaultMutableTreeNode node = root;

        // Iterate of the string array
        for (String s: strings) {
            // Look for the index of a node at the current level that
            // has a value equal to the current string
            int index = childIndex(node, s);

            // Index less than 0, this is a new node not currently present on the tree
            if (index < 0) {
                // Add the new node
                DefaultMutableTreeNode newChild = new DefaultMutableTreeNode(s);
                node.insert(newChild, node.getChildCount());
                node = newChild;
            }
            // Else, existing node, skip to the next string
            else {
                node = (DefaultMutableTreeNode) node.getChildAt(index);
            }
        }
    }

    /**
     * Returns the index of a child of a given node, provided its string value.
     * 
     * @param node The node to search its children
     * @param childValue The value of the child to compare with
     * @return The index
     */
    private int childIndex(final DefaultMutableTreeNode node, final String childValue) {
        Enumeration<DefaultMutableTreeNode> children = node.children();
        DefaultMutableTreeNode child = null;
        int index = -1;

        while (children.hasMoreElements() && index < 0) {
            child = children.nextElement();

            if (child.getUserObject() != null && childValue.equals(child.getUserObject())) {
                index = node.getIndex(child);
            }
        }

        return index;
    }

    public static void main(String[] args) {
        new PathTest();
    }
}

希望这有帮助。

 类似资料:
  • 问题内容: 我需要按插入顺序设置键/值对,因此我选择使用over 。但是我需要将转换为JSON字符串,其中的顺序将保留在字符串中。 但目前,我正在通过以下方式实现这一目标: 首先将LinkedHashMap转换为JSON。 然后将JSON转换为字符串。 输出为: 但我想要按键插入的顺序来进行操作,如下所示: 一旦我将转换为JSON,它就会失去顺序(很明显JSON没有顺序的概念),因此字符串也是乱序

  • 问题内容: 我有一个字符串形式: 依此类推(长度会有所不同)。由此创建字典的最简单方法是什么? 我知道我可以拆分,但是我无法获得正确的语法。如果我分开,那么我如何将这两个部分结合在一起? 对此进行迭代似乎很痛苦。 问题答案: 编辑:下一个解决方案是当您想要将值作为整数,我认为这是您想要的。

  • 问题内容: 如何在Angularjs中使用查询参数构建URL。 我看到了API $ location.search() 问题是$ location(url)是重定向到url。就我而言,我想为查询参数传递url和key:value对,并构建url。就像是 网址: params: 结果: 我喜欢使用该URL进行链接。我也看到了angular encoding ,字符。我可以避免吗? 编辑: 我的意图是

  • 问题内容: 这是一个非常基本的问题。但是我无法在Java文档中找到答案,也无法对其进行测试,因为我不知道这种方法是否存在。 我可能会收到一个URL字符串,可能是 要么 然后我会得到可能以开头的资源路径,或者就像 我正在看课,可以处理第一部分,即获取hostURL使其成为HTTPS或HTTP请求。问题是附加资源路径。我必须手动检查它的第一个字母是否存在。我想知道此功能是否已经在某个类中。 问题答案:

  • 问题内容: 我有一个字符串,其内容是XML。我想将标签分开,并使其成为Java中的字符串列表。以下是我正在尝试的东西: 我想将其分为以下列表: 我试图通过JAXB处理器执行此操作,但效果不佳。还使用split尝试了一些愚蠢的逻辑,但这也无济于事。还有其他方法可以做到这一点吗? 问题答案:

  • 在这个问题之前,我先要说明一个事实,那就是我学习编程才一个月,而这个学校的作业却把我难住了。具体地说,它是摩尔斯电码到英语翻译器(反之亦然)...这是我被困住的部分: