循环遍历JTree中节点的所有父节点

时间:2019-01-25 18:22:20

标签: java jtree

我试图在JTree中向下更改节点的图标,然后更改到达该位置所需的所有Node。这是我到目前为止所拥有的。

   private void LoopDirectoryTree(DefaultMutableTreeNode node, File lua_file, String icon_url) {

        int childCount = node.getChildCount();

        TreeIcon t_node = (TreeIcon)node.getUserObject();

        if(t_node.getFile().equals(lua_file)){
            t_node.setIcon(icon_url);
        }

        for (int i = 0; i < childCount; i++) {

            DefaultMutableTreeNode childNode = (DefaultMutableTreeNode) node.getChildAt(i);
            if (childNode.getChildCount() > 0) {

                LoopDirectoryTree(childNode, lua_file, icon_url);

            } else {

                t_node = (TreeIcon)childNode.getUserObject();

                // THIS IS WHERE I TRIED TO GO BACK UP (refer below)
                if(t_node.getFile().equals(lua_file)){

                    // Icon to change
                    t_node.setIcon(icon_url);

                }

            }

        }
   } 

我尝试了以下方法:

   if(t_node.getFile().equals(lua_file)){

      // Icon to change
      t_node.setIcon(icon_url);

      while(childNode.getParent()!=null){

          childNode = (DefaultMutableTreeNode)childNode.getParent();
          t_node = (TreeIcon)childNode.getUserObject();

          // Icon to change (DIFFERENT ICON THAN OTHER)
          t_node.setIcon(NEW_ICON_URL);

      }

   }

但是那没有按预期工作。

基本上,我有一个文件夹和文件的JTree。我解析一个文件以检查语法,如果不好,我想用BAD解析的文件图标和JTree中的所有父文件夹显示该文件,我想成为一个BAD解析的文件夹图标。

1 个答案:

答案 0 :(得分:0)

我认为最好的选择是使用getPathToRoot()遍历JTree。

示例解决方案

 if(t_node.getFile().equals(lua_file)){

  // Icon to change
  t_node.setIcon(icon_url);
  TreeNode[] pathToRoot = ((DefaultTreeModel)tree.getModel()).getPathToRoot(node);
  for(TreeNode nToChangeIcon: pathToRoot){
    ((TreeNode)nToChangeIcon.getUserObject()).setIcon(NEW_ICON_URL);     
  }

}

使用getPathToRoot(node)时,它将返回TreeNodes的数组。 TreeNodes []的第一个索引是树模型的根。 TreeNodes []中的下一个节点是通向“节点”的根节点的子节点,依此类推,直到到达“节点”为止。

因此,通过使用for循环遍历TreeNodes [] pathToRoot中的每个节点,您将具有正确的节点路径,而不必使用getChildAt()。

据我了解,只要满足if条件,您就希望将路径中每个节点的Icon更改为“ node”。因此,使用增强的for循环遍历pathToRoot []中的每个TreeNode将允许您更改每个节点(包括t_node来自的节点)的图标