为什么我的RotateTransition在第一次运行后会抛出错误?

时间:2018-06-17 19:48:42

标签: multithreading animation javafx

警告:这是我第一次使用线程和第一次尝试动画。请耐心等待。

我想旋转ImageView。我为它设置了一个帖子:

public class ThreadAnimation extends Thread
{
    private ImageView iv;
    private RotateTransition rt;

    public ThreadAnimation(ImageView iv)
    {
            this.iv = iv;
    }

    @Override
    public void run()
    {
        while (true)
        {
            RotateTransition r = new RotateTransition();
            r.setToAngle(360);
            r.setCycleCount(1);
            r.setDuration(Duration.millis(300));
            r.setNode(iv);
            r.play();

            try
            {
                sleep(100);
            } catch (InterruptedException e)
            {
                return;
            }
        }
    }

}

按下按钮后,我在控制器类中调用它。

animation.setOnAction(new EventHandler<ActionEvent>()
{
    @Override
    public void handle (ActionEvent abschicken)
    {
        ThreadAnimation thread = null;      //ANIMATION PIZZA
        if (thread == null)
        {
            thread = new ThreadAnimation(olivenview);
            thread.start();
        }
    }
});

我的ImageView olivenview 会像我想要的那样旋转。然而,它似乎停止需要相当长的时间(我可以看到它因为按钮触发它仍然看起来触发了一段时间)并且当我继续按下它第二次之后,我得到一个不间断的错误流与很多空指针异常。我很无能,任何人都可以帮助我吗?这是由于我的线程设置还是问题出在其他地方(代码中我没有在这里发布)?

1 个答案:

答案 0 :(得分:1)

我相信你不需要线程。请注意,.play()方法立即返回,动画将在后台运行。

话虽如此,试试这个。

...
//Create your rotation
final RotateTransition r = new RotateTransition();
r.setToAngle(360);
r.setCycleCount(1);
r.setDuration(Duration.millis(300));
r.setNode(iv);

//When the button is pressed play the rotation. Try experimenting with .playFromStart() instead of .play()
button.setOnAction(new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent action) {
        r.play();
    }
});

...

另一方面,我建议切换到java 8,以便您可以使用lambda表达式而不是匿名类!