Задать вопрос
@Romario21

Java фреймворк Vaadin криво обновляется ui из дочернего потока?

Всем привет, прощу помощи у тех кто знаком с фреймворком Vaadin
Вообщем суть проблемы:
Блок кода работает в дочернем потоке, когда поток завершается надо обновить значение ui компонента.
Значение компонента меняется, но ui виджет не перерисовывается в моменте. И что бы он перерисовался нужно тыкнуть на любой элемент реализующий слушатель, вообще пофиг какой главное что бы у него был addClickListener

@Push
public class WindowCreateLK  extends Composite<Div>{
	WindowCreateLK mainView;
	TextField tfDataFromServer;
	
    public WindowCreateLK(){
	         this.mainView = this;
	
                //Этот виджет надо обновить из дочернего потока
	         tfDataFromServer = new TextField("empty"); 
	         
			 
		
			 Button someButton1 = new Button("Some button2");
			 someButton1.addClickListener(e->{
			 
			 });
			 Button someButton2 = new Button("Some button2");
			 someButton2.addClickListener(e->{
			 
			 });
	
	         getContent().add(tfDataFromServer,someButton1,someButton2);
			 
			 
			 
	         //My Thread
	         MyCustomThread myThread = new MyCustomThread(UI.getCurrent(),context);
             myThread.start(); 
			 
			 
	}

    //inner class
    private static class MyCustomThread extends Thread {
        private final UI ui;
        private final WindowCreateLK mainView;

        private int count = 0;

        public MyCustomThread(UI ui, WindowCreateLK mainView) {
            this.ui = ui;
            this.mainView = mainView;
        }

        @Override
        public void run() {
            try {
                // Update the data for a while
                while (count < 10) {
                    Thread.sleep(500);
                    System.out.println(count);
                    count++;
                }

                // Inform that we are done
                ui.access(() -> {
                    ui.access(() -> mainView.tfDataFromServer.setValue("SomeData"));
                    ui.push();
					//But for view changes, i need click on some component with listener(like button or tab)

                });
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
  • Вопрос задан
  • 144 просмотра
Подписаться 2 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
@Carburn
.push() в ui.access() с @Push вызывать необязательно.
Wrap UI updates with access() when accessing it from other threads, sending updates happens automatically by default:

If the push mode is manual, you need to push the pending UI changes to the browser explicitly with the push() method.
https://vaadin.com/docs/v8/framework/advanced/adva...

push() надо вызывать только при @Push(PushMode.MANUAL)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
18 дек. 2024, в 12:39
1000 руб./за проект
18 дек. 2024, в 12:37
10000 руб./за проект
18 дек. 2024, в 12:22
5000 руб./за проект