我不知道为什么我的代码中的计时器使动画复制其repaint()位置

时间:2014-01-19 16:15:22

标签: java swing timer action

我在applet中使用swing计时器来制作动画。 我在理解时间真正有效方面遇到了问题。

我想出了这段代码(这只是其中的一小部分):

Action actionListener2 = new AbstractAction() {

            public void actionPerformed(ActionEvent actionEvent) {
                timer = new Timer(500,this); 
                timer.start();
                System.out.println("S");
                p.moveSquare(p.SnakeHeadX,p.SnakeHeadY+p.SnakeHeadH);
                p.eatBlueSquare(p.SnakeHeadX,p.SnakeHeadY);

            }
        };

2 个答案:

答案 0 :(得分:3)

不,不要在ActionListener中创建一个新的Timer,因为它会重复创建许多定时器。而只需在Timer的ActionListener中移动你的方块并调用repaint()。你读过Swing Timer教程吗?如果没有,我恳请你谷歌并试一试。

答案 1 :(得分:2)

  

Swing计时器(javax.swing.Timer的一个实例(在API参考文档中))在指定的延迟后触发一个或多个动作事件。不要将Swing计时器与版本1.3中添加到java.util包中的通用计时器工具混淆

     

计时器基本上是一个java线程,它在延迟之后立即启动并执行分配的任务。

如上所述,你应该从动作执行函数中移动你的Timer。

  Timer timer = new Timer(1000, new ActionListener() {
                public void actionPerformed(ActionEvent e) 
                {
                     System.out.println("S");
                     p.moveSquare(p.SnakeHeadX,p.SnakeHeadY+p.SnakeHeadH);
                     p.eatBlueSquare(p.SnakeHeadX,p.SnakeHeadY);
                }
            });
    timer.start();

了解更多细节 http://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html