当我点击开始按钮时,javax.swing.timer减去的量就相当于我点击开始按钮时减去的量

当我点击开始按钮时,javax.swing.timer减去的量就相当于我点击开始按钮时减去的量,java,swing,button,timer,javax.swing.timer,Java,Swing,Button,Timer,Javax.swing.timer,首先,你好!这是我关于stackoverflow的第一篇文章!这是我第二次尝试用Java编程,也是第一次尝试使用gui 我实际上有两个问题。第一个是程序,第二个是理解部分代码 程序应如何运行: 按开始键时,它每分钟从01:00倒计时到00:00(01:00->00:59->00:58)。当你按下停止键时,它会停止倒计时(duh),当你再次按下开始键时,它会像第一次一样从01:00开始 程序问题: 尽管如此。这只在我第一次按start时起作用。当我多次按“开始”时,它会从时钟中减去该次数。按2次(

首先,你好!这是我关于stackoverflow的第一篇文章!这是我第二次尝试用Java编程,也是第一次尝试使用gui

我实际上有两个问题。第一个是程序,第二个是理解部分代码

程序应如何运行:

按开始键时,它每分钟从01:00倒计时到00:00(01:00->00:59->00:58)。当你按下停止键时,它会停止倒计时(duh),当你再次按下开始键时,它会像第一次一样从01:00开始

程序问题:

尽管如此。这只在我第一次按start时起作用。当我多次按“开始”时,它会从时钟中减去该次数。按2次(01:00->00:58->00:56)。按4次(01:00->00:56->00:52)。等这显然不应该发生

理解问题:

我很难理解为什么计时器需要一个ActionListener,以及为什么使用“null”时它可以工作。在某些情况下,它在使用“this”(我也不理解)时也起作用

import java.awt.*;
导入javax.swing.*;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
公共类倒计时时钟扩展JFrame
{
private int oneSecond=1000;//毫秒
专用定时器=新定时器(1秒*60,空);
专用int timerCount=59;
公共静态void main(字符串参数[])
{
新的倒计时时钟();
}
倒计时钟
{
this.getContentPane().setLayout(null);
这个.挫折(800450300125);
最终JLabel倒计时标签=新JLabel(“01:00”);
倒计时标签。后退(110,10,125,30);
setFont(新字体(“衬线”,Font.PLAIN,30));
JButton startButton=新JButton(“开始”);
开始按钮。后退(10,50,125,30);
addActionListener(新ActionListener())
{
已执行的公共无效操作(操作事件e)
{
timer.setRepeats(真);
timer.stop();
倒计时标签.setText(“01:00”);
时间计数=59;
timer.start();
timer.addActionListener(新ActionListener()
{
已执行的公共无效操作(操作事件evt)
{     
if(timerCount==0)
{
timer.stop();
倒计时标签.setText(“00:00”);
时间计数=59;
}

else if(timerCount之所以会发生这种情况,是因为每次按下按钮时都要向
计时器添加
ActionListener
。因此,由于
计时器允许多个侦听器,因此当计时器滴答作响时,每个侦听器都会收到通知


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

之所以会发生这种情况,是因为每次按下按钮时,您都会向
计时器添加一个
ActionListener
。因此,由于
计时器允许多个侦听器,因此当计时器滴答作响时,每个侦听器都会收到通知


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

Edit:谢谢!我明白为什么现在要这么做了!我在第五次阅读你的答案时顿悟了,现在我明白我的问题是多么愚蠢和简单。早就应该用AddActionListener中的“Add”来解决它!+1,@BinaryCode64,如果这个答案有助于解决你的问题,你应该
接受这个答案。Edit:Thanks!我明白为什么现在要这么做了!我在第五次阅读你的答案时顿悟了,现在我明白我的问题是多么愚蠢和简单。早就应该用AddActionListener中的“Add”来解决它!+1,@BinaryCode64,如果这个答案有助于解决你的问题,你应该
接受
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);
    }
}