Я реализую динамически созданный Jafa FX2 TreeView (каталог файловой системы) в соответствии с примером в http://www.loop81.com/2011/11/javafx-20-mastering-treeview.html с ленивой загрузкой дочерних элементов каталога, когда расширение узла.
Когда загрузка детей занимает некоторое время, интерфейс не реагирует, особенно когда узел дерева с большим количеством детей расширяется, поэтому я хочу показать индикатор прогресса. После многих испытаний с фоновыми заданиями, событиями и так далее без успеха я застрял без идеи.
Каков элегантный способ достижения индикатора прогресса во время TreeItem.getChildren()?
Это мое решение (Java 8):
Создать поле для индикатора прогресса:
private ProgressIndicator pinMain;
В конструкторе создайте его и задайте размер:
pinMain = new ProgressIndicator();
pinMain.setPrefSize(20, 20);
В методе getChildren создайте задачу для долговременной работы. Перед запуском задачи setGraphic для элемента дерева, после выполнения удалить графику:
@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();
}