我想为按钮设置动画。我要使其单击后更改其位置。我写了这样的代码,但是不起作用。在这种情况下,控制台中不会出现任何错误。该按钮根本不响应按下。
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();
}
});
我在做什么错了?
答案 0 :(得分:2)
我假设您将按钮放置在某种布局中,以便进行定位。如果您修改layoutX
,则意味着在下一次布局传递期间,Button
会被父布局简单地放回其“所属位置”。
如果要移动Button
,则应选择其他布局作为父布局或使用translateX
属性。 translateX
相对于父版式放置Button
的位置移动layoutX
。
答案 1 :(得分:1)
您应该设置平移坐标的动画,而不是布局坐标的动画。
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
之类的布局窗格覆盖,但不会被Group
或Pane
覆盖。或者,在按钮上设置setManaged(false)
,以便父容器不会干扰其布局,但是您必须自己进行所有布局。