Укажите процесс во время отложенного выполнения Java FX TreeItem getChildren

1

Я реализую динамически созданный Jafa FX2 TreeView (каталог файловой системы) в соответствии с примером в http://www.loop81.com/2011/11/javafx-20-mastering-treeview.html с ленивой загрузкой дочерних элементов каталога, когда расширение узла.

Когда загрузка детей занимает некоторое время, интерфейс не реагирует, особенно когда узел дерева с большим количеством детей расширяется, поэтому я хочу показать индикатор прогресса. После многих испытаний с фоновыми заданиями, событиями и так далее без успеха я застрял без идеи.

Каков элегантный способ достижения индикатора прогресса во время TreeItem.getChildren()?

Теги:
treeview
javafx-2

1 ответ

2
Лучший ответ


Это мое решение (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();  
}
  • 1
    Спасибо, Сергей, извини, что так долго ждал реакции. Тем временем проект был на льду, так как у меня не было прогресса, и другие проекты были более важными. Сначала я не мог видеть ProgessIndicator, потому что я реализовал свою собственную фабрику TreeCell. При стандартной реализации TreeCell все работает отлично.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню