在Java FX TreeItem getChildren延迟执行期间指示进程

时间:2014-05-31 07:11:24

标签: java treeview javafx-2

我根据http://www.loop81.com/2011/11/javafx-20-mastering-treeview.html中的示例实现动态构建Jafa FX2 TreeView(文件系统目录),扩展节点时延迟加载目录子项。

当加载孩子需要一些时间时,界面没有响应,特别是当扩展了有很多孩子的树节点时,所以我想显示一个进度指示器。经过大量关于后台任务,事件等的试验而没有成功,我陷入了困境。

在TreeItem.getChildren()中实现进度指示器的优雅方法是什么?

1 个答案:

答案 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();  
}