Цикл по всем родительским узлам узла в JTree - PullRequest
0 голосов
/ 25 января 2019

Я пытаюсь изменить значок узла в JTree, а затем изменить все узлы, необходимые для его получения. Вот что у меня есть.

   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 голосов
/ 07 февраля 2019

Я думаю, что вам лучше всего использовать 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. Поэтому использование расширенного цикла for для прохождения каждого TreeNode в pathToRoot [] позволит вам изменить значок каждого узла (включая узел, с которого пришел t_node)

...