ฉันรู้ว่ามันไม่ใช่คำตอบที่คุณต้องการ แต่ 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);
...