2015-08-28 86 views
1

我正在建立一個電子郵件客戶端,我有一些問題,我想在一個jTextArea中「追加」一個「發送+電子郵件」,一切都很好,代碼正在工作。 然而,只丟棄「已發送郵件+」 for循環結束後..在一個循環內設置文本

代碼:

for (int i = 0; i < to.length; i++) { 
     int count = i; 

     if (!emailValidator.validate(to[i].toString().trim())) { 
      System.out.print("Invalid Email ID++"); 
      jTextAreaStatus.append("Invalid Email:\t" + to[i] + "\n"); 
      jLabelFail.setText("| F: " + String.valueOf(i + 1)); 
     } else { 

      new SendMail().StartSend(smtpHostName, smtpUserName, smtpPassword, fromEmail, fromName, 
        to[i], body, subject, smtpPort, smtpSSL, smtpAuth); 

      // show the sending count 
      jTextAreaStatus.append("Sent:\t" + to[i] + "\n"); 
      jLabelCount.setText("S: " + (i + 1) + "/" + String.valueOf(to.length)); 

      if (isCanceled) { 
       break; 
      } 

     } 
    } 

我到底做錯了什麼?

謝謝!

PS:我使用鞦韆作爲gui。

+1

我想有一個類似的問題,你應該看看這裏: http://stackoverflow.com/questions/2710712/output-to-jtextarea-in-realtime – Agricola

回答

2

如果此循環在主線程上運行,則只有在該過程完成後纔會刷新UI。如果您將此進程放入單獨的線程中,則應在此過程中刷新UI。否則,應該有一個命令在您可以在循環的每次迭代過程中調用的過程中刷新UI。

[更新]爲了回答您的評論,這是如何在Java中啓動一個線程:

public static void main(String[] args) { 
    Thread thead = new Thread(new myRunner()); 
    thread.start(); 
} 



public class myRunner implements Runnable { 

     @Override 
     public void run() { 
     // Do this in the background -- your for loop goes here 
     } 

} 

在這個例子中,我開始一個新的線程,並在後臺運行它。 Thread接受Runnable類的實現,並將在後臺執行run方法。

線程啓動後,您的主要方法將繼續執行。如果您想在繼續之前等待線程完成,您可以在thread.start();之後使用thread.join();,並且調用線程將在此時等待線程完成,然後再繼續。

如果您想了解更多關於線程使用線程時,我建議你看看http://docs.oracle.com/javase/tutorial/essential/concurrency/

只是要小心,線程可以創造更多的問題他們,他們都值得,因爲你需要開始做你的應用程序線程安全:http://docs.oracle.com/javase/tutorial/essential/concurrency/

祝你好運!

+0

謝謝!那就是我所缺少的 –

+0

看看更新 –