我已经尝试了两天找到解决方案,但仍然不知道该怎么办。
情况如下:我有一个可运行的类,其中 Calendar 类型的变量通过无限循环随时间增加一些(源 1中有一个简化模型)。接下来我有一个 GUI,我在其中开始新线程(源 2)。
当变量“时间”发生变化时,我想进行一些数学运算并更改我的 GUI 上的一些标签。
据我了解,我应该创建 PropertyChangeListener ,这是一个我有问题的地方:我真的不明白该怎么做。我做了以下事情:将我的 TimeLoop 类更新为Source 3。我创建了Source 4上列出的侦听器(也简化了)。问题来了:我应该如何以及在哪里初始化监听器?或者我哪里错了?感谢您的回答。
PS我唯一的想法是(Source 5),这当然行不通。
源 1(我的可运行类的示例):
public class TimeLoop implements Runnable {
private Calendar time = Calendar.getInstance();
@Override
public void run() {
try {
time.set(1997, 11, 27, 00, 00, 00);
while (true) {
time.add(time.HOUR, 1);
Thread.sleep(1000);
}
} catch (InterruptedException ex) {
System.out.println("Interrupted error");
}
}
}
源 2(来自我的 GUI 类的源):
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new GUI().setVisible(true);
}
});
Thread trTime = new Thread(new TimeLoop());
trTime.setName("TimeLoop");
trTime.start();
}
源 3(编辑的可运行类):
public class TimeLoop implements Runnable {
private Calendar time = Calendar.getInstance();
private PropertyChangeSupport support = new PropertyChangeSupport(this);
public void updateTime() {
Calendar oldValue = time;
time.add(time.HOUR, 1);
Calendar newValue = time;
support.firePropertyChange("time", oldValue, newValue);
}
public void addListener(PropertyChangeListener listener) {
support.addPropertyChangeListener(listener);
}
@Override
public void run() {
try {
while (true) {
time.set(1997, 11, 27, 00, 00, 00);
updateTime();
Thread.sleep(1000);
}
} catch (InterruptedException ex) {
System.out.println("Interrupted error");
}
}
}
源 4(听众):
public class TimeListener implements PropertyChangeListener {
@Override
public void propertyChange(PropertyChangeEvent pce) {
System.out.println(pce.getPropertyName() + " has new value);
}
}
来源 5(错误代码):
public static void main(String args[]) {
Thread trTime = new Thread(new TimeLoop());
trTime.setName("TimeLoop");
trTime.start();
TimeLoop tLoop = new TimeLoop();
TimeListener tTistener = new TimeListener();
tLoop.addListener(tTistener);
}