程序倒计时2而不是1,我看不到任何逻辑错误

时间:2016-11-06 17:04:41

标签: java timer

我最近学会了如何使用计时器java类,并创建了一个使用计时器倒计时的程序,并使用标签显示此倒计时。我的问题是该程序倒计时为2而不是1。

package test;

import java.awt.*;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.Timer;
import static javax.swing.UIManager.get;

public class Test extends JFrame implements ActionListener{

    //Declare Global Variable
    int timerValGlobal = 25;

    //Define components to add
    JButton startTimer = new JButton("Start Timer");
    JButton exitButton = new JButton("Exit");
    JLabel time = new JLabel();
    Timer timer = new Timer(1000, this);


    //Define panels
    JPanel pane = new JPanel();
    JPanel exitPane = new JPanel();



    public Test(){
        setExtendedState(JFrame.MAXIMIZED_BOTH);
        setUndecorated(true);
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        //Add buttons to panels
        pane.add(startTimer);
        pane.add(time);
        exitPane.add(exitButton);

        //Add panels to form;
        add(pane, BorderLayout.NORTH);
        add(exitPane, BorderLayout.SOUTH);

        //Add ActionListeners to Buttons
        startTimer.addActionListener(this);
        exitButton.addActionListener(this);
        timer.addActionListener(this);


    }



    public static void main(String[] args) {
        Test t = new Test();
    }


    public void actionPerformed(ActionEvent evt){
        Object source = evt.getSource();
        if(source == exitButton){
            System.exit(0);
        }

        else if(source == startTimer){
                timer.start();
        }

        else if (source == timer){
            time.setText(String.valueOf(timerValGlobal));
            timerValGlobal = timerValGlobal - 1;

            if(timerValGlobal == 0){
                timer.stop();
                timerValGlobal = 25;
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

这肯定是难以察觉的错误! (至少对我来说:D)

当你创建计时器时,你做到了,对吧?

Timer timer = new Timer(1000, this);

为什么在这段代码中写下this这个词?您说this应该用作计时器的动作侦听器,以便每秒都调用该类中的一个方法。正确?

现在,这里出错了。在构造函数中,再次将this设置为动作侦听器!

public Test(){
    setExtendedState(JFrame.MAXIMIZED_BOTH);
    setUndecorated(true);
    setVisible(true);
    setDefaultCloseOperation(EXIT_ON_CLOSE);

    //Add buttons to panels
    pane.add(startTimer);
    pane.add(time);
    exitPane.add(exitButton);

    //Add panels to form;
    add(pane, BorderLayout.NORTH);
    add(exitPane, BorderLayout.SOUTH);

    //Add ActionListeners to Buttons
    startTimer.addActionListener(this);
    exitButton.addActionListener(this);
    // LOOK! THIS LINE!
    // VVVVVVVVVVVVVVV
    timer.addActionListener(this);
}

你甚至写了一些评论,说下面的代码块用于向 按钮添加动作监听器

由于两个相同的动作侦听器,actionPerformed方法每秒调用两次,因此输出!

只需删除添加第二个动作侦听器的行!

旁注,您应该在事件队列中创建框架,如下所示:

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            new Test();
        }
    });
}

或者,在Java 8中:

public static void main(String[] args) {
    EventQueue.invokeLater(Test::new);
}