Eu sei que não é a resposta que você quer, mas IMO as soluções propostas não são boas (e o seu próprio jeito é). Por quê? Porque dependem do estado do aplicativo. No JavaFX, um controle, uma cena e um palco não dependem um do outro. Isso significa que um controle pode viver sem ser adicionado a uma cena e uma cena pode existir sem ser anexada a um palco. E então, em um instante t1, o controle pode ser anexado a uma cena e no instante t2, essa cena pode ser adicionada a um palco (e isso explica por que são propriedades observáveis uma da outra).
Portanto, a abordagem que sugere obter a referência do controlador e invocar um método, passando o estágio para ele, adiciona um estado à sua aplicação. Isso significa que você precisa invocar esse método no momento certo, logo após a criação do estágio. Em outras palavras, você precisa seguir uma ordem agora: 1- Crie a etapa 2- Passe esta etapa criada para o controlador por meio de um método.
Você não pode (ou não deve) alterar esta ordem nesta abordagem. Então você perdeu a apatridia. E em software, geralmente, o estado é mau. Idealmente, os métodos não devem exigir nenhuma ordem de chamada.
Então, qual é a solução certa? Existem duas alternativas:
1- Sua abordagem, nas propriedades de escuta do controlador para entrar no palco. Acho que essa é a abordagem certa. Como isso:
pane.sceneProperty().addListener((observableScene, oldScene, newScene) -> {
if (oldScene == null && newScene != null) {
// scene is set for the first time. Now its the time to listen stage changes.
newScene.windowProperty().addListener((observableWindow, oldWindow, newWindow) -> {
if (oldWindow == null && newWindow != null) {
// stage is set. now is the right time to do whatever we need to the stage in the controller.
((Stage) newWindow).maximizedProperty().addListener((a, b, c) -> {
if (c) {
System.out.println("I am maximized!");
}
});
}
});
}
});
2- Você faz o que precisa onde cria o Stage
(e não é isso que você quer):
Stage stage = new Stage();
stage.maximizedProperty().addListener((a, b, c) -> {
if (c) {
System.out.println("I am maximized!");
}
});
stage.setScene(someScene);
...