Текстовая область не обновляется при выполнении действия кнопки

У меня есть элемент качания текстовой области, где я хочу отображать некоторые журналы выполнения. сообщения должны появляться после каждого шага выполнения. например "Выборка начата". Но проблема в том, что все сообщения журналов появляются только один раз после завершения действия кнопки. Ниже приведен способ, которым я использовал для отображения некоторого текста.

getXmlButton = new JButton("Fetch Reports");
    getXmlButton.addActionListener((new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {

            createDirectory();
            stutusArea.append("Fetching has been started");
            final String password = passwordTextField.getText();
            final String username = loginTextField.getText();

            OperatingSystemDriver os = new OperatingSystemDriver();
            driver = os.getDriver();

            stutusArea.append("getting some url");
            driver.get(URL);



           try {
               LoginPage login = new LoginPage(driver);
               login.loginAs(username, password);
               stutusArea.append("successful login"); 
           } catch (Exception e1) {
               stutusArea.append("login error"); 
            }
    insertToDbButton.setEnabled(true);
        }
    }));

person noname.404    schedule 09.03.2013    source источник
comment
Не блокируйте EDT (поток отправки событий) — когда это произойдет, графический интерфейс «зависнет». Вместо этого реализуйте SwingWorker для длительных задач. Дополнительные сведения см. в разделе Параллелизм в Swing.   -  person Andrew Thompson    schedule 09.03.2013


Ответы (2)


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

Обратите внимание, что обновлять графический интерфейс из другого потока — плохая идея, используйте SwingUtilities.invokeLater, чтобы избежать странных ошибок/ошибок.

public void actionPerformed(ActionEvent e) {
    new Thread(new Runnable() {
        public void run() {
             SwingUtilities.invokeLater(new Runnable() {
                 public void run() {
                     stutusArea.append("Fetching has been started");
                 }
             })
             final String password = passwordTextField.getText();
             final String username = loginTextField.getText();
             // ...
        }
    }).start();
}
person Johannes Kuhn    schedule 09.03.2013

Это связано с тем, что вы выполняете все свои ActionPerformed действия в потоке графического интерфейса, поэтому графический интерфейс зависает и ждет выполнения ваших ActionPerformed действий. Чтобы избежать этого, используйте Threads, есть пример: Пример потока

person BackSlash    schedule 09.03.2013
comment
Во второй связанной статье показано, как это сделать в среде без графического интерфейса, но выполнение этого для графического интерфейса требует особых соображений. НАПРИМЕР. Все обновления графического интерфейса должны быть в EDT, а длительные задачи должны быть удалены из него. Смотрите мой комментарий выше для более подробной информации. - person Andrew Thompson; 09.03.2013
comment
Да, вторая связанная статья является общим примером, я прочитал ваш комментарий и на самом деле я не знал о SwingWorker, после прочтения JavaDoc я думаю, что это определенно лучший способ сделать это, спасибо! - person BackSlash; 09.03.2013