Кража содержимого представления дерева другого приложения - PullRequest
1 голос
/ 22 марта 2010

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

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

Выводит:

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

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

Ответы [ 2 ]

1 голос
/ 25 марта 2010

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

Если вы уже знаете, что делать, когда у вас есть 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;
    }
}
1 голос
/ 25 марта 2010

Если мы предположим, что у вас есть 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 чем-то другим, например, выводом в файл или записью или добавлением к * 1008. * или StringBuilder, который передается этим методам в качестве дополнительного аргумента.

...