Кнопка 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

Другие вопросы по тегам