나는 그것이 당신이 원하는 대답이 아니라는 것을 알고 있지만 IMO에서 제안 된 해결책은 좋지 않습니다. 왜? 애플리케이션 상태에 따라 달라지기 때문입니다. JavaFX에서 컨트롤, 장면 및 스테이지는 서로 의존하지 않습니다. 즉, 컨트롤은 장면에 추가하지 않고도 살 수 있으며 장면은 무대에 연결하지 않고도 존재할 수 있습니다. 그런 다음 순간 t1에서 제어가 장면에 연결될 수 있고 순간 t2에서 해당 장면이 무대에 추가 될 수 있습니다.
따라서 컨트롤러 참조를 가져오고 메서드를 호출하고 스테이지를 전달하여 애플리케이션에 상태를 추가하는 방법을 제안합니다. 즉, 스테이지가 생성 된 직후 적절한 순간에 해당 메서드를 호출해야합니다. 즉, 지금 주문을 따라야합니다. 1- 단계 생성 2- 생성 된 단계를 메서드를 통해 컨트롤러에 전달합니다.
이 접근 방식에서는이 순서를 변경할 수 없거나 변경해서는 안됩니다. 그래서 무국적 상태를 잃었습니다. 그리고 소프트웨어에서 일반적으로 상태는 악합니다. 이상적으로 메서드는 호출 순서를 요구하지 않아야합니다.
그렇다면 올바른 솔루션은 무엇입니까? 두 가지 대안이 있습니다.
1- 당신의 접근 방식, 컨트롤러 청취 속성에서 무대를 얻습니다. 이것이 올바른 접근 방식이라고 생각합니다. 이렇게 :
pane.sceneProperty().addListener((observableScene, oldScene, newScene) -> {
if (oldScene == null && newScene != null) {
newScene.windowProperty().addListener((observableWindow, oldWindow, newWindow) -> {
if (oldWindow == null && newWindow != null) {
((Stage) newWindow).maximizedProperty().addListener((a, b, c) -> {
if (c) {
System.out.println("I am maximized!");
}
});
}
});
}
});
2- 당신은 당신이 만드는 곳에서 당신이해야 할 일을합니다 Stage
(그리고 그것은 당신이 원하는 것이 아닙니다).
Stage stage = new Stage();
stage.maximizedProperty().addListener((a, b, c) -> {
if (c) {
System.out.println("I am maximized!");
}
});
stage.setScene(someScene);
...