首先你好!这是我在stackoverflow上的第一篇文章!这是我第二次尝试用 Java 编程,也是第一次尝试使用 gui。
我实际上有2个问题。第一个是程序,第二个是理解部分代码。
程序应该如何工作:
按下开始时,它每分钟从 01:00 倒计时到 00:00(01:00 -> 00:59 -> 00:58)。当您按下停止时,它会停止倒计时(duh),当您再次按下开始时,它会像第一次一样从 01:00 开始。
程序问题:
照这样说。这仅在我第一次按开始时有效。当我多次按下开始时,它会从时钟中减去该次数。按 2 次 (01:00 -> 00:58 -> 00:56)。按 4 次 (01:00 -> 00:56 -> 00:52)。等等......这显然不应该发生。
理解问题:
我很难理解为什么计时器需要一个 ActionListener 以及为什么它在您使用“null”时起作用。在某些情况下,它在使用“this”时也有效(我也不明白。)。
import java.awt.*;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class CountdownClock extends JFrame
{
private int oneSecond = 1000; //Milliseconds
private Timer timer = new Timer(oneSecond * 60, null);
private int timerCount = 59;
public static void main(String args[])
{
new CountdownClock();
}
CountdownClock()
{
this.getContentPane().setLayout(null);
this.setBounds(800, 450, 300, 125);
final JLabel countdownLabel = new JLabel("01:00");
countdownLabel.setBounds(110, 10, 125, 30);
countdownLabel.setFont(new Font("Serif", Font.PLAIN, 30));
JButton startButton = new JButton("Start");
startButton.setBounds(10, 50, 125, 30);
startButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
timer.setRepeats(true);
timer.stop();
countdownLabel.setText("01:00");
timerCount = 59;
timer.start();
timer.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
if (timerCount == 0)
{
timer.stop();
countdownLabel.setText("00:00");
timerCount = 59;
}
else if (timerCount <= 9)
{
countdownLabel.setText("00:0" + String.valueOf(timerCount));
timerCount = timerCount - 1;
}
else
{
countdownLabel.setText("00:" + String.valueOf(timerCount));
timerCount = timerCount - 1;
}
}
});
}
});
JButton stopButton = new JButton("Stop");
stopButton.setBounds(150, 50, 125, 30);
stopButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
timer.stop();
countdownLabel.setText("01:00");
timerCount = 59;
}
});
add(countdownLabel);
add(startButton);
add(stopButton);
setVisible(true);
}
}