【问题标题】:set text while being inside a loop在循环内设置文本
【发布时间】:2015-08-28 12:48:02
【问题描述】:

我正在构建一个电子邮件客户端,但我遇到了一些问题,我想在 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。

【问题讨论】:

标签: java swing


【解决方案1】:

如果此循环在主线程上运行,则 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 方法。

一旦线程启动,您的 main 方法将继续执行。如果您想在继续之前等待线程完成,您可以在thread.start(); 之后使用thread.join();,调用线程将在此时等待线程完成,然后再继续。

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

在使用线程时要小心,线程会产生更多问题,因为你需要开始让你的应用程序线程安全:http://docs.oracle.com/javase/tutorial/essential/concurrency/

祝你好运!

【讨论】:

  • 谢谢!这就是我所缺少的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-25
  • 2017-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-01
  • 2011-06-07
相关资源
最近更新 更多