Кнопка Vaadin setEnabled(false) не активируется
Vaadin newbie: Когда пользователь нажимает кнопку, мне нравится отключать ее, чтобы он знал, что щелкнул ею, и в фоновом режиме идет какая-то работа. Когда (длинная) задача будет выполнена, я бы хотел включить кнопку.
Для этого я использую 2 потока (фоновый и рабочий), но по какой-то причине кнопка не активируется в конце задачи.
Другими словами, после нажатия он переходит во включенное состояние (false) и никогда не возвращается. Зачем? и как я могу это исправить?
button.addClickListener(new ClickListener()
{
public void buttonClick(ClickEvent event)
{
Thread background = new Thread(new Runnable(){
@Override
public void run()
{
Thread work = new Thread(new Runnable(){
@Override
public void run()
{
button.setEnabled(false);
try
{
Thread.sleep(2000); //long work here!
} catch (InterruptedException e)
{
e.printStackTrace();
}
button.setEnabled(true); //doesn't enable at the end of the long work!
}});
work.start();
try
{
work.join();
} catch (InterruptedException e)
{
e.printStackTrace();
}
}});
background.start();
}
});
1 ответ
Возможно, лучшим подходом было бы использовать Button.setDisableOnClick(true) для кнопки и выполнять обработку непосредственно в обработчике событий без фонового потока. Это покажет пользователю стандартный индикатор загрузки, пока обработка не будет завершена.
В противном случае вам нужно активировать push сервера (@Push) и не забывать использовать UI.access() в фоновом потоке перед обновлением интерфейса. См. https://vaadin.com/book/-/page/advanced.push.html