我正在建立一个电子邮件客户端,我有一些问题,我想在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。答案 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/
祝你好运!