我需要编写程序,显示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();
}
}
}
答案 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(...)
次?