由于我最后一个问题,我已经使我的计时器程序更复杂,我跑到另一面墙上。 我似乎无法得到两个定时器的显示更新。他们打印使用println很好,但如果我使用静态变量,它会给出正确的值,但只有在计时器中,这是有道理的。所以,无论我做什么,我似乎无法弄清楚如何获得活动计时器更新时,它应该和应该更新时间计时器。以下是我的代码的相关部分。计时器问题 - 更新显示器
您可以提供有关如何在计时器增量时更新显示屏的指导吗?
这个类是计时器的功能:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Timer;
public class TaskTimer {
private int seconds = 0;
private int minutes = 0;
private int hours = 0;
private final int UNIT = 1000;
private Timer timer;
private String name;
public TaskTimer(String name) {
ActionListener go = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(count());
}
};
timer = new Timer(UNIT, go);
}
public void begin() {
if(ControlTimer.isStopped()) {
seconds = 0;
minutes = 0;
hours = 0;
}
timer.start();
}
public void end() {
timer.stop();
}
public String count() {
if(seconds < 59) {
seconds++;
} else if(minutes < 59) {
seconds = 0;
minutes++;
} else {
seconds = 0;
minutes = 0;
hours++;
}
return (String.format("%02d", hours) + ":"
+ String.format("%02d", minutes) + ":"
+ String.format("%02d", seconds));
}
public int getSeconds() {
return seconds;
}
public void setSeconds(int s) {
seconds = s;
}
public int getMinutes() {
return minutes;
}
public void setMinutes(int m) {
minutes = m;
}
public int getHours() {
return hours;
}
public void setHours(int h) {
hours = h;
}
}
这一个创建面板进入窗口:
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.border.EtchedBorder;
public class TaskTimerPanel extends JPanel{
String panelName;
private static String timerValue;
private JLabel timeDisplay;
JLabel title;
TaskTimer taskTimer;
public TaskTimerPanel(String panelName) {
// Get timer
taskTimer = new TaskTimer(panelName);
// Setup Panel
JPanel p = new JPanel();
p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));
// Add Title Label
this.panelName = panelName;
title = new JLabel(panelName);
p.add(title);
// Add Timer Display
timerValue = "00:00:00";
timeDisplay = new JLabel(timerValue);
p.add(timeDisplay);
// Add Formatting
title.setAlignmentX(Component.CENTER_ALIGNMENT);
timeDisplay.setAlignmentX(CENTER_ALIGNMENT);
timeDisplay.setOpaque(true);
title.setBorder(new EmptyBorder(10, 10, 10, 10));
timeDisplay.setBorder(BorderFactory.createCompoundBorder(new EtchedBorder(),
new EmptyBorder(10, 10, 10, 10)));
timeDisplay.setBackground(Color.WHITE);
Font font = new Font("Arial", Font.PLAIN, 48);
title.setFont(font);
timeDisplay.setFont(font);
p.setBorder(BorderFactory.createCompoundBorder(new EtchedBorder(),
new EmptyBorder(10, 10, 10, 10)));
// Add to JFrame
add(p);
}
public JLabel getText() {
return timeDisplay;
}
public void changeDisplay(String time) {
getText().setText(time);
}
}
而且控制器:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ControlTimer {
private static boolean stopped = true;
private TaskTimerWindow t;
public static boolean isStopped() {
return stopped;
}
public void activeTime() {
t.activeTimer.taskTimer.begin();
t.breakTimer.taskTimer.end();
stopped = false;
}
public void breakTime() {
if(!stopped) {
t.activeTimer.taskTimer.end();
t.breakTimer.taskTimer.begin();
}
}
public void reset() {
if(!stopped) {
stopped = true;
t.activeTimer.taskTimer.end();
t.breakTimer.taskTimer.end();
}
}
public ControlTimer() {
t = new TaskTimerWindow();
t.buttons.start.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
activeTime();
}
});
t.buttons.stop.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
reset();
}
});
t.buttons.pause.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
breakTime();
}
});
}
public static void main(String[] args) {
ControlTimer t = new ControlTimer();
}
}
我我忽略了窗口设置和按钮类,因为我不认为它们对于这个问题很重要。
请编辑的问题将其限制为具有足够细节的特定问题以确定适当的答案。此外,尽可能限制代码量。谢谢。 –
嗯,我不确定问题出在哪里,所以我展示了我认为可能相关的内容。此外,它非常简单。定时器不会更新GUI。这应该从我的问题中清楚。 – Kendra
好吧,你已经把它稍微向后一点,而不是将TaskTimerWindow的引用传递给Timer,设置一个观察者模式,允许观察者注册感兴趣的东西在技术上发生变化时得到通知,这意味着您只需要一个Timer ,因为它会触发tick事件。允许观察者确定当计时器滴答时应该发生什么 – MadProgrammer