我想在每次单击按钮时在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
答案 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;
我只想告诉您Timer
有isRunning()
方法。
您也可以通过调用timer
方法停止timer.stop()
。