2个线程和2个JTextArea

时间:2014-01-12 18:16:43

标签: java multithreading swing

我需要编写程序,显示2个不同JTextArea中的线程给出的时间。时间每隔一段时间更新一次。此外,线程可以通过按钮停止,并通过再次叮当来恢复。我在其他课程中都有GUI。

我的问题: 如何在其他类中添加对JTextArea的引用? 如何使用按钮停止线程和恢复?

此处来自Thread Class的代码:

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import javax.swing.JTextArea;

public class MyThread implements Runnable {
    StopResume main = new StopResume();
    String name;
    Thread t;
    JTextArea a;

    String date;
    DateFormat to = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
    Date today = Calendar.getInstance().getTime(); 

    public MyThread(String threatName) {
        name = threatName;
        t = new Thread(this, name);
        t.start();
    }

    public static void main(String[] args) {
        //area1.append(date);
        //area2.append(date);
        //date = to.format(today);
    }


    @Override
    public void run() {
        try {
        for(int i = 0; i < 20; i++){
            t.sleep(1000);

            } 
        }catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

1 个答案:

答案 0 :(得分:1)

您的问题和我对答案的尝试:

  

我的问题:如何在其他类中添加对JTextArea的引用?

我建议你不要像一般情况那样,一个对象不应该直接操纵另一个对象的字段。而是让您的线程持有对GUI的引用,并让它调用接受String的GUI的公共方法,并且GUI将附加到JTextArea。此外,确保仅在Swing事件线程或EDT 上调用此方法。这可以通过调用SwingUtilities.invokeLater(yourRunnable)将Runnable排队到EDT来完成。或者更好 - 使用SwingWorker。有关详情,请阅读Concurrency in Swing Tutorial

  

如何使用按钮停止线程并恢复?

为控件类(ActionListener类)提供对线程的引用,并在ActionListener中调用停止或恢复线程while循环的公共方法(可能通过更改布尔变量)。


补充说明:

  • 我发现Thread.sleep(...)延迟时间没有随机性。您是否需要为MyThread类提供一个Random对象并使用它来更改Thread.sleep(...)次?
  • 我看到你正在使用for循环而不是while循环 - 你确定你应该这样做吗?
  • 我没有看到你的线程类有任何暂停其循环的机制。同样,一个可以检查和更改其布尔条件的while循环可能会更好 - 取决于你。
  • 您的线程类创建自己的StopResume对象副本。如果这是您的主GUI,那么您就是在为自己设置麻烦。您应该通过此线程类的构造函数传递对显示的 GUI的有效引用。