Java 每当我点击一个按钮时,定时器就会加快速度

Java 每当我点击一个按钮时,定时器就会加快速度,java,timer,applet,repaint,Java,Timer,Applet,Repaint,我想在每次单击按钮时在小程序中执行动画。我第一次点击按钮时,一切正常。但是第二次,动画的速度增加了。第三次动画的速度增加了一点,第四次、第五次 我不知道计时器怎么了。我怎样才能修好它 在小程序中,我使用以下代码: JButton btnIniciar = new JButton("Iniciar"); btnIniciar.addActionListener(new ActionListener() { public void actionPerformed(Action

我想在每次单击按钮时在小程序中执行动画。我第一次点击按钮时,一切正常。但是第二次,动画的速度增加了。第三次动画的速度增加了一点,第四次、第五次

我不知道计时器怎么了。我怎样才能修好它

在小程序中,我使用以下代码:

JButton btnIniciar = new JButton("Iniciar");
    btnIniciar.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {     
            Timer timer = new Timer(50, new ActionListener(){
                public void actionPerformed(ActionEvent e) {
                    //I have a list of packages to animate
                    for (Package p: listaPaquetes){
                        p.animate();
                        panel.repaint();
                    }                             
                }
            });

            timer.start();
        }
这是面板中重新喷漆的代码:

protected void paintComponent(Graphics g) {
    super.paintComponent(g);     
    //I use the same list of the applet   
    for (Package p: listaPaquetes){
        //Paint the package
        p.paintPackage(g);
    }

}

当您按下按钮时,您正在创建新的
javax.swing.Timer
并调用
Timer.start()
,在这种情况下,该计时器计划在按下按钮后运行50毫秒,并每50毫秒重复一次

当您第二次按下按钮时,您创建并启动另一个计时器(一个新的计时器),该计时器每50毫秒重新工作一次,初始延迟为50毫秒。现在,重新绘制调用的数量实际上增加了一倍

第三次按下时,重新绘制调用的次数增加了三倍,因为有3个计时器正在运行

如果您的按钮按下时间正确,它将看起来好像速度增加了三倍(3个按钮按下)

如果您不希望出现这种行为,您可以阻止
计时器运行,如果它已经像这样运行:

private Timer timer = null;

// ...

JButton btnIniciar = new JButton("Iniciar");
btnIniciar.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent arg0) { 
        // prevent the timer from running again if it is already running
        if ( timer != null && timer.isRunning() ) return;

        timer = new Timer(50, new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                //I have a list of packages to animate
                for (Package p: listaPaquetes){
                    p.animate();
                    panel.repaint();
                }                             
            }
        });

        timer.start();
    }
请注意,您需要将
timer
设置为实例变量。您还可以替换该行:

if ( timer != null && timer.isRunning() ) return;

我只是想向您展示
Timer
具有
isRunning()
方法


您还可以通过调用
timer.stop()
方法来停止
计时器。

当您按下按钮时,您正在创建新的
javax.swing.timer
并调用
timer.start()
,在这种情况下,该方法计划在按下按钮后运行50毫秒,并每50毫秒重复一次

当您第二次按下按钮时,您创建并启动另一个计时器(一个新的计时器),该计时器每50毫秒重新工作一次,初始延迟为50毫秒。现在,重新绘制调用的数量实际上增加了一倍

第三次按下时,重新绘制调用的次数增加了三倍,因为有3个计时器正在运行

如果您的按钮按下时间正确,它将看起来好像速度增加了三倍(3个按钮按下)

如果您不希望出现这种行为,您可以阻止
计时器运行,如果它已经像这样运行:

private Timer timer = null;

// ...

JButton btnIniciar = new JButton("Iniciar");
btnIniciar.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent arg0) { 
        // prevent the timer from running again if it is already running
        if ( timer != null && timer.isRunning() ) return;

        timer = new Timer(50, new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                //I have a list of packages to animate
                for (Package p: listaPaquetes){
                    p.animate();
                    panel.repaint();
                }                             
            }
        });

        timer.start();
    }
请注意,您需要将
timer
设置为实例变量。您还可以替换该行:

if ( timer != null && timer.isRunning() ) return;

我只是想向您展示
Timer
具有
isRunning()
方法


您还可以通过调用
timer.stop()
方法来停止
计时器。我不知道把计时器停在哪里,所以每次我按下按钮,我也会停止计时器,除了第一次。我不知道把计时器停在哪里,所以每次我按下按钮,我也会停止计时器,除了第一次。