我有一个问题,我不知道如何解决,也无法在网上找到一些线索,但这个问题应该很琐碎。。。
我有一个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
视图非常简单——只是一个带有TreeView
的AnchorPane
。但如果需要,我也可以分享。
所以问题是——我如何使目录可扩展?我找到了setExpanded(true)
方法,但那是不同的。
基本上,每次找到目录时,递归方法都必须创建一个新的根。
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);
}
最后,只有在最顶层,我们才将这个根设置为树的根View:
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();
}
}