Как найти определенный узел в jtree и сделать этот узел расширенным? - PullRequest
7 голосов
/ 21 ноября 2011

У меня есть jtree со 100 узлами.Теперь я хочу найти конкретный узел из этого дерева и сделать этот узел расширенным ..?Как я могу решить эту проблему .?

Ответы [ 3 ]

24 голосов
/ 21 ноября 2011

Расширяя ответ @ mKorbel и как описано в Как использовать деревья , вы можете рекурсивно искать ваш TreeModel и получить TreePath для получающегося узла. Если у вас есть желаемый path, его легко обнаружить в дереве.

tree.setSelectionPath(path);
tree.scrollPathToVisible(path);

Приложение: Вот один из способов "получить TreePath."

private TreePath find(DefaultMutableTreeNode root, String s) {
    @SuppressWarnings("unchecked")
    Enumeration<DefaultMutableTreeNode> e = root.depthFirstEnumeration();
    while (e.hasMoreElements()) {
        DefaultMutableTreeNode node = e.nextElement();
        if (node.toString().equalsIgnoreCase(s)) {
            return new TreePath(node.getPath());
        }
    }
    return null;
}
2 голосов
/ 02 августа 2015

Я предполагаю, что вы хотите найти узел с определенной строкой, верно?Другие ответы объясняют способы сделать это, используя подход перечисления ... (и я уверен, что все они знают, что в реальном мире вам также придется учитывать возможность наличия более чем одного узла с искомой строкой,и т.д.)

Но есть и другие, более сексуальные способы сделать это.Например, если вы поместите все узлы в collection некоторого вида (ArrayList и т. Д.), Как они были вставлены в дерево (и удалили их, как они были удалены, включая явное удаление всех их потомков) ..и если вы также реализовали вещи так, чтобы два узла считались «равными», если они имели одинаковый результат из toString (или реализовали Comparator, который это сделал), то вы могли бы легко вынуть фактический узел (или узлы)) в ArrayList, которые совпадают, а затем идут

tree.expandPath( new TreePath( node_found.getPath())

Одна из точек деревьев заключается в том, что на самом деле это путь к узлу (иногда называемый «сухарями»)) которая является реальной "идентичностью" любого данного узла.С точки зрения отображаемых значений String это означает, что вы можете иметь в одном и том же дереве:

путь: «Питер» - «Пайпер» - «маринованный» - «перец»
путь: «Кулинарный»specialties "-" специи "-" перец "
путь:" Мои любимые "-" еда "-" приправы "-" перец "

И так сказать, вы хотите найти, изатем выберите или выделите один из этих "перцевых" узлов ... на самом деле не очень эффективно использовать подход перечисления "грубой силы" для каждого из элементов этого пути (чем больше дерево, тем хуже проблема, конечно,).

Используя мое предложение, это становится довольно просто: просто разделите путь «хлебных крошек», начиная с корня или где угодно, а затем, когда вы углубитесь в дерево, используйте node.isNodeDescendant() на "более высокие "узлы" (то есть те, которые находятся дальше от корня), которые вы уже нашли (здесь, 3 "перцовых" узла): если вы хотите первый путь выше, вы сначала найдете узел "Питер", а затем сразу после этогоединственный "перцовый" узел, который мог бы удовлетворить isNodeDescendant test даст весь путь, который вы ищете.

* Конечно, некоторая форма хеширования будет еще более эффективной.Но это соображение, только если у вас есть много тысяч или более узлов в вашем дереве.

1 голос
/ 05 мая 2015

Вот пример того, как перебирать дерево в поиске:

    import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.ArrayList;
    import java.util.Enumeration;
    import java.util.List;

    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTextField;
    import javax.swing.JTree;
    import javax.swing.tree.DefaultMutableTreeNode;
    import javax.swing.tree.DefaultTreeModel;
    import javax.swing.tree.TreePath;

    public class TreeDemo extends JFrame implements ActionListener{
        private static final long serialVersionUID = 1L;
        public JTree tree;
        public JButton button;
        public JTextField text;

        public TreeDemo() {

            button = new JButton("Enter search text below and click");
            text = new JTextField();


            button.addActionListener(this);

            tree = new JTree();
            DefaultMutableTreeNode root = new DefaultMutableTreeNode( "Deck" );
            DefaultMutableTreeNode itemClubs= new DefaultMutableTreeNode( "Clubs" );
            addAllCard( itemClubs );
            root.add( itemClubs );

            DefaultMutableTreeNode itemDiamonds = new DefaultMutableTreeNode( "Diamonds" );
            addAllCard( itemDiamonds );
            root.add( itemDiamonds );

            DefaultMutableTreeNode itemSpades = new DefaultMutableTreeNode( "Spades" );
            addAllCard( itemSpades );
            root.add( itemSpades );

            DefaultMutableTreeNode itemHearts = new DefaultMutableTreeNode( "Hearts" );
            addAllCard( itemHearts );
            root.add( itemHearts );

            DefaultTreeModel treeModel = new DefaultTreeModel( root );
            tree = new JTree( treeModel );

            JScrollPane scrollPane = new JScrollPane(tree);
            getContentPane().add(scrollPane, BorderLayout.CENTER);
            getContentPane().add(button, BorderLayout.NORTH);
            getContentPane().add(text, BorderLayout.SOUTH);

            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setSize(375, 400);      
        }

        public void addAllCard( DefaultMutableTreeNode suit ) {
            suit.add( new DefaultMutableTreeNode( "Ace" ) );
            suit.add( new DefaultMutableTreeNode( "Two" ) );
            suit.add( new DefaultMutableTreeNode( "Three" ) );
            suit.add( new DefaultMutableTreeNode( "Four" ) );
            suit.add( new DefaultMutableTreeNode( "Five" ) );
            suit.add( new DefaultMutableTreeNode( "Six" ) );
            suit.add( new DefaultMutableTreeNode( "Seven" ) );
            suit.add( new DefaultMutableTreeNode( "Eight" ) );
            suit.add( new DefaultMutableTreeNode( "Nine" ) );
            suit.add( new DefaultMutableTreeNode( "Ten" ) );
            suit.add( new DefaultMutableTreeNode( "Jack" ) );
            suit.add( new DefaultMutableTreeNode( "Queen" ) );
            suit.add( new DefaultMutableTreeNode( "King" ) );
        }

        public final DefaultMutableTreeNode findNode(String searchString) {

            List<DefaultMutableTreeNode> searchNodes = getSearchNodes((DefaultMutableTreeNode)tree.getModel().getRoot());
            DefaultMutableTreeNode currentNode = (DefaultMutableTreeNode)tree.getLastSelectedPathComponent();

            DefaultMutableTreeNode foundNode = null;
            int bookmark = -1;

            if( currentNode != null ) {
                for(int index = 0; index < searchNodes.size(); index++) {
                    if( searchNodes.get(index) == currentNode ) {
                        bookmark = index;
                        break;
                    }
                }
            }

            for(int index = bookmark + 1; index < searchNodes.size(); index++) {    
                if(searchNodes.get(index).toString().toLowerCase().contains(searchString.toLowerCase())) {
                    foundNode = searchNodes.get(index);
                    break;
                }
            }

            if( foundNode == null ) {
                for(int index = 0; index <= bookmark; index++) {    
                    if(searchNodes.get(index).toString().toLowerCase().contains(searchString.toLowerCase())) {
                        foundNode = searchNodes.get(index);
                        break;
                    }
                }
            }
            return foundNode;
        }   

        private final List<DefaultMutableTreeNode> getSearchNodes(DefaultMutableTreeNode root) {
            List<DefaultMutableTreeNode> searchNodes = new ArrayList<DefaultMutableTreeNode>();

            Enumeration<?> e = root.preorderEnumeration();
            while(e.hasMoreElements()) {
                searchNodes.add((DefaultMutableTreeNode)e.nextElement());
            }
            return searchNodes;
        }

        public static void main(String[] args) {
            TreeDemo app = new TreeDemo();
            app.setVisible(true);


        }


        public void actionPerformed(ActionEvent e) {
            String search = text.getText();
                if(search.trim().length() > 0 ) {

                DefaultMutableTreeNode node = findNode(search);                
                if( node != null ) {
                    TreePath path = new TreePath(node.getPath());
                    tree.setSelectionPath(path);
                    tree.scrollPathToVisible(path);
                }  
            }
        }
    }
...