每次单击按钮时计时器都会提高速度

时间:2016-03-01 18:39:30

标签: java timer applet repaint

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

我不知道计时器发生了什么。我该如何解决?

在小程序中我使用此代码:

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

}

This is how it works, the animation sends packages from left to right

1 个答案:

答案 0 :(得分:2)

当你按下按钮时,你正在创建新的javax.swing.Timer并调用timer.start(),在这种情况下计划在按下按钮后运行50ms并重复每50ms。

当你第二次按下按钮时,你创建并启动另一个定时器(一个新的定时器),它每50ms再次工作,初始延迟为50ms。您现在基本上将重新调用的次数加倍。

第三次按下时,由于你有3个定时器在运行,所以重新调用的次数增加了三倍。

如果按下按钮的时间正确,则看起来速度已经增加了三倍(按下3个按钮)。

如果您不想要此行为,则可以阻止timer运行,如果它已经像这样运行:

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;

if ( timer != null ) return;

我只想告诉您TimerisRunning()方法。

您也可以通过调用timer方法停止timer.stop()