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

标签 java graphics repaint japplet thread-sleep

我在使用用于创建轮盘赌轮的代码时遇到了问题。目标是当我单击“旋转!”时旋转轮盘。按钮。我通过创建一个 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/

相关文章:

java - JScrollPane 总是清除我的面板

java - 使用多线程的二进制搜索

java - 如何让我的图像出现在随机位置?

Android - ClipDrawable、ScaleDrawable,它是如何工作的?

javascript - 可下载图形 - SVG 与 Canvas 元素?

java - 随着时间的推移定期调用重新绘制

java - 重新绘制没有做任何事情

java - 删除 POST 主体 Retrofit 中的可选参数

java - 在 Java 中实现素数查找算法的最佳方法是什么?我们如何创建库类然后在 Java 中使用?

graphics - 3D 云查看器?