【问题标题】:How to search a particular node in jtree and make that node expanded.?如何在jtree中搜索特定节点并使该节点展开。?
【发布时间】:2012-01-02 21:10:21
【问题描述】:

我有一个有 100 个节点的 jtree。现在我想从该树中搜索特定节点并使该节点扩展..? 我该如何解决这个问题?

【问题讨论】:

    标签: java swing jtree


    【解决方案1】:

    我假设您的意思是要查找具有特定字符串的节点,对吧?其他答案解释了使用枚举方法执行此操作的方法......(我相信他们都知道,在现实世界中,您还必须满足多个节点具有所寻求的字符串的可能性,等等)

    但可能还有其他更性感的方式来做这件事。例如,如果您将所有节点放在某种collection 中(ArrayList 等*),因为它们被插入到树中(并在它们被删除时删除它们,包括显式删除它们的所有后代)。 . 并且如果您还实现了一些事情,如果两个节点从toString 获得相同的结果(或实现了这样做的Comparator),则它们被视为“相等”,那么您可以轻松弹出实际节点(或节点) 在ArrayList 里面匹配,然后去

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

    树的一个要点是它实际上是节点的路径(有时称为“面包屑”),它是任何给定节点的真正“身份”。就显示的String 值而言,这意味着您可能在同一棵树中拥有:

    路径:“彼得”-“派珀”-“腌制”-“胡椒”
    路径:“烹饪特色”-“香料”-“胡椒”
    路径:“我的最爱”-“食物”-“调味品”-“胡椒”

    假设您要搜索,然后选择或突出显示这些“胡椒”节点之一……为每个元素采用“蛮力”枚举方法并不是很有效路径(树越大,问题当然越严重)。

    使用我的建议,它变得非常简单:只需从根或任何位置开始划分您的“面包屑”路径,然后,当您深入到树中时,在“更高”节点上使用 node.isNodeDescendant() )(即那些离根更远的)你已经找到了(这里是 3 个“胡椒”节点):如果你想要上面的第一个路径,你会首先找到节点“彼得”,然后紧接着唯一的“胡椒”可以满足isNodeDescendant 测试的节点将产生您正在寻找的整个路径。

    * 当然,某种形式的散列集合会更有效。但只有在树中有数千个或更多节点时才需要考虑这一点。

    【讨论】:

      【解决方案2】:

      这是一个如何在搜索中循环遍历树的示例:

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

      【讨论】:

      • 好例子;也可以考虑text.addActionListener(this);另见Initial Threads
      【解决方案3】:

      扩展@mKorbel 的答案并如How to Use Trees 中所述,您可以递归搜索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;
      }
      

      【讨论】:

      • 我的(狂野的 :-) 猜测是“获得 TreePath”是问题的核心——不是火箭科学,但在教程中没有这样做的例子(或者我是盲人, 非零概率 )
      猜你喜欢
      • 2014-04-13
      • 2021-04-20
      • 1970-01-01
      • 1970-01-01
      • 2019-02-11
      • 1970-01-01
      • 2021-01-06
      • 2012-04-01
      • 2013-02-28
      相关资源
      最近更新 更多