2013-03-09 23 views
1

我有一個文本區域的擺動元素,我想顯示一些執行日誌。消息應在每個執行步驟後出現。例如「抓取已經開始」。但問題是,所有的日誌信息只出現一次後按鈕操作進行事件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(Event Dispatch Thread) - 當發生這種情況時,GUI將「凍結」。而是爲長時間運行的任務實施'SwingWorker'。有關更多詳細信息,請參見[Swing中的併發](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/)。 – 2013-03-09 12:54:39

回答

1

那是因爲你把你所有的東西ActionPerformed在GUI線程的方式,所以GUI凍結,並在等待您ActionPerformed東西要做,一個方法來避免這是使用Threads,有一個例子:Thread Example

+0

第二篇鏈接文章展示瞭如何在非GUI環境下完成它,但是爲GUI做這件事需要特別注意。例如。所有的GUI更新應該在EDT上,而長時間運行的任務應該從它移走。有關更多詳細信息,請參閱上面的註釋 – 2013-03-09 12:57:21

+0

是的,第二個鏈接的文章是一個通用的例子,我讀過你的評論,事實上我不知道SwingWorker,在閱讀它的JavaDoc後,我認爲這絕對是一個更好的方法,謝謝! – BackSlash 2013-03-09 13:02:00

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 2013-03-09 13:42:48

相關問題