JTree:如何获取所有项目的文本?

时间:2011-02-07 05:39:41

标签: java swing text jtree

我希望以格式获取JTree的文本:

root
  sudir1
    node1
    node2
  subdir2
    node3
    node4

有可能吗?

我写了一些代码

public static String getLastSelectedText(JTree tree) {
    DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
    if (node == null) return null;
    return node.getUserObject().toString();
}

但它只获得选定的组件文本。

我考虑扩展树并处理所有节点,但也许不好主意。

5 个答案:

答案 0 :(得分:8)

我认为你不应该在一个函数中构建字符串 - 但我不知道你的问题究竟是针对什么的。

为了使我的答案尽可能接近您建议的功能,您可以尝试这样的事情:

TreeModel model = tree.getModel();
System.out.println(getTreeText(model, model.getRoot(), ""));

使用递归函数getTreeText

private static String getTreeText(TreeModel model, Object object, String indent) {
    String myRow = indent + object + "\n";
    for (int i = 0; i < model.getChildCount(object); i++) {
        myRow += getTreeText(model, model.getChild(object, i), indent + "  ");
    }
    return myRow;
}

getTreeText有三个参数

  • model:我们请求树节点的模型
  • object:我们要求字符串表示的对象(包括所有孩子)
  • indent:缩进级别

答案 1 :(得分:4)

    DefaultMutableTreeNode root = (DefaultMutableTreeNode)jTree.getModel().getRoot();
    Enumeration e = root.preorderEnumeration();
    while(e.hasMoreElements()){
        System.out.println(e.nextElement());
    }

答案 2 :(得分:2)

DefaultMutableTreeNode具有遍历方法,有助于访问树的所有节点,具体取决于具体要求。在您的上下文中,preorderEnumeration看起来合适,有些片段:

    String result = "\n";
    Enumeration<?> enumer = root.preorderEnumeration();
    while (enumer.hasMoreElements()) {
        DefaultMutableTreeNode node = (DefaultMutableTreeNode) enumer.nextElement();
        String nodeValue = String.valueOf(node.getUserObject());
        String indent = "";
        while (node.getParent() != null) {
           indent += "    "; 
           node = (DefaultMutableTreeNode) node.getParent();
        }
        result += indent + nodeValue + "\n";
    }

答案 3 :(得分:1)

我扩展了Howards Answer并使用JTree方法convertValueToText来调用真实的单元格渲染器并将结果保存在集合中而不是一个字符串。

TreeModel model = tree.getModel();
Collection<String> results = new LinkedList<>();
getTreeText(tree, model, model.getRoot(), result);
System.out.println(Arrays.toString(results.toArray()));

使用递归函数getTreeText

private static void getTreeText(JTree tree, TreeModel model, Object object, Collection<String> result) {
    result.add(tree.convertValueToText(object, true, true, true, 0, true));
    for (int i = 0; i < model.getChildCount(object); i++) {
        getTreeText(tree, model, model.getChild(object, i), result);
    }
}

getTreeText需要四个参数

  • tree:带树节点的树
  • model:我们请求树节点的模型
  • object:我们要求字符串表示的对象(包括所有孩子)
  • result:用于保存每个节点字符串值的集合

convertValueToText方法接受基本实现中甚至没有使用的参数。但是,根据树中使用的对象类型,渲染可能会消耗这些值,并且参数可能需要微调。在我的情况下,他们完全被忽略了。

答案 4 :(得分:0)

这段代码对我有用。将UserObject替换为您的自定义对象。 从Obj对象中,您可以获得必要的值。

TreePath[] nodes = tre.getSelectionPaths ();
    for (int i = 0; i < nodes.length; i ++)
    {
        TreePath treePath = nodes[i];

        DefaultMutableTreeNode node =(DefaultMutableTreeNode)treePath.getLastPathComponent ();
        <UserObject> Obj = (<UserObject>) node.getUserObject ();

       String text=Obj.textvalue

    }