由於我最後一個問題,我已經使我的計時器程序更復雜,我跑到另一面牆上。 我似乎無法得到兩個定時器的顯示更新。他們打印使用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