0

首先你好!这是我在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”时也有效(我也不明白。)。

Java Swing 计时器文档

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);
    }
}
4

1 回答 1

3

发生这种情况是因为您每次按下按钮时都会ActionListener添加一个。Timer因此,由于 aTimer允许多个侦听器,因此每个人都会在计时器滴答时收到通知。

要解决这些问题,您可以在Timer每次按下开始按钮 ( timer = new Timer()) 时实例化一个新的。JFrame或者在您的构造函数中只添加一次 ActionListener 。甚至删除侦听器(但您应该在某处保存对它的引用)。

于 2013-09-18T23:11:42.913 回答