我根据http://www.loop81.com/2011/11/javafx-20-mastering-treeview.html中的示例实现动态构建Jafa FX2 TreeView(文件系统目录),扩展节点时延迟加载目录子项。
当加载孩子需要一些时间时,界面没有响应,特别是当扩展了有很多孩子的树节点时,所以我想显示一个进度指示器。经过大量关于后台任务,事件等的试验而没有成功,我陷入了困境。
在TreeItem.getChildren()中实现进度指示器的优雅方法是什么?
答案 0 :(得分:2)
这是我的解决方案(Java 8):
为进度指示器创建字段:
private ProgressIndicator pinMain;
在构造函数中,创建它并设置大小:
pinMain = new ProgressIndicator();
pinMain.setPrefSize(20, 20);
在getChildren方法中创建Task以进行长时间操作。在为树项启动任务setGraphic之前,执行后删除graphic:
@Override
public ObservableList<TreeItem<String>> getChildren() {
if (hasLoadedChildren == false) {
Task<ArrayList<LazyTreeItem>> task = new Task<ArrayList<LazyTreeItem>>() {
@Override
protected void succeeded() {
super.succeeded();
hasLoadedChildren = true;
LazyTreeItem.super.getChildren().setAll(getValue());
// remove progress indicator
setGraphic(null);
}
@Override
protected ArrayList<LazyTreeItem> call() throws Exception {
ArrayList<LazyTreeItem> list = loadChildren();
return list;
}
};
Thread t = new Thread(task);
// show progress indicator
setGraphic(pinMain);
t.start();
}
return super.getChildren();
}