Saya tahu itu bukan jawaban yang Anda inginkan, tetapi IMO solusi yang diusulkan tidak baik (dan cara Anda sendiri adalah). Mengapa? Karena mereka bergantung pada status aplikasi. Di JavaFX, kontrol, pemandangan, dan panggung tidak bergantung satu sama lain. Artinya, kontrol bisa hidup tanpa ditambahkan ke adegan dan adegan bisa ada tanpa terikat ke panggung. Dan kemudian, pada saat t1, kontrol dapat dilampirkan ke sebuah adegan dan pada saat t2, adegan itu dapat ditambahkan ke sebuah panggung (dan itu menjelaskan mengapa mereka merupakan properti yang dapat diamati satu sama lain).
Jadi, pendekatan yang menyarankan untuk mendapatkan referensi pengontrol dan memanggil metode, meneruskan tahapan ke sana akan menambahkan status ke aplikasi Anda. Ini berarti Anda perlu menjalankan metode itu pada saat yang tepat, tepat setelah tahapan dibuat. Dengan kata lain, Anda harus mengikuti perintah sekarang: 1- Buat dekor 2- Lewati dekor yang dibuat ini ke pengontrol melalui sebuah metode.
Anda tidak dapat (atau tidak seharusnya) mengubah urutan ini dalam pendekatan ini. Jadi Anda kehilangan kewarganegaraan. Dan dalam perangkat lunak, secara umum, negara itu jahat. Idealnya, metode tidak memerlukan urutan panggilan apa pun.
Jadi apa solusi yang tepat? Ada dua alternatif:
1- Pendekatan Anda, dalam properti pengontrol mendengarkan untuk mendapatkan panggung. Saya pikir ini adalah pendekatan yang tepat. Seperti ini:
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- Anda melakukan apa yang perlu Anda lakukan di mana Anda membuat Stage
(dan bukan itu yang Anda inginkan):
Stage stage = new Stage();
stage.maximizedProperty().addListener((a, b, c) -> {
if (c) {
System.out.println("I am maximized!");
}
});
stage.setScene(someScene);
...