显示场景时没有Javafx-2事件

时间:2012-11-30 11:46:26

标签: event-handling javafx-2

我似乎无法找到一种方法来注册场景或节点类的事件监听器,该场景或节点类将在显示该场景时调度。

我希望我的Scene类是自包含的,因此我可以使用构建器类来构造它们,并在显示它们时触发它们的任何动画。例如,我希望能够在我的Application类中执行以下操作...

public void start(Stage primaryStage) {
    primaryStage.setScene(AnimatedLoginSceneBuilder.create()
        .width(1024)
        .height(768)
        .frameRate(25)
        .build();
    )
    primaryStage.show();
}

我的AnimatedLoginSceneBuilder类创建一个场景和一个动画,它绑定到场景中的某些节点。我只能使用构建方法返回场景(不是动画类)。例如,它看起来像这样......

public class AnimatedLoginSceneBuilder implements Builder<Scene> {
    // private members such as width, height and framerate
    // methods to set width, height and framerate (e.g. width(double width))

    public Scene build() {
        DoubleProperty x = new SimpleDoubleProperty();
        Text node = TextNodeBuilder...
        node.xProperty().bind(x);
        final Timeline animation = TimelineBuilder... // animate x
        return SceneBuilder.create()
           . // create my scene using builders (bar the node above)
           .build();
    }
}

但是我没办法播放动画,所以我想要一些像...这样的钩子。

public class AnimatedLoginSceneBuilder ... {
    ...
    public Scene build() {
        ... 
        final Timeline animation = TimelineBuilder... // animate x
        return SceneBuilder.create()
            . // create scene declaratively
            .onShow(new EventHandler<SomeEvent>() {
                @Overide public void handleSomeEvent() {
                    animation.play();
                }
            .build()
    }

然后当显示场景时,它将自动播放。要问太多了?

一种替代方法是让构建器类返回包含在对象中的场景和动画,并执行类似的操作......

public void start(Stage primaryStage) {
    WrapperObj loginSceneWrapper = AnimatedLoginSceneBuilder.create()
       .width(1024)
       .height(768)
       .frameRate(25)
       .build();

    primaryStage.setScene(wrapperObj.getScene());
    primaryStage.show();
    wrapperObj.getAnimation().play();

但这不是我想要的,因为我希望能够从现有场景中改变到新场景,并且不做任何假设。例如,我希望能够让场景中的事件处理程序能够让舞台转换到新场景,因此,我只想调用primaryStage.setScene(新场景)我想去)。

有什么想法吗?

我见过的最接近的是How to listen for WindowEvent.WINDOW_SHOWN in the nodes of the scene graph?,但这不适合这种情况。

1 个答案:

答案 0 :(得分:1)

显示javafx.​stage.Window时会触发“显示”事件。您可以使用window.setOnShowing()window.setOnShown()为适当的事件设置侦听器。场景是场景图的容器,没有关于显示/隐藏的逻辑。

我建议存储场景的动画根节点(从父节点或其子类扩展)而不是场景。并将监听器添加到根更改的事件,如

stage.getScene().rootProperty().addListener(new ChangeListener<MyAnimatedParent>() {
     @Override
     public void changed(ObservableValue<? extends MyAnimatedParent> observable, MyAnimatedParent oldValue, MyAnimatedParent newValue) {
         newValue.animate();
     }
 });