gpt4 book ai didi

java - 在 ActionListener 中使用 Thread.sleep() 的简单动画

转载 作者:行者123 更新时间:2023-11-30 08:23:06 24 4
gpt4 key购买 nike

我在使用这段代码创建轮盘赌时遇到了问题。目标是当我点击“旋转!”时旋转轮子。按钮。我通过创建一个 for 循环来完成此操作,该循环应将轮子的状态从 true 更改为 false,从而改变方向。如果做得足够快,应该会产生运动的错觉。

我遇到的问题:尽管我放置了 repaint(),但我的轮子仅在整个 for 循环完成后才重新绘制。所以,它只旋转一个刻度。

这是我的 ActionListener 的一些示例代码:

public class spinListener implements ActionListener
{
RouletteWheel wheel;
int countEnd = (int)(Math.random()+25*2);
public spinListener(RouletteWheel w)
{
wheel = w;
}
public void actionPerformed(ActionEvent e)
{
for (int i = 0; i <countEnd; i++)
{
try
{
Thread.sleep(100);
if (wheel.getStatus() == true)
{
wheel.setStatus(false);
repaint();
}
if (wheel.getStatus() == false)
{
wheel.setStatus(true);
repaint();
}
}
catch (InterruptedException ex)
{
Logger.getLogger(WheelBuilder.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}

更新:我发现了问题所在。以下是我为遇到类似问题的任何人所做的更改。

public class spinListener implements ActionListener
{
Timer tm = new Timer(100, this);
int count = 0;

public void actionPerformed(ActionEvent e)
{
tm.start();
changeWheel();
}
public void changeWheel()
{
int countEnd = (int)(Math.random()+20*2);
if (count < countEnd)
{
wheel.setStatus(!wheel.getStatus());
repaint();
count++;
}
}
}

最佳答案

Swing 是一个单线程环境,任何阻塞事件调度线程的东西都会阻止它处理新事件,包括绘制事件。

actionPerformed 方法中使用 Thread.sleep 会阻塞 EDT,阻止它处理新事件,包括绘制事件,直到 actionPerformed 方法退出。

您应该改用 javax.swing.Timer

看看Concurrency in SwingHow to Use Swing Timers了解更多详情

关于java - 在 ActionListener 中使用 Thread.sleep() 的简单动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23924373/

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