GUI JButton не обновляется вовремя

Я работаю с кодом, который по сути является программой перемещения файлов. Что я пытаюсь сделать, так это то, что после того, как пользователь нажмет кнопку отправки, которая вызывает средство перемещения файлов, текст кнопки изменится на «Работает». У меня есть базовое понимание того, почему это не сработало, когда я просто установил его, но я попытался использовать SwingUtilities, чтобы вызвать его в фоновом режиме. Однако он по-прежнему ждет завершения вызова метода ft.FindSpot, прежде чем отображать какие-либо изменения.

            public void actionPerformed(ActionEvent arg0) {
            if(!textField.getText().equals(""))
            {
                SwingUtilities.invokeLater(new Runnable() {
                    public void run() {
                        btnSubmit.setText("Working...");
                    }
                });
                //btnSubmit.setText("Working...");
                ft.FindSpot(textField.getText(), comboBox.getSelectedItem().toString(), progressBar);

                SwingUtilities.invokeLater(new Runnable() {
                    public void run() {
                        btnSubmit.setText("Submit");
                    }
                });
            }
            else
            {
                ft.warningMessage("The ISCII textbox cannot be blank.");
            }
        }
    });

person Marshal Alessi    schedule 17.10.2017    source источник
comment
Используйте Swing Worker, чтобы выполнить длинную процесс в фоновом потоке. В руководстве показан пример   -  person Frakcool    schedule 17.10.2017
comment
метод actionPerformed() вызывается в потоке событий Swing. Таким образом, первый btnSubmit.setText("working…") не нужно будет вызывать с invokeLater(). Но ft.FindSpot также работает в потоке событий Swing, по существу блокируя его до тех пор, пока он не завершится, и, следовательно, визуальное обновление кнопки также не может произойти.   -  person cello    schedule 17.10.2017
comment
@MarshalAlessi вот пример, это не минимальный воспроизводимый пример в моем ответе, но вы можете взять код вопроса и использовать мои рекомендации в ответе, который я предоставил. Однако в данный момент я не могу привести пример, но могу попробовать еще через пару часов.   -  person Frakcool    schedule 17.10.2017
comment
Спасибо @Frakcool. Я просмотрю информацию для будущих целей. Тем не менее, я смог найти решение этой проблемы, как я написал ниже. Спасибо еще раз!   -  person Marshal Alessi    schedule 17.10.2017
comment
Попробуйте и дайте мне знать, если вам удалось создать его оттуда, иначе я опубликую свой ответ с новым MCVE (и я предлагаю вам создать минимальный воспроизводимый пример для ваших будущих вопросов, а не фрагментов кода)   -  person Frakcool    schedule 17.10.2017


Ответы (1)


Мне удалось исправить проблему, поместив ft.FindSpot в функцию invokeLater Swing Utilities, чтобы она вызывалась из другого потока.

        btnSubmit.setFont(new Font("Verdana", Font.PLAIN, 12));
    btnSubmit.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            if(!textField.getText().equals(""))
            {
             btnSubmit.setText("Working...");
                SwingUtilities.invokeLater(new Runnable() {
                    public void run() {
                        ft.FindSpot(textField.getText(), comboBox.getSelectedItem().toString(), progressBar);
                    }
                });

                SwingUtilities.invokeLater(new Runnable() {
                    public void run() {
                        btnSubmit.setText("Submit");
                    }
                });
            }
            else
            {
                ft.warningMessage("The ISCII textbox cannot be blank.");
            }
        }
    });
person Marshal Alessi    schedule 17.10.2017