2012-11-30 4 views
2

장면이 표시 될 때 전달되는 장면 또는 노드 클래스의 이벤트 수신기를 등록하는 방법을 찾지 못하는 것 같습니다.장면이 표시 될 때 Javafx-2 이벤트가 표시되지 않습니다.

내 Scene 클래스를 독립적으로 만들어서 빌더 클래스를 사용하여 애니메이션을 구성하고 애니메이션을 표시 할 수 있습니다. 예를 들어, 나는

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

내 AnimatedLoginSceneBuilder 클래스는 장면과 장면에서 일부 노드에 결합하는 애니메이션을 만듭니다 ... 내 응용 프로그램 클래스에 다음과 같은 일을 할 수 있도록하고 싶습니다. 그러나 빌드 방법으로 장면을 반환 할 수는 있습니다 (애니메이션 클래스 아님). 예를 들어

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 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 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?이지만이 경우에는 작동하지 않습니다.

답변

0

javafx.​stage.Window이 표시되면 "표시 중"이벤트가 발생합니다. 적절한 이벤트에 대한 리스너는 window.setOnShowing()window.setOnShown()으로 설정할 수 있습니다. 장면은 장면 그래프의 컨테이너이며 표시/숨기기에 대한 논리가 없습니다.

장면 대신 장면의 애니메이션 루트 노드 (상위 또는 하위 클래스에서 확장)를 저장하는 것이 좋습니다. 루트 변경 이벤트에 리스너를 추가하십시오.

+0

감사합니다.이 라인을 따라 할 수있는 일이 있는지 확인해 드리겠습니다. 내가 본 문제 중 일부는 ... – kelceyp

+0

@kelceyp 또한 사용자 정의 장면에 대해 stage.sceneProperty(). addListener() 및 트리거 애니메이션을 사용할 수도 있습니다. –

+0

감사합니다. 나는 잠시 동안 그 공격의 라인을 시도했다. AnimatedScene이라는 장면의 하위 클래스를 만들고 sceneProperty 수신기에서 instanceof animatedscene을 확인했습니다. 내가 발견 한 문제는 내가 scenebuilder를 사용하지 못하게했다는 것입니다. 결국 빌더 클래스에서 애니메이션을 반환하도록했습니다. 즉 LoginSceneBuilder builder = create() .setProperties ... primaryStage.setScene (builder.build()); builder.getAnimation(). play(); – kelceyp

관련 문제