Java 如何使用时间线设置按钮的动画?

Java 如何使用时间线设置按钮的动画?,java,javafx,Java,Javafx,我想制作一个按钮的动画。我想让它在点击后改变位置。我写了这样的代码,但它不起作用。在这种情况下,控制台中不会出现错误。按下按钮根本没有反应 double stopPosition = 100; KeyValue kk2 = new KeyValue(btn.layoutXProperty(), stopPosition, Interpolator.LINEAR); KeyFrame kk = new KeyFrame(Duration.millis(5000),kk2); Timeline ti

我想制作一个按钮的动画。我想让它在点击后改变位置。我写了这样的代码,但它不起作用。在这种情况下,控制台中不会出现错误。按下按钮根本没有反应

double stopPosition = 100;
KeyValue kk2 = new KeyValue(btn.layoutXProperty(), stopPosition, Interpolator.LINEAR);
KeyFrame kk = new KeyFrame(Duration.millis(5000),kk2);
Timeline timeline = new Timeline();
timeline.getKeyFrames().add(kk);
timeline.setCycleCount(1);

        btn.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {
                System.out.println("Hello World!");
                timeline.play();
            }
        });
双停位=100;
KeyValue kk2=新的KeyValue(btn.layoutXProperty(),stopPosition,Interpolator.LINEAR);
关键帧kk=新的关键帧(持续时间.millis(5000),kk2);
时间线=新时间线();
timeline.getKeyFrames().add(kk);
时间线。setCycleCount(1);
btn.setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent事件){
System.out.println(“你好,世界!”);
timeline.play();
}
});

我做错了什么?

我假设您将按钮放置在某个布局中,该布局负责定位。如果修改
layoutX
,这意味着在下一个布局过程中,父布局只需将
按钮
放回“它所属的位置”


如果要移动
按钮
,则应选择不同的布局作为父级,或使用
translateX
属性
translateX
相对于父布局放置按钮的位置(
layoutX
)移动按钮。

我假设您将按钮放置在负责定位的某个布局中。如果修改
layoutX
,这意味着在下一个布局过程中,父布局只需将
按钮
放回“它所属的位置”


如果要移动
按钮
,则应选择不同的布局作为父级,或使用
translateX
属性
translateX
按钮相对于父布局放置它的位置移动(
layoutX
)。

应该设置平移坐标动画,而不是布局坐标动画

double deltaPosition = 100; //translation gets added to your current layoutX
KeyValue kk2 = new KeyValue(btn.translateXProperty(), deltaPosition, Interpolator.LINEAR);
KeyFrame kk = new KeyFrame(Duration.millis(5000),kk2);
Timeline timeline = new Timeline();
timeline.getKeyFrames().add(kk);
timeline.setCycleCount(1);

btn.setOnAction(ae -> {
        System.out.println("Hello World!");
        timeline.play();
    }
);

布局值被布局窗格(如
HBox
AnchorPane
)覆盖,但不被
窗格
覆盖。或者,在按钮上设置
setManaged(false)
,以便父容器不会干扰其布局,但您必须自己完成所有布局。

您应该设置平移坐标动画,而不是布局坐标动画

double deltaPosition = 100; //translation gets added to your current layoutX
KeyValue kk2 = new KeyValue(btn.translateXProperty(), deltaPosition, Interpolator.LINEAR);
KeyFrame kk = new KeyFrame(Duration.millis(5000),kk2);
Timeline timeline = new Timeline();
timeline.getKeyFrames().add(kk);
timeline.setCycleCount(1);

btn.setOnAction(ae -> {
        System.out.println("Hello World!");
        timeline.play();
    }
);

布局值被布局窗格(如
HBox
AnchorPane
)覆盖,但不被
窗格
覆盖。或者,在按钮上设置
setManaged(false)
,这样父容器就不会干扰其布局,但您必须自己完成所有布局。

非常感谢您的澄清!我想现在我会成功的。非常感谢你的澄清!我想现在我会成功的。