gpt4 book ai didi

java - 每次单击按钮时计时器都会加快速度

转载 作者:行者123 更新时间:2023-12-02 03:52:54 26 4
gpt4 key购买 nike

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

我不知道计时器发生了什么。我该如何修复它?

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

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

最佳答案

当您按下按钮时,您将创建新的 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;

if ( timer != null ) return;

我只是想向您展示 TimerisRunning() 方法。

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

关于java - 每次单击按钮时计时器都会加快速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35730800/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com