Vaadin 8: как показать окно ProgressBar перед переходом в другое представление с длительной загрузкой - PullRequest
0 голосов
/ 17 декабря 2018

Я хочу перейти к представлению, которое отображает большие данные в сетке после нажатия кнопки.Я знаю, что происходит отложенная загрузка, но я хочу загрузить все данные, чтобы иметь возможность сортировки, нажав на заголовок.С ленивой загрузкой я мог отсортировать только один столбец.

Button viewDataBtn = new Button("View scan data");
viewDataBtn .addClickListener(e -> {
        UI.getCurrent().getNavigator().navigateTo("scandataview/" + name);
    });

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

viewDataBtn .addClickListener(e -> {

        UI.getCurrent().addWindow(showProgress);
        new Thread(new Loader()).start();
    });

В том же классе:

 class Loader implements Runnable {

        @Override
        public void run() {
            try {
                //Nullpointer exception here:
              UI.getCurrent().getNavigator().navigateTo("scandataview/" + name);

            } catch (Exception e) {
                e.printStackTrace();
            }
            finally {
                UI.getCurrent().removeWindow(showProgress);
            }
        }
 }

И окно индикатора выполнения:

public class LoadingIndicatorWindow extends Window {

public LoadingIndicatorWindow() {
    center();
    setVisible(true);
    setResizable(false);
    setDraggable(false);
    setModal(true);
    setClosable(false);
    setCaption("Loading");

    VerticalLayout layout = new VerticalLayout();
    layout.setMargin(true);
    layout.setWidth("100%");

    Label progressLabel = new Label("Please wait! Data loading in progress...");
    progressLabel.setSizeFull();

    ProgressBar progressBar = new ProgressBar();
    progressBar.setSizeFull();
    progressBar.setIndeterminate(true);
    progressBar.setVisible(true);

    layout.addComponent(progressLabel);
    layout.addComponent(progressBar);

    layout.setComponentAlignment(progressLabel, Alignment.MIDDLE_CENTER);
    layout.setComponentAlignment(progressBar, Alignment.MIDDLE_CENTER);
    setContent(layout);
}

}

Кажется, я не могу перейти в другой поток.

Есть ли способ показать окно индикатора выполнения перед переходом к другому представлению, когда это представление готово, показывая большую сетку с данными ???

Большое спасибо за вашу помощь!

Ответы [ 3 ]

0 голосов
/ 21 декабря 2018

попробуйте это: https://github.com/ldelaprade/ProgressWindowForVaadin

Это окно прогресса закрывается автоматически, когда длинная задача завершена.Работает без многопоточности.Хитрость заключается в том, что вы просите, чтобы окно прогресса отображалось, а затем, когда оно фокусируется, оно запрашивает у сервера начало длительной работы.

Laurent

0 голосов
/ 23 декабря 2018

Как указал Тату Лунд, урок Алехандро великолепен.Однако не совсем то, что мне было нужно.Поэтому я хочу опубликовать свой ответ.

Мне показалась полезной следующая ссылка:

Push-документация

Класс Loader теперь выглядит следующим образом:

class Loader implements Runnable {

    @Override
    public void run() {
        try {
            getUI().access(() -> {
                getUI().getNavigator().navigateTo("scandataview/" + name);
            });

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Чтобы закрыть окно прогресса, я создал экземпляр класса LoadingIndicatorWindow в классе пользовательского интерфейса и дал его обоим представлениям.Окно закрывается в представлении, в котором отображаются данные после «кода отображения сетки» с

UI.getCurrent().removeWindow(showProgress);
0 голосов
/ 17 декабря 2018

Я бы порекомендовал посмотреть превосходный учебник Алехандро на эту тему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...