मुझे पता है कि यह वह उत्तर नहीं है जो आप चाहते हैं, लेकिन IMO प्रस्तावित समाधान अच्छे नहीं हैं (और आपका अपना तरीका है)। क्यों? क्योंकि वे आवेदन की स्थिति पर निर्भर करते हैं। जावाएफएक्स में, एक नियंत्रण, एक दृश्य और एक मंच एक दूसरे पर निर्भर नहीं करता है। इसका मतलब है कि एक नियंत्रण एक दृश्य में जोड़े बिना रह सकता है और एक दृश्य एक मंच से जुड़े बिना हो सकता है। और फिर, एक समय में तत्काल 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);
...