2010-03-22 2 views
1

У меня есть приложение с очень большим элементом управления TreeView в Java. Я хочу получить содержимое элемента управления дерева в списке (только строки, а не JList) только для элементов, похожих только на XPath. Вот пример кореньУстранение содержимого древовидного представления другого приложения

 
|-Item1 
    |-Item1.1 
    |-Item1.1.1 (leaf) 
    |-Item1.2 (leaf) 
|-Item2 
    |-Item2.1 (leaf) 

Would выход:

 
/Item1/Item1.1/Item1.1.1 
/Item1/Item1.2 
/Item2/Item2.1 

У меня нет исходного кода или что-нибудь под рукой, как это. Есть ли инструмент, который я могу использовать для копания в элементе Window и вытащить эти данные? Я не возражаю, если есть несколько этапов последующей обработки, потому что набирать их вручную - это мой единственный вариант.

+2

Вы говорите, что у вас есть JTree? – Wintermut3

+0

Я придумал две возможные интерпретации вопроса и попытался ответить на оба из них. Надеюсь, по крайней мере один ответ будет полезен. :-) –

+0

Я предполагаю, что приложение имеет JTree, но у меня нет прямого доступа к нему. Для этого могут потребоваться сообщения Windows или что-то уродливое. – User1

ответ

1

Если мы предположим, что у вас есть TreeModel (которые вы можете получить от JTree с помощью JTree.getModel()), то следующий код будет распечатать листья дерева в «/» - отделенного формат, который вы ищете:

/** 
* Prints the path to each leaf in the given tree to the console as a 
* "/"-separated string. 
* 
* @param tree 
*   the tree to print 
*/ 
private void printTreeLeaves(TreeModel tree) { 
    printTreeLeavesRecursive(tree, tree.getRoot(), new LinkedList<Object>()); 
} 

/** 
* Prints the path to each leaf in the given subtree of the given tree to 
* the console as a "/"-separated string. 
* 
* @param tree 
*   the tree that is being printed 
* @param node 
*   the root of the subtree to print 
* @param path 
*   the path to the given node 
*/ 
private void printTreeLeavesRecursive(TreeModel tree, 
             Object node, 
             List<Object> path) { 
    if (tree.getChildCount(node) == 0) { 
     for (final Object pathEntry : path) { 
      System.out.print("/"); 
      System.out.print(pathEntry); 
     } 
     System.out.print("/"); 
     System.out.println(node); 
    } 
    else { 
     for (int i = 0; i < tree.getChildCount(node); i++) { 
      final List<Object> nodePath = new LinkedList<Object>(path); 
      nodePath.add(node); 
      printTreeLeavesRecursive(tree, 
            tree.getChild(node, i), 
            nodePath); 
     } 
    } 
} 

конечно, если вы не просто хотите, чтобы распечатать содержимое дерева на консоли, вы можете заменить println заявления с чем-то другим, например, вывод в файл или, например, как запись или добавление к Writer или StringBuilder, который передается этим методам в качестве дополнительного аргумента.

1

(я отправляю второй ответ, в зависимости от интерпретации вопроса ...)

Если вы уже знаете, что делать, когда у вас есть JTree и вы просто пытаетесь найти JTree компонент в произвольной Container (включая любой JComponent, Window, JFrame и т.д.), то следующий код будет искать данную Container и возвращает первые JTree он находит (или null, если нет JTree не может быть найден):

/** 
* Searches the component hierarchy of the given container and returns the 
* first {@link javax.swing.JTree} that it finds. 
* 
* @param toSearch 
*   the container to search 
* @return the first tree found under the given container, or <code>null</code> 
*   if no {@link javax.swing.JTree} could be found 
*/ 
private JTree findTreeInContainer(Container toSearch) { 
    if (toSearch instanceof JTree) { 
     return (JTree)toSearch; 
    } 
    else { 
     for (final Component child : toSearch.getComponents()) { 
      if (child instanceof Container) { 
       JTree result = findTreeInContainer((Container)child); 
       if (result != null) { 
        return result; 
       } 
      } 
     } 
     return null; 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^