अनुशंसित दृष्टिकोण
यह उत्तर एफएक्सएमएल नियंत्रकों के लिए मापदंडों को पारित करने के लिए विभिन्न तंत्रों की गणना करता है।
छोटे अनुप्रयोगों के लिए मैं अत्यधिक कॉल करने वाले से नियंत्रक तक सीधे मापदंडों को पारित करने की सलाह देता हूं - यह सरल, सीधा है और इसके लिए कोई अतिरिक्त रूपरेखा की आवश्यकता नहीं है।
यदि आप अपने आवेदन के भीतर निर्भरता इंजेक्शन या इवेंट बस तंत्र का उपयोग करना चाहते हैं, तो बड़े, अधिक जटिल अनुप्रयोगों के लिए, यह सार्थक जांच होगी ।
पास करने वाले पैरामीटर को सीधे कॉल करने वाले से नियंत्रक के पास भेज दिया जाता है
कस्टम डेटा को FXML लोडर उदाहरण से कंट्रोलर को पुनः प्राप्त करके और आवश्यक डेटा मानों के साथ इसे आरंभ करने के लिए कंट्रोलर पर एक विधि को कॉल करके एक FXML कंट्रोलर को पास करें।
निम्नलिखित कोड की तरह कुछ:
public Stage showCustomerDialog(Customer customer) {
FXMLLoader loader = new FXMLLoader(
getClass().getResource(
"customerDialog.fxml"
)
);
Stage stage = new Stage(StageStyle.DECORATED);
stage.setScene(
new Scene(
(Pane) loader.load()
)
);
CustomerDialogController controller =
loader.<CustomerDialogController>getController();
controller.initData(customer);
stage.show();
return stage;
}
...
class CustomerDialogController {
@FXML private Label customerName;
void initialize() {}
void initData(Customer customer) {
customerName.setText(customer.getName());
}
}
नमूना कोड में दिखाए गए अनुसार एक नया FXMLLoader का निर्माण किया जाता है new FXMLLoader(location)
। स्थान एक URL है और आप FXML संसाधन से ऐसा URL उत्पन्न कर सकते हैं:
new FXMLLoader(getClass().getResource("sample.fxml"));
FXMLLoader पर स्थिर लोड फ़ंक्शन का उपयोग करने के लिए सावधान रहें, या आप अपने लोडर उदाहरण से अपने नियंत्रक को प्राप्त करने में सक्षम नहीं होंगे।
FXMLLoader उदाहरण खुद को डोमेन ऑब्जेक्ट्स के बारे में कभी नहीं जानते हैं। आप सीधे FXMLLoader कंस्ट्रक्टर में एप्लिकेशन विशिष्ट डोमेन ऑब्जेक्ट पास नहीं करते हैं, इसके बजाय आप:
- एक निर्दिष्ट स्थान पर fxml मार्कअप पर आधारित एक FXMLLoader का निर्माण करें
- FXMLLoader उदाहरण से एक नियंत्रक प्राप्त करें।
- डोमेन ऑब्जेक्ट के संदर्भ के साथ नियंत्रक प्रदान करने के लिए पुनर्प्राप्त नियंत्रक पर तरीकों को लागू करें।
यह ब्लॉग (एक अन्य लेखक द्वारा) एक वैकल्पिक, लेकिन समान, उदाहरण प्रदान करता है ।
FXMLLoader पर एक नियंत्रक सेट करना
CustomerDialogController dialogController =
new CustomerDialogController(param1, param2);
FXMLLoader loader = new FXMLLoader(
getClass().getResource(
"customerDialog.fxml"
)
);
loader.setController(dialogController);
Pane mainPane = (Pane) loader.load();
आप कोड में एक नया नियंत्रक का निर्माण कर सकते हैं, जो आप अपने कॉलर से नियंत्रक पैरामीटर में चाहते हैं किसी भी पैरामीटर को पारित करना। एक बार जब आप एक नियंत्रक का निर्माण कर लेते हैं, तो आप आवृत्ति विधि लागू करने से पहले इसे एक FXMLLoader उदाहरण पर सेट कर सकते हैं ।load()
लोडर पर एक नियंत्रक सेट करने के लिए (JavaFX 2.x में) आप fx:controller
अपने fxml फ़ाइल में एक विशेषता को भी परिभाषित नहीं कर सकते ।
fx:controller
एफएक्सएमएल में परिभाषा पर सीमा के कारण , मैं व्यक्तिगत रूप से एफएक्सएमएलएलडियर से नियंत्रक प्राप्त करने के बजाय एफएक्सएमएलएलडियर से नियंत्रक प्राप्त करना पसंद करता हूं।
एक बाहरी स्टेटिक विधि से नियंत्रक को पुनः प्राप्त करना
इस विधि को सर्जेई द्वारा Javafx 2.0 के लिए कैसे-कैसे Application.getParameters () के लिए एक Controller.java फ़ाइल में जवाब दिया गया है ।
डिपेंडेंसी इंजेक्शन का प्रयोग करें
FXMLLoader आपको एक कस्टम कंट्रोलर फ़ैक्टरी को FXMLLoader पर सेट करने की अनुमति देकर गुइसे, स्प्रिंग या जावा EE CDI जैसी निर्भरता इंजेक्शन सिस्टम का समर्थन करता है। यह एक कॉलबैक प्रदान करता है जिसका उपयोग आप संबंधित निर्भरता इंजेक्शन प्रणाली द्वारा इंजेक्ट किए गए निर्भर मूल्यों के साथ नियंत्रक उदाहरण बनाने के लिए कर सकते हैं।
वसंत के साथ जावाएफ़एक्स एप्लिकेशन और नियंत्रक निर्भरता इंजेक्शन का एक उदाहरण निम्नलिखित में दिया गया है:
एक वास्तव में अच्छा, स्वच्छ निर्भरता इंजेक्शन दृष्टिकोण एक नमूना एयर-हैक्स एप्लिकेशन के साथ afterburner.fx फ्रेमवर्क द्वारा इसका उपयोग करने की छूट है। afterburner.fx निर्भरता इंजेक्शन करने के लिए JEE6 javax.inject पर निर्भर करता है ।
एक इवेंट बस का उपयोग करें
ग्रेग ब्राउन, मूल एफएक्सएमएल विनिर्देश निर्माता और कार्यान्वयनकर्ता, अक्सर एफएक्सएमएल इंस्टेंटिएटेड नियंत्रकों और अन्य एप्लिकेशन लॉजिक के बीच संचार के लिए एक इवेंट बस जैसे कि अमरूद इवेंटबस के उपयोग पर विचार करने का सुझाव देते हैं ।
ईवेंटबस एनोटेशन के साथ एक सरल लेकिन शक्तिशाली प्रकाशन / सदस्यता एपीआई है जो पीओजेओ को एक दूसरे के साथ संदर्भित किए बिना जेवीएम में कहीं भी एक दूसरे के साथ संवाद करने की अनुमति देता है।
अनुवर्ती प्रश्नोत्तर
पहली विधि पर, आप स्टेज क्यों लौटाते हैं? विधि शून्य भी हो सकती है क्योंकि आप पहले से ही कमांड शो () दे रहे हैं; वापसी के चरण से पहले ;। आप स्टेज को वापस करके उपयोग की योजना कैसे बनाते हैं
यह एक समस्या का एक कार्यात्मक समाधान है। showCustomerDialog
फ़ंक्शन से एक चरण लौटाया जाता है ताकि इसका एक संदर्भ एक बाहरी वर्ग द्वारा संग्रहीत किया जा सके जो कुछ करने की इच्छा कर सकता है, जैसे कि बाद में मुख्य विंडो में एक बटन क्लिक पर आधारित चरण को छिपाएं। एक वैकल्पिक, ऑब्जेक्ट-ओरिएंटेड समाधान एक CustomerDialog ऑब्जेक्ट के अंदर कार्यक्षमता और स्टेज रेफ़रेंस को इनकैप कर सकता है या कस्टमरडायलॉग रेंज स्टेज कर सकता है। एफएक्सएमएल, नियंत्रक और मॉडल डेटा को घेरने वाले कस्टम संवाद के लिए ऑब्जेक्ट-ओरिएंटेड इंटरफ़ेस के लिए एक पूर्ण उदाहरण इस उत्तर के दायरे से परे है, लेकिन किसी को भी बनाने के लिए इच्छुक ब्लॉग पोस्ट बना सकता है।
@Dzim नाम के StackOverflow उपयोगकर्ता द्वारा आपूर्ति की गई अतिरिक्त जानकारी
स्प्रिंग बूट डिपेंडेंसी इंजेक्शन के लिए उदाहरण
इसे "द स्प्रिंग बूट वे" कैसे किया जाए, इस सवाल पर JavaFX 2 के बारे में चर्चा हुई, जिसे मैंने संलग्न पर्मलिंक में शामिल किया। स्प्रिंग बूट v1.3.3 पर मार्च 2016 में दृष्टिकोण अभी भी मान्य है और परीक्षण किया गया है। कृपया ध्यान दें:
https://stackoverflow.com/a/36310391/1281217
कभी-कभी, आप कॉलर को वापस परिणाम देना चाहते हैं, जिस स्थिति में आप संबंधित प्रश्न का उत्तर देख सकते हैं: