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

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

我想扩展树并处理所有节点,但也许这是个坏主意。

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

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

 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 :缩进级别
  DefaultMutableTreeNode root = (DefaultMutableTreeNode)jTree.getModel().getRoot(); Enumeration e = root.preorderEnumeration(); while(e.hasMoreElements()){ System.out.println(e.nextElement()); } 

DefaultMutableTreeNode具有遍历方法,有助于访问aa树的所有节点,具体取决于具体要求。 在您的上下文中,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"; } 

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

 TreePath[] nodes = tre.getSelectionPaths (); for (int i = 0; i < nodes.length; i ++) { TreePath treePath = nodes[i]; DefaultMutableTreeNode node =(DefaultMutableTreeNode)treePath.getLastPathComponent ();  Obj = () node.getUserObject (); String text=Obj.textvalue } 

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

 TreeModel model = tree.getModel(); Collection 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 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方法接受甚至在基本实现中都没有使用的参数。 但是,根据树中使用的对象类型,渲染可能会消耗这些值,并且参数可能需要微调。 在我的情况下,他们完全被忽略了。