当前位置: 首页 > 知识库问答 >
问题:

摆动计时器没有停止

邢永安
2023-03-14

我正在用摇摆计时器打卡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;
    }


}

我只是用System.out.print来测试程序,它不是真正程序的一部分。我调用停止()方法,但计时器继续计数。此外,我通过displayTimer=newjavax.swing.Timer(10000,侦听器)创建了一个新的计时器;但它的计数速度是原来的两倍。有人能帮忙吗?

编辑:

这是我的计时器(有点像SSCCE):

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Scanner;

import javax.swing.*;

public class JavaApplication8 {
 public static void startTimer() {
    ActionListener listener = new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent event) {
            int seconds = 20;
            seconds--;
            System.out.println(seconds);

            if (seconds == -1 && seconds < 0) {
                System.out.print("zero");
            }
        }
    };
    Timer displayTimer = new Timer(1000, listener);
    displayTimer.setInitialDelay(100);
    displayTimer.start();
 }

public static void main(String[] args) {
    System.out.println("Type win to win!");

    startTimer();

    String read;
    Boolean right;
    int seconds;

    Scanner scanIn = new Scanner(System.in);
    read = scanIn.nextLine();

    if (read.equals("win")){
        right = true;
    }
    else{
        right = false;
    }

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

它不能正常工作,因为秒没有出现,但它确实显示了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();
    }
}

共有1个答案

华哲茂
2023-03-14

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

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

我希望这能有所帮助。

 类似资料:
  • 问题内容: 我正在尝试在ActionListener中停止计时器。以下是我正在尝试执行的代码。我打算停止在actionPerformed方法内满足特定条件时创建的计时器。timer.stop()不起作用,编译器不允许我这样做。 任何帮助。建议,建议将非常有帮助。 } 在此先感谢克里希南 问题答案: 也可能: 或者,使用事件对象获取源(并将其 强制转换为boo ): 或者,将计时器保留在实例变量中,

  • 问题内容: 有人可以教我如何使用a 来达到以下目的: 当我单击鼠标时,我需要一个开始动画的多边形(例如旋转等简单动画);当我再次单击时停止动画。 我对理解工作方式没有任何问题,但对于实际的动画来说,没有任何问题。我尝试在方法中用while块模拟动画,在该方法中我将绘制,擦除和重绘多边形(例如,模拟旋转),但是在while内,applet不会监听点击。它只会在片刻之后收听。单击鼠标时,我需要摆动计时

  • 问题内容: 我在游戏中使用了摇摆计时器,但是当游戏运行时,它似乎有平稳运行的时刻和减速的时刻。 为什么时间在波动? 我该如何解决? 这是我的代码示例。在我的实际程序中,我正在绘制图像,而不仅仅是矩形。还有很多碰撞检测和其他小的计算正在发生。 另外,这是游戏的Jar文件的链接,因此您可以运行它,(满是)明白我的意思。http://dl.dropbox.com/u/8724803/Get%20To%2

  • 我觉得摇摆计时器有问题。我写了一些运行良好的代码,然后将其全部移动到我的新计算机上,但它很快就无法工作。我用这个方法编写了一个GUI类(基于JFrame): 该方法是从另一个类调用的。真是太夸张了。splash guy是一个只运行splash动画的JPanel类。它通过摆动计时器来实现。在splash类中,侦听器通过以下代码调整我的帧的内容: 现在,如果第一个块中的print语句被注释掉,我的程序

  • 我在Swing和设置角色动画方面有一些问题,我有一个带有关键侦听器的JFrame,当用户点击时,它在这里调用我的JPanel方法 这个动画我的角色,但这么快,我们可以看到一个东西,我怎么才能看到动画?

  • 我是一个java新手,我正在使用netbean创建一个调度程序。我的软件将从用户那里获取时间和操作,并将这些数据输入到单独的数组列表中。然后我使用javax.swing.timer启动倒计时计时器。当用户完成输入数据并点击“运行”按钮时,计时器将从数组列表中的第一个元素中获取运行时间并开始倒计时。当倒计时时间达到0时,计时器将从数组列表中的下一个元素中获取倒计时时间,依此类推。 我的问题是,计时器