Java 保持计时器事件间隔相等

Java 保持计时器事件间隔相等,java,swing,timer,consistency,Java,Swing,Timer,Consistency,我正在尝试在我正在开发的游戏中制作动画。动画的工作原理是将按钮大小设置为非常小,然后将其逐渐增大到正常大小。我有它的工作,除了我有时间问题 有时按钮几乎会立即变长,有时会变慢。我正在寻找介于两者之间的东西,我需要它总是以这样的大小生长,而不是有时快有时慢 我查过了,发现了这个伪代码: distance_for_dt = speed * delta_time new_position = old_position + distance_for_dt 不幸的是,我不明白所说的是什么,我不知道如何将

我正在尝试在我正在开发的游戏中制作动画。动画的工作原理是将按钮大小设置为非常小,然后将其逐渐增大到正常大小。我有它的工作,除了我有时间问题

有时按钮几乎会立即变长,有时会变慢。我正在寻找介于两者之间的东西,我需要它总是以这样的大小生长,而不是有时快有时慢

我查过了,发现了这个伪代码:

distance_for_dt = speed * delta_time
new_position = old_position + distance_for_dt
不幸的是,我不明白所说的是什么,我不知道如何将其应用到我的代码中。有人能帮上忙吗,或者解释一下上面的伪代码是怎么说的

这是我的计时器代码,
timer
在上面已经定义为一个
timer
,z[]只是一对坐标:

timer = new Timer(18, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                Dimension dim = button[z[0]][z[1]].getSize();
                if (dim.getHeight() < 79.9) {
                    button[z[0]][z[1]].setSize((int) (dim.getWidth() + 6), (int) (dim.getHeight() + 6));
                } else {
                    button[z[0]][z[1]].setSize(80, 80);
                    timer.stop();
                }
            }
        });
        timer.start();
timer=新定时器(18,新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
维度尺寸=按钮[z[0]][z[1]].getSize();
if(dim.getHeight()<79.9){
按钮[z[0]][z[1]].setSize((int)(dim.getWidth()+6),(int)(dim.getHeight()+6));
}否则{
按钮[z[0]][z[1]]。设置大小(80,80);
timer.stop();
}
}
});
timer.start();

根据您在Swing应用程序上调用的更新数量,它可能会“备份”并变慢。例如,如果希望在没有计时器的情况下完成动画,可以执行以下操作:

// example method to do animation
public void animateButton(final int wait){
    Thread thread = new Thread(){
        public void run(){
            // some loop structure to define how long to run animation
            Dimension dim = button[z[0]][z[1]].getSize();
            while (dim.getHeight() < 79.9){
                SwingUtilities.invokeLater(new Runnable(){
                        //update Swing components here
                    });
                    try{ Thread.Sleep(wait); }
                    catch(Exception e){}
                }
            }
        }
    }
    thread.start();
}
//制作动画的示例方法
公共无效动画按钮(最终整数等待){
线程线程=新线程(){
公开募捐{
//一些循环结构用于定义动画的运行时间
维度尺寸=按钮[z[0]][z[1]].getSize();
while(dim.getHeight()<79.9){
SwingUtilities.invokeLater(新的Runnable(){
//在此处更新Swing组件
});
试试{Thread.Sleep(wait);}
捕获(例外e){}
}
}
}
}
thread.start();
}

我认为这可能类似于计时器更新GUI的方式,因为计时器在单独的线程上运行。我将研究是否需要在
计时器中使用
invokeLater(newrunnable)
来正确安排任务。我必须这样做,才能让我正在进行的项目在长期任务中保持响应。如果您确实需要确保速度,并且可能需要删除更新以调整系统延迟,那么您需要使用方法调用,例如
system.currentTimeMillis()
system.nanoTime()
,计算动画的完成程度与经过的时间。然后,根据动画的每一步进行相应调整。

有时按钮几乎会立即变大,有时会变慢。
-我从未注意到这种行为。下面是一个例子,这个版本的效果比我的版本要小得多,但我认为这是因为我的应用程序在后台有更多的东西在进行。请确保你在adionperformed方法“这里是一个例子”的末尾要求重新绘制。。建议您发布SSCCE,而不是不可编译的代码段。