Tôi biết đó không phải là câu trả lời bạn muốn, nhưng IMO các giải pháp được đề xuất không tốt (và theo cách của riêng bạn). Tại sao? Bởi vì chúng phụ thuộc vào trạng thái ứng dụng. Trong JavaFX, một điều khiển, một cảnh và một giai đoạn không phụ thuộc vào nhau. Điều này có nghĩa là một điều khiển có thể tồn tại mà không cần thêm vào một cảnh và một cảnh có thể tồn tại mà không cần gắn vào một màn. Và sau đó, tại thời điểm tức thời t1, điều khiển có thể được gắn vào một cảnh và tại thời điểm t2, cảnh đó có thể được thêm vào một màn (và điều đó giải thích tại sao chúng là các thuộc tính có thể quan sát được của nhau).
Vì vậy, cách tiếp cận đề xuất nhận tham chiếu bộ điều khiển và gọi một phương thức, chuyển giai đoạn cho nó sẽ thêm một trạng thái vào ứng dụng của bạn. Điều này có nghĩa là bạn cần gọi phương thức đó vào đúng thời điểm, ngay sau khi giai đoạn được tạo. Nói cách khác, bạn cần làm theo thứ tự ngay bây giờ: 1- Tạo giai đoạn 2- Chuyển giai đoạn đã tạo này cho bộ điều khiển thông qua một phương thức.
Bạn không thể (hoặc không nên) thay đổi thứ tự này trong cách tiếp cận này. Vì vậy, bạn đã mất vô quốc tịch. Và trong phần mềm, nói chung, trạng thái là xấu. Tốt nhất, các phương thức không nên yêu cầu bất kỳ lệnh gọi nào.
Vậy đâu là giải pháp phù hợp? Có hai lựa chọn thay thế:
1- Cách tiếp cận của bạn, trong thuộc tính lắng nghe bộ điều khiển để có được giai đoạn. Tôi nghĩ đây là cách tiếp cận đúng đắn. Như thế này:
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- Bạn làm những gì bạn cần làm ở nơi bạn tạo Stage
(và đó không phải là những gì bạn muốn):
Stage stage = new Stage();
stage.maximizedProperty().addListener((a, b, c) -> {
if (c) {
System.out.println("I am maximized!");
}
});
stage.setScene(someScene);
...