【问题标题】:Checking if JTree node exist using path使用路径检查 JTree 节点是否存在
【发布时间】:2012-06-08 15:26:42
【问题描述】:

我有一个经典的 JTree,上面填充了一些节点。让我们假设树看起来像这样:

Root
|-Fruit
|--Apple
|--Orange
|-Objects
|--Table
|--Car

在java中有什么方法可以使用这样的假定路径检查节点是否存在:

TreeNode found = model.getNodeOrNull("\\Fruit\\Apple")

所以如果给定位置的节点存在则返回,如果不返回null? Java中有这样的机制吗?

【问题讨论】:

  • 您是否正在寻找使用其 toString 表示匹配“Apple”的节点?你可以有两个不等于()但有相同toString()的节点,所以你的方法可能会返回多个匹配。
  • @guest86 不知道你在尝试什么,你必须在 XxxTreeModel 中迭代,没有其他方法

标签: java swing jtree


【解决方案1】:

不幸的是,没有任何开箱即用的东西可以做到这一点。这对 Swing 不想强加于其设计的节点做出一些假设,因为它会限制作为树中节点的含义(即所有节点都有某种唯一标识它们的字符串)。这并不意味着您不能轻松地自己实现它。你可能知道 TreePath 是 JTree 中的一个常见概念,所以这里有一个简单的方法,它返回一个 TreePath 给给定路径的节点:

http://www.exampledepot.8waytrips.com/egs/javax.swing.tree/FindNode.html

你可以以此为基础来实现你所追求的。

【讨论】:

    【解决方案2】:

    你可以尝试一些类似的东西。

    示例输出

    food:pizza found true
    od:pizza found false
    sports:hockey found true
    sports:hockey2 found false
    

    TreeNodeLocation.java

    import java.awt.BorderLayout;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.text.Position;
    import javax.swing.tree.TreePath;
    
    public class TreeNodeLocation {
    
        private JTree tree = new JTree();
    
        TreeNodeLocation() {
            JPanel p = new JPanel(new BorderLayout(2,2));
    
            final JTextField find = new JTextField("food:pizza");
            find.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent ae) {
                    boolean found = findText(find.getText());
                    System.out.println(find.getText() + " found " + found);
                }
            });
            p.add(find, BorderLayout.PAGE_START);
    
            tree.setVisibleRowCount(8);
            for (int row=tree.getRowCount(); row>=0; row--) {
                tree.expandRow(row);
            }
    
            p.add(new JScrollPane(tree),BorderLayout.CENTER);
    
            JOptionPane.showMessageDialog(null, p);
        }
    
        public boolean findText(String nodes) {
            String[] parts = nodes.split(":");
            TreePath path = null;
            for (String part : parts) {
                int row = (path==null ? 0 : tree.getRowForPath(path));
                path = tree.getNextMatch(part, row, Position.Bias.Forward);
                if (path==null) {
                    return false;
                }
            }
            tree.scrollPathToVisible(path);
            tree.setSelectionPath(path);
    
            return path!=null;
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    new TreeNodeLocation();
                }
            });
        }
    }
    

    【讨论】:

    • @trashgod 非常正确。这就是我首先扩展树的原因。 ;)
    【解决方案3】:

    您可以使用模型的Enumeration 实例之一进行搜索,如here 所示。

    【讨论】:

      猜你喜欢
      • 2016-04-29
      • 1970-01-01
      • 1970-01-01
      • 2012-04-08
      • 2011-02-18
      • 2019-02-10
      • 2011-06-09
      • 2017-06-03
      • 1970-01-01
      相关资源
      最近更新 更多