Vaadin отключить кнопку во время действия - PullRequest
0 голосов
/ 28 сентября 2018

Как мне добиться этого в Vaadin.

// inside myButton click event
myButton.setEnabled(false);
doMyActionThatTakeSomeTime();
myButton.setEnabled(true);

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

Что было бы лучше всего сделатьэто в Vaadin 11 (или 10)?

  • принудительно обновить представление?(как?)
  • поместить мое действие в поток?(как?)

Редактировать РЕШЕНИЕ - Как заставить его работать с Thread

Пока, пример с Thread (работает):

@Push 
@Route(value = "secured")
public class MainView extends VerticalLayout

[ ... ]

// inside click event
UI ui = UI.getCurrent();
new Thread(() -> {       
    ui.access(() -> {
      goButton.setEnabled(false);
      ui.push();
    });

    doMyActionThatTakeSomeTime();

    ui.access(() -> {
      goButton.setEnabled(true);
      ui.push();
    });
}).start();

Ответы [ 4 ]

0 голосов
/ 10 апреля 2019

Для меня самый простой способ это:

    Button btnAction = new Button("Action");
    btnAction.setDisableOnClick(true);
    btnAction.addClickListener(e -> {
        try {
            for (int i = 0; i < 900000; i++) {
                System.out.println(i);
            }
        } finally {
            btnAction.setEnabled(true);
        }
    });
0 голосов
/ 28 сентября 2018

В Vaadin 8 есть метод Button::setDisableOnClick() для этой конкретной цели.

Этот метод, вероятно, должен быть вновь введен в более новых версиях.

0 голосов
/ 02 октября 2018

Лучший способ сделать это:

UI ui = UI.getCurrent();    
ui.access( () -> { 
    // disable button
    goButton.setEnabled(false);
    ui.push();

    doMyActionThatTakeSomeTime();

    // enable
    goButton.setEnabled(true);
    ui.push();
    }); 
0 голосов
/ 28 сентября 2018

Похоже, что глава "Асинхронные обновления" в документации объясняет, что вы хотите: https://vaadin.com/docs/v11/flow/advanced/tutorial-push-access.html.В основном: запустите doMyActionThatTakeSomeTime() в отдельном фоновом потоке, затем повторно включите кнопку после завершения потока, и Server Push обеспечит правильное обновление состояния пользовательского интерфейса.

Это часто задаваемая тема, также естьдругой ответ здесь: Как закрыть диалоговое окно подтверждения Vaadin 8 при выполнении длительной операции Выполнение асинхронных обновлений работает в Vaadin 8 и Vaadin 10+ аналогичным образом.

...