2015-08-28 93 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

看看更新 –