我似乎找不到一种方法来注册场景或节点类的事件侦听器,当该场景显示时会被调度。
我希望我的 Scene 类是独立的,因此我可以使用构建器类来构建它们,并在显示它们时触发它们的任何动画。例如,我希望能够在我的应用程序类中执行以下操作...
public void start(Stage primaryStage) {
primaryStage.setScene(AnimatedLoginSceneBuilder.create()
.width(1024)
.height(768)
.frameRate(25)
.build();
)
primaryStage.show();
}
我的 AnimatedLoginSceneBuilder 类创建了一个场景和一个动画,它绑定到场景中的一些节点。但是,我只能使用 build 方法返回场景(而不是动画类)。例如,它看起来像这样......
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(new scene我想去)。
有任何想法吗?
我见过的最接近的是如何在场景图的节点中监听 WindowEvent.WINDOW_SHOWN?但这不适用于这种情况。