Ваадин 8: Как обновить значение метки на модальной форме из другого потока - PullRequest
0 голосов
/ 20 марта 2020

Я использую vaadin 8, и мне нужно обновить значение метки на модале.

В приведенном ниже листинге значение метки находится внутри цикла while(true), выполняемого из другого Thread:

      modal.show();
        modal.getUI().access(new Runnable() {
                    @Override
                    public void run() {
                        while(true) {
                        sleep(1000)
                        ....
                        break_condition;
                        break;
                        }
                        modal.getLabel().setValue("xxxx")
                    }
        });

Во время процесса экран зависнет, и в конце появится модальное значение windows с измененным значением метки. Можно ли обойтись без зависания экрана?

Ответы [ 2 ]

0 голосов
/ 20 марта 2020

Возможное решение ...

class TaskCycle implements Runnable {

    MyModal modal;

    public TaskCycle(MyModal modal){
      this.modal = modal
    }

        @Override
        public void run() {
           while(true) {
             sleep(1000)
              ....
             break_condition;
             break;
           }
           modal.getLabel().setValue("xxxx");
           modal.getLabel().getUI().push();
        }    
    }


MyModal modal = new MyModal();
modal.show();

TaskCycle r = new TaskCycle (modal);    
Thread t = new Thread(r);
t.start();

В целом, это решение хорошо работает, но требует настройки "vaadin server-pu sh" (см. Официальную документацию).

К сожалению, я использую Liferay 7, и сервер pu sh (из vaadin 8) не работает.

Это решение в моем случае не лучшее, потому что модал обновляется с новым значения (предоставленные потоком), только если вы выполняете «изменение размера» окна / вкладки браузера.

Чтобы «смоделировать» изменение размера, можно вставить функцию:

setPollInterval(1000);
UIEvents.PollListener poll = new UIEvents.PollListener(){

            @Override
            public void poll(UIEvents.PollEvent event) {
                System.out.println("Poll interval start!!!!!");
            }
        };
UI.getCurrent().addPollListener(poll);

для удаления слушателя:

UI.getCurrent().removePollListener(poll);

это хороший обходной путь для всех пользователей, которые не могут использовать функцию pu sh ().

0 голосов
/ 20 марта 2020

Постарайтесь расслабиться, пока л oop казнит, вводя сон. Это может предотвратить зависание экрана:

Thread.sleep(50);
...