我想从TreeItem
更新我的TreeView
。
自定义root
元素,其中将下载其他元素:
public class FilePathTreeItem extends TreeItem<Path> {
private boolean isFirstTimeChildren = true;
private boolean isFirstTimeLeaf = true;
private boolean isLeaf;
public boolean isDirectory() {
return Files.isDirectory(getValue());
}
public FilePathTreeItem(Path f) {
super(f);
}
@Override
public ObservableList<TreeItem<Path>> getChildren() {
if (isFirstTimeChildren) {
isFirstTimeChildren = false;
super.getChildren().setAll(buildChildren());
}
return super.getChildren();
}
@Override
public boolean isLeaf() {
if (isFirstTimeLeaf) {
isFirstTimeLeaf = false;
isLeaf = Files.exists(getValue()) && !Files.isDirectory(getValue());
}
return isLeaf;
}
private ObservableList<TreeItem<Path>> buildChildren() {
if (Files.isDirectory(getValue())) {
try {
return Files.list(getValue())
.map(FilePathTreeItem::new)
.collect(Collectors.toCollection(FXCollections::observableArrayList));
} catch (IOException e) {
e.printStackTrace();
return FXCollections.emptyObservableList();
}
}
return FXCollections.emptyObservableList();
}
}
我也看到了这个解决方案:https://gist.github.com/jewelsea/5174074
这是必要的,但在更新TreeView
之后,我希望能够保存isExpended()
属性。否则,所有文件夹都将关闭。
我尝试使用其他变量存储以前的TreeItem
并计算新的TreeItem
。但是我有相同的附加变量,因为它是不可变的。我尝试了不同类型的Cloning
,但没有任何内容(来自github的Gson
,Apache
,native cloning
,deep cloning
。
我花了很多时间寻找解决方案,但没有找到理想的解决方案。
此外,我尝试了refresh
方法,但它很简单,并且不会使用新的外部文件更新TreeView
。