2013-10-13 13 views
17

मैं कुछ ब्लॉग और अन्य स्टैक ओवरफ्लो प्रश्न देख रहा हूं, और मुझे अपने प्रश्न का सीधा जवाब नहीं दिख रहा है। मैं एक javafx gui क्लाइंट बना रहा हूं और मैं अपने मेन्यूबार को एक fxml में एक नियंत्रक होना चाहता हूं और फिर मैं सामग्री क्षेत्र को अतिरिक्त fxml फ़ाइलों के लिए चाहता हूं। लॉगिन स्क्रीन एक एफएक्सएमएल होगी, लॉगिन स्क्रीन के बाद एप्लिकेशन की मुख्य सामग्री होगी और यह एक एफएक्सएमएल में होगी। मैं यह कार्य कैसे करूं?विभिन्न fxml फ़ाइलों के साथ एकाधिक javafx नियंत्रकों को कैसे बनाएँ?

मैं सिर्फ उसी फ़ाइल में अपने लॉगिन, मेनूबार और मुख्य सामग्री के लिए अपना पूरा कोड नहीं चाहता हूं। यह मैं क्या पर काम कर रहा हूँ की एक छवि है:

enter image description here

+3

कुछ [नमूना कोड] (https://gist.github.com/jewelsea/6460130) में से कुछ से अवधारणाओं का उपयोग कर सवाल जवाब देता है। – jewelsea

+0

यहां एक और उदाहरण: [लिंक] (http://stackoverflow.com/questions/19435384/how-to-bind-controls-across-two-fxml-from-the-main-controller) – Dil

उत्तर

24

उपयोग FXML रूप fx रूप में एक कस्टम जावा वर्ग का उपयोग करके घटकों: जड़ और के रूप में fx: अपने FXML फ़ाइल के नियंत्रक: http://docs.oracle.com/javafx/2/fxml_get_started/custom_control.htm

ऐसा करने के लिए, आप अपने कस्टम जावा वर्ग FXMLLoader के निर्माता में कॉल करने की आवश्यकता जो आपके एफएक्सएमएल लोड करेगा। लाभ FXML लोड घटकों को बदलने का तरीका है।

नेस्टेड नियंत्रकों के साथ FXMLLoader के माध्यम से घटकों को instanciate करने का क्लासिक तरीका है: FXML पहले, प्रत्येक भाग के लिए नियंत्रक।

इस तकनीक के साथ यह है: नियंत्रक पहले, फिर प्रत्येक घटक के लिए FXML। और आप सीधे FXML में FXML लोड नहीं करेंगे, आप FXML में अपनी कस्टम जावा कक्षाएं आयात करेंगे।

यह एक बेहतर अमूर्त है (यह जानने की आवश्यकता नहीं है कि जब आप उन्हें FXML में आयात करते हैं तो एक घटक लागू किया जाता है) और कोड का पुन: उपयोग करने में सहायता करता है क्योंकि यह FXML समर्थन के साथ एक कस्टम विजेट को कार्यान्वित करने जैसा है। अपने घटक को पुन: प्रयोज्य बनाने के लिए, सुनिश्चित करें कि आपके कार्यान्वयन में अन्य भागों के साथ तंग युग्मन नहीं है, या ऐसा करने के लिए आईओसी का उपयोग करें (उदाहरण के लिए, जावाएफएक्स के साथ वसंत एकीकरण के साथ)। इस तरह, आप बिना किसी चिंता के अपने आवेदन के किसी भी हिस्से (जैसे डेट इनपुट विजेट) में अपना घटक आयात करने में सक्षम होंगे और आप कोड डुप्लिकेट नहीं करेंगे।

अपने मामले में आप होगा:

public class MenuBox extends VBox { 

@FXML 
private LoginBox loginBox; 

@FXML 
private ProfilesBox profilesBox; 

public MenuBox() { 
    FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("menu.fxml")); 
    fxmlLoader.setRoot(this); 
    fxmlLoader.setController(this); 
    try { 
     fxmlLoader.load(); 
    } catch (IOException exception) { 
     throw new RuntimeException(exception); 
    } 
} 

public class LoginBox extends VBox { 
public LoginBox() { 
    FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("login.fxml")); 
    fxmlLoader.setRoot(this); 
    fxmlLoader.setController(this); 
    try { 
     fxmlLoader.load(); 
    } catch (IOException exception) { 
     throw new RuntimeException(exception); 
    } 
} 

public class ProfilesBox extends VBox { 
public ProfilesBox() { 
    FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("profiles.fxml")); 
    fxmlLoader.setRoot(this); 
    fxmlLoader.setController(this); 
    try { 
     fxmlLoader.load(); 
    } catch (IOException exception) { 
     throw new RuntimeException(exception); 
    } 
} 

और तुम menu.fxml कि अपने पृष्ठ के लिए वैश्विक लेआउट का प्रबंधन LoginBox और ProfilesBox आयात करेगा:

<?import com.foo.bar.LoginBox ?> 
<?import com.foo.bar.ProfilesBox ?> 
<fx:root type="javafx.scene.layout.VBox" 
    xmlns:fx="http://javafx.com/fxml"> 

<!-- Stuff here to declare the menu bar--> 

    <HBox> 
     <ProfilesBox fx:id="profilesBox"/> 
     <LoginBox fx:id="loginBox"/> 
    </HBox> 

</fx:root> 

login.fxml और प्रोफाइल । एफएक्सएमएल में केवल मूल घटक होते हैं।

+0

मैं समझता हूं कि आपकी कहानियां क्या है, मुझे नहीं लगता कि मुझे पूरी तस्वीर मिल रही है। क्या आपके पास कोई और विस्तृत उदाहरण हैं? –

+0

और अपने स्वयं के विजेट बनाने के लिए ठीक है (यानी प्रोफाइलबॉक्स और लॉगिनबॉक्स) और उन्हें fxml फ़ाइल में रखें? और login.fxml और profiles.fxml क्या दिखता है? –

+1

पहले से ही ठीक उदाहरण में जोड़ने के लिए, आपको बस यह सुनिश्चित करना होगा कि आप अपने कस्टम नियंत्रण को FXML में आयात करें। जैसे । – chooks

4
  1. आप include FXML documents अन्य के भीतर एक कर सकते हैं - यह आप डिजाइन तर्क

  2. को अलग करने के साथ मदद करनी चाहिए इसका मतलब है आप कर सकते हैं Nested Controllers - प्रत्येक दस्तावेज़ के लिए एक।

प्रलेखन से, अब आप अपना कोड सेट कर सकते हैं जैसे तर्क को अलग किया जा सकता है साथ ही साथ रूट नियंत्रक (यदि आवश्यक हो) से भी जोड़ा जा सकता है।

उम्मीद है कि मदद करता है।

+2

मैंने देखा है नेस्टेड कंट्रोलर प्रलेखन, और यदि मैं देख सकता हूं कि एफएक्सएमएल में क्या शामिल है, मुख्य नियंत्रकों में विधि क्या है, और संवाद नियंत्रक कैसा दिखता है, मुझे लगता है कि यह बहुत उपयोगी होगा। मैं बस नहीं देखता कि ठीक विवरण कैसे काम कर रहे हैं। –

0

मुझे इसी तरह की आवश्यकताओं के साथ एक पॉपअप विंडो की आवश्यकता है (नोड्स और लेआउट पर अधिक नियंत्रण)।

सिफारिशों के माध्यम से अपना रास्ता काम करने के बाद, मुझे एक समाधान मिला जो उपयोगी हो सकता है।

सबसे पहले, मैंने एक दूसरा एफएक्सएमएल दस्तावेज़ और दूसरा नियंत्रक बनाया (नेटबीन, नया -> खाली FXML ... -> जावा नियंत्रक का उपयोग करें -> नया बनाएं ...)।

एक छोटे चुनौतीपूर्ण को यह समझना था कि मुख्य नियंत्रक में चरण कैसे बनाएं और इसे पॉपअप नियंत्रक से कनेक्ट करें।

लिंक Passing Parameters JavaFX FXML कुछ वास्तविक अच्छी अंतर्दृष्टि और तकनीक देता है।

अंतिम कोड (मुझे आशा है कि यह किसी की मदद कर सकते हैं) इस तरह दिखता है:

// Anchor Pane from the popup 
@FXML 
AnchorPane anchorPanePopup; 

@FXML 
private void soneButtonAction(ActionEvent event) throws IOException {  
    Stage newStage = new Stage(); 
    AnchorPane anchorPanePopup = (AnchorPane) FXMLLoader.load(getClass().getResource("Popup_FXML.fxml")); 
    Scene scene = new Scene(anchorPanePopup); 
    newStage.setScene(scene); 
    newStage.initModality(Modality.APPLICATION_MODAL); 
    newStage.setTitle("Dialog Window"); 
    newStage.showAndWait();   
} 
संबंधित मुद्दे