在循环中设置文本

时间:2015-08-28 12:48:02

标签: java swing

我正在建立一个电子邮件客户端,我有一些问题,我想在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使用swing。

1 个答案:

答案 0 :(得分: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并在后台运行它。 Thread接受Runnable类的实现,并在后台执行run方法。

线程启动后,您的main方法将继续执行。如果要在继续之前等待线程完成,可以在thread.join();之后使用thread.start();,并且调用线程将在该点等待线程完成,然后继续。

如果您想了解有关线程的更多信息,我建议您查看http://docs.oracle.com/javase/tutorial/essential/concurrency/

使用线程时要小心,线程可以创建更多问题,因为你需要开始使应用程序线程安全:http://docs.oracle.com/javase/tutorial/essential/concurrency/

祝你好运!