Java 摆动计时器不停止

Java 摆动计时器不停止,java,swing,timer,Java,Swing,Timer,我正在使用swing计时器在Netbeans中创建倒计时时钟: public void startTimer() { System.out.println(right + "value"); ActionListener listener = new ActionListener() { @Override public void actionPerformed(ActionEvent event) { System.ou

我正在使用swing计时器在Netbeans中创建倒计时时钟:

public void startTimer() {

    System.out.println(right + "value");
    ActionListener listener = new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent event) {
            System.out.println("action");
            timerLabel.setText("" + seconds);
            --seconds;
            System.out.println(seconds);
            if (seconds == -1 && seconds < 0) {
                System.out.print("zero");
                //displayTimer.stop();
                wrong();
                dispose();
            }
        }
    };
    displayTimer = new Timer(1000, listener);
    displayTimer.setInitialDelay(100);
    displayTimer.start();

    if (right == null) {
        System.out.println("null");
    } else if (right == true) {
        System.out.println("truehere");
        displayTimer.stop();
        right = null;
        seconds = 20;
        displayTimer.setDelay(10000);
        displayTimer.setInitialDelay(100);
        displayTimer.start();
    } else if (right == false) {
        System.out.print("wrong");
        //displayTimer.stop();
        seconds = 20;
    }


}
它不工作的权利,因为秒不显示,但它确实显示了20次,这是我想要的。这只是在它自己的应用程序中,在我的实际程序中更容易看到问题

我注意到游戏第一次运行时效果很好。然后我再次点击play(重置整个游戏),它的速度是原来的两倍。也许我没有正确地重置某些内容?这是我的重置代码:

// Reset Everything
    PlayFrame.seconds = 20;
    PlayFrame.winnings = 0;
    PlayFrame.right = false;
    //PlayFrame.displayTimer.stop();
    PlayFrame.questionLabel.setText(null);
    PlayFrame.count = 0;
    WelcomeFrame WFrame = new WelcomeFrame();
    WFrame.setVisible(true);
    setVisible(false);                             
    PlayFrame P = new PlayFrame();
    P.dispose();

    if (PlayFrame.seconds == -1 && PlayFrame.seconds < 0){
        PlayFrame.displayTimer.stop();
    }
}
//重置所有内容
PlayFrame.seconds=20;
PlayFrame.winnings=0;
PlayFrame.right=false;
//PlayFrame.displayTimer.stop();
PlayFrame.questionLabel.setText(空);
PlayFrame.count=0;
WelcomeFrame WFrame=新的WelcomeFrame();
WFrame.setVisible(true);
setVisible(假);
PlayFrame P=新的PlayFrame();
P.处置();
如果(PlayFrame.seconds==-1&&PlayFrame.seconds<0){
PlayFrame.displayTimer.stop();
}
}

这只是一段伪代码,用来查看计时器是如何启动和停止的

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import javax.swing.Timer;

public class TimerOnJLabel extends JFrame {

    private static final long serialVersionUID = 1L;        
    long start = System.currentTimeMillis();
    long elapsedTimeMillis;
    int sec = 5;
    Timer timer;

    public TimerOnJLabel() {
        super("TooltipInSwing");
        setSize(400, 300);
        getContentPane().setLayout(new FlowLayout());
        final JLabel b1;
        final JRadioButton jrb = new JRadioButton();
        b1 = new JLabel("Simple tooltip 1");

        ActionListener timerTask = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                elapsedTimeMillis = System.currentTimeMillis();
                b1.setText("Timer : " + (elapsedTimeMillis-start)/1000+" ::::: " +sec);
                System.out.println("Timer working: " + sec);
                if(--sec == 0){
                    timer.stop();
                    System.out.println("Timer Stopped");
                }
            }
        };
        timer = new Timer(1000, timerTask);
        System.out.println("Timer Started");
        timer.start();

        getContentPane().add(b1);

        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);          
        setVisible(true);
    }

    public static void main(String args[]){
        new TimerOnJLabel();
    }
}

我希望这有帮助。

考虑发布一个。尝试删除这行
displayTimer.removeActionListener(listener)这没有任何意义,您的所有活动只使用一个计时器实例。@HoverCraftfullOfels我不能,我一直在尝试,但我不能t@CodeAddict我有一个伪代码。但是我不确定这对你是否有帮助。变量
right
应该做什么?答案中提供的信息是好的,+1表示这一点。无需添加一个
WindowListener
来关闭
JFrame
,只要编写
frameObject这样简单的东西。setDefaultCloseOperation(JFrame.DISPOSE\u ON\u close)
就可以帮你完成。@GagandeepBali你说得对。但所有发生的事情都在构造函数中,在该代码中我没有
frameObject
。此外,我只想演示如何启动和停止计时器,然后只需编写
setDefaultCloseOperation(JFrame.DISPOSE\u ON\u CLOSE)/setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
,您通过添加
WindowListener
:-)@GagandeepBali答案更新完成的操作。谢谢你提供的信息。我不怎么玩GUI,这就是为什么。
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import javax.swing.Timer;

public class TimerOnJLabel extends JFrame {

    private static final long serialVersionUID = 1L;        
    long start = System.currentTimeMillis();
    long elapsedTimeMillis;
    int sec = 5;
    Timer timer;

    public TimerOnJLabel() {
        super("TooltipInSwing");
        setSize(400, 300);
        getContentPane().setLayout(new FlowLayout());
        final JLabel b1;
        final JRadioButton jrb = new JRadioButton();
        b1 = new JLabel("Simple tooltip 1");

        ActionListener timerTask = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                elapsedTimeMillis = System.currentTimeMillis();
                b1.setText("Timer : " + (elapsedTimeMillis-start)/1000+" ::::: " +sec);
                System.out.println("Timer working: " + sec);
                if(--sec == 0){
                    timer.stop();
                    System.out.println("Timer Stopped");
                }
            }
        };
        timer = new Timer(1000, timerTask);
        System.out.println("Timer Started");
        timer.start();

        getContentPane().add(b1);

        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);          
        setVisible(true);
    }

    public static void main(String args[]){
        new TimerOnJLabel();
    }
}