当我点击开始按钮时,我的计时器正在创建一个带有不起作用按钮的新窗口。显示的更改仅发生在新窗口中,但启动/停止功能仅在旧窗口中起作用。我不确定这里发生了什么事。有人可以帮我弄清楚如何阻止它在按下开始时创建新窗口吗?
我正在处理三个类(class)。第一个运行计时器。
package timer;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Timer;
import java.awt.event.*;
public class TaskTimer extends TaskTimerWindow {
int seconds = 0;
int minutes = 0;
int hours = 0;
final int UNIT = 1000;
boolean stopped = false;
Timer timer;
public TaskTimer() {
ActionListener go = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
count();
}
};
timer = new Timer(UNIT, go);
timer.start();
}
public void resume() {
if(stopped) {
seconds = 0;
minutes = 0;
hours = 0;
}
}
public void end() {
timer.stop();
}
public void count() {
if(seconds < 59) {
seconds++;
} else if(minutes < 59) {
seconds = 0;
minutes++;
} else {
seconds = 0;
minutes = 0;
hours++;
}
changeDisplay(String.format("%02d", hours) + ":"
+ String.format("%02d", minutes) + ":"
+ String.format("%02d", seconds));
}
}
第二个创建并更新显示。
package timer;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class TaskTimerWindow extends JFrame {
JLabel timeDisplay;
JButton start, stop, pause;
public TaskTimerWindow() {
JPanel timerWindow = new JPanel();
JPanel buttonSpace = new JPanel();
timeDisplay = new JLabel("00:00:00");
timeDisplay.setHorizontalAlignment((int) CENTER_ALIGNMENT);
timeDisplay.setFont(new Font("Arial", Font.PLAIN, 48));
timeDisplay.setBackground(Color.WHITE);
timerWindow.add(timeDisplay);
start = new JButton("Start");
stop = new JButton("Stop");
pause = new JButton("Pause");
buttonSpace.add(start);
buttonSpace.add(stop);
buttonSpace.add(pause);
getContentPane().add(timerWindow, BorderLayout.NORTH);
getContentPane().add(buttonSpace);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
setLocationRelativeTo(null);
setTitle("Task Timer");
pack();
}
public JLabel getText() {
return timeDisplay;
}
public void changeDisplay(String time) {
getText().setText(time);
}
}
第三个是 Controller 。
package timer;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ControlTimer {
boolean stopped = false;
boolean paused = false;
TaskTimer timer;
public ControlTimer() {
TaskTimerWindow window = new TaskTimerWindow();
window.start.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
timer = new TaskTimer();
}
});
window.stop.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
stopped = true;
timer.end();
}
});
window.pause.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
paused = true;
}
});
}
}
最佳答案
所以主要问题出在您的 ControlTimer
类中。由于 TaskTimer
扩展了 TaskTimerWindow
,每次按下开始按钮时,它都会创建新窗口。您应该按如下方式修改它:
public class ControlTimer {
boolean stopped = false;
boolean paused = false;
TaskTimer timer;
public ControlTimer() {
timer = new TaskTimer();
timer.start.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
timer.resume();
timer.start();
}
});
timer.stop.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
timer.stopped = true;
timer.end();
}
});
timer.pause.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
timer.end();
}
});
}
}
此外,TaskTimer
类也有一些细微的变化(从构造函数中删除 timer.start()
并引入单独的 start()
方法相反:
public TaskTimer() {
ActionListener go = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
count();
}
};
timer = new Timer(UNIT, go);
}
public void start() {
timer.start();
}
关于java - 计时器在启动时创建一个新窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43150987/