JTree: как получить текст всех предметов? - PullRequest
5 голосов
/ 07 февраля 2011

Я хочу получить текст 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 ]

8 голосов
/ 07 февраля 2011

Я думаю, вам не следует строить строку в одной функции - но я не знаю, к чему именно вы стремитесь с помощью своего вопроса.

Чтобы мой ответ был как можно ближе к предложенной вами функции, вы можете попробовать что-то вроде этого:

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: уровень отступа
4 голосов
/ 26 июля 2013
    DefaultMutableTreeNode root = (DefaultMutableTreeNode)jTree.getModel().getRoot();
    Enumeration e = root.preorderEnumeration();
    while(e.hasMoreElements()){
        System.out.println(e.nextElement());
    }
2 голосов
/ 12 сентября 2011

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";
    }
1 голос
/ 17 ноября 2016

Я расширил Howards Answer и использовал метод JTree convertValueToText , чтобы вызвать реальный обработчик ячеек и сохранить результаты в коллекции, а не в одну строку.1007 * с рекурсивной функцией 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 принимает параметры, даже не используемые в базовой реализации.Но в зависимости от типов объектов, используемых в дереве, рендеры могут потреблять эти значения, а параметры могут нуждаться в тонкой настройке.В моем случае они вообще игнорировались.

0 голосов
/ 03 августа 2012

Этот код работал для меня.Замените 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

    }
...