2013-03-09 3 views
1

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

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); 
     } 
    })); 
+1

Не блокируйте EDT (Thread Dispatch Thread) - графический интерфейс «замерзнет», когда это произойдет. Вместо этого выполняйте 'SwingWorker' для длительных задач. Подробнее см. [Параллелизм в Swing] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/). –

ответ

1

Это потому, что вы делаете все ваши ActionPerformed вещи в GUI потоке, поэтому GUI замерзает, и ждет вашего ActionPerformed материала, чтобы сделать, способ избежать этого является использование Threads, есть пример: Thread Example

+0

Вторая связанная статья показывает, как это сделать в среде, отличной от GUI, но при этом для графического интерфейса возникают особые соображения. НАПРИМЕР. Все обновления графического интерфейса должны быть на EDT, а длительные задачи должны быть удалены. См. Мой комментарий выше для более подробной информации. –

+0

Да, вторая связанная статья - общий пример, я прочитал ваш комментарий, и на самом деле я не знал о SwingWorker, прочитав его JavaDoc, я думаю, что это определенно лучший способ сделать это, спасибо! – BackSlash

2

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

Обратите внимание, что обновление GUI из другого потока - плохая идея, используйте 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(); 
} 
+0

См. Также этот [пример] (http://stackoverflow.com/a/3245805/230513). – trashgod