javafx如何在弹出窗口上添加动画

时间:2015-04-30 03:05:25

标签: animation javafx popup

我想在弹出窗口上添加一个翻译过渡,但它失败了。因为TranslateTransition的参数是Node,弹出窗口是一个窗口。

`javafx.animation.FadeTransition.FadeTransition(Duration duration, Node node)`

如何在弹出窗口中添加翻译过渡?

1 个答案:

答案 0 :(得分:3)

有一种方法可以通过yProperty()移动弹出窗口。您可以使用时间轴来设置此属性,而不是翻译过渡。但由于这是一个只读属性,我们必须在转换中使用DoubleProperty,并将其绑定到Popup.setY()

对于此示例,我将使用ContextMenu作为弹出控件,并从窗口顶部创建一个翻译动画到用户点击的位置。

我们需要弹出尺寸和位置,为此我们需要显示它。这意味着它将被显示,并立即移动到窗口的顶部。

yProperty()中的监听器允许我们在转换过程中插入的所有不同位置设置弹出窗口的位置。

@Override
public void start(Stage primaryStage) {

    ContextMenu cm =  new ContextMenu(new MenuItem("Item 1"), new MenuItem("Item 2"));

    StackPane root = new StackPane();

    Scene scene = new Scene(root, 300, 250);

    scene.setOnContextMenuRequested(event -> {
        cm.show(root,event.getScreenX(),event.getScreenY());

        double yIni=scene.getWindow().getY();
        double yEnd=cm.getY();
        cm.setY(yIni);

        final DoubleProperty yProperty = new SimpleDoubleProperty(yIni);
        yProperty.addListener((ob,n,n1)->cm.setY(n1.doubleValue()));

        Timeline timeIn = new Timeline();
        timeIn.getKeyFrames().add(
            new KeyFrame(Duration.seconds(0.5),
                 new KeyValue(yProperty, yEnd, Interpolator.EASE_BOTH)));
        timeIn.play();

    });

    primaryStage.setTitle("Moving Popup");
    primaryStage.setScene(scene);
    primaryStage.show();        
}