2014-11-01 1 views
3

У меня есть проблема, которую я не знаю, как решить и не смогли найти некоторые подсказки в Интернете, как хорошо, но проблема должна быть тривиальной ...Как сделать каталоги с возможностью расширения в JavaFX TreeView

У меня есть TreeView<File> который я хотел бы заполнить списком каталогов и файлов на основе заданного пути. Проблема в том, что каталоги добавляются в дерево, но не могут быть расширены, поэтому я не могу отображать файлы внутри.

Вот некоторые из моего скромного кода контроллера:

public class MainViewController implements Initializable { 
    @FXML // fx:id="filesTree" 
    private TreeView<File> filesTree; 

    @Override 
    public void initialize(URL url, ResourceBundle rb) { 
     File currentDir = new File("src/xslt"); // current directory 
     findFiles(currentDir); 
    } 

    public void findFiles(File dir) { 
    TreeItem<File> root = new TreeItem<>(new File("Files:")); 
    root.setExpanded(true); 
    try { 
     File[] files = dir.listFiles(); 
     for (File file : files) { 
      if (file.isDirectory()) { 
       System.out.println("directory:" + file.getCanonicalPath()); 
       findFiles(file); 
      } else { 
       System.out.println("  file:" + file.getCanonicalPath()); 
       root.getChildren().add(new TreeItem<>(file)); 
      } 
      root.getChildren().add(new TreeItem<>(file)); 
     } 

     filesTree.setRoot(root); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

} 

И мой FXML взгляд очень проста - просто AnchorPane с TreeView. Но я могу поделиться им, если это необходимо.

Так что вопросы - как мне сделать каталоги расширяемыми? Я нашел setExpanded(true) метод, но это другое.

ответ

8

В основном, рекурсивный метод должен создавать новый корень каждый раз, когда вы находите каталог.

private void findFiles(File dir, TreeItem<File> parent) { 
    TreeItem<File> root = new TreeItem<>(dir); 
    ... 
} 

И это root должен быть отправлен в качестве родителя для следующего уровня.

if (file.isDirectory()) { 
     System.out.println("directory:" + file.getCanonicalPath()); 
     findFiles(file,root); 
    } 

Наконец, только на самом верхнем уровне мы устанавливаем этот корень как корень из TreeView:

if(parent==null){ 
    filesTree.setRoot(root); 
} 

а во внутренних уровнях:

else { 
    parent.getChildren().add(root); 
} 

Так после этих нескольких КОРРЕКТИРОВКЕ , это должно быть выполнено:

@FXML private TreeView<File> filesTree; 

@Override 
public void initialize(URL url, ResourceBundle rb) { 
    File currentDir = new File("src/xslt"); // current directory 
    findFiles(currentDir,null); 
} 

private void findFiles(File dir, TreeItem<File> parent) { 
    TreeItem<File> root = new TreeItem<>(dir); 
    root.setExpanded(true); 
    try { 
     File[] files = dir.listFiles(); 
     for (File file : files) { 
      if (file.isDirectory()) { 
       System.out.println("directory:" + file.getCanonicalPath()); 
       findFiles(file,root); 
      } else { 
       System.out.println("  file:" + file.getCanonicalPath()); 
       root.getChildren().add(new TreeItem<>(file)); 
      } 

     } 
     if(parent==null){ 
      filesTree.setRoot(root); 
     } else { 
      parent.getChildren().add(root); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
+0

Thank s для подробного ответа и объяснения! Работает отлично! – lapadets

Смежные вопросы