2012-09-22 26 views
21

this ट्यूटोटियल में, कस्टम घटकों को शामिल करने और कंटेनर के नियंत्रक से उनके नियंत्रकों का उपयोग करने का एक उदाहरण है।जावाएफएक्स नेस्टेड कंट्रोलर (एफएक्सएमएल <include>)

main_window_content.fxml

<VBox fx:controller="com.foo.MainController"> 
    <fx:include fx:id="dialog" source="dialog.fxml"/> 
    ... 
</VBox> 

MainController.java

public class MainController extends Controller { 
    @FXML private Window dialog; 
    @FXML private DialogController dialogController; 

    .. 

घटक केवल एक बार शामिल किया गया है, तो यह ठीक काम करता है। यदि एक ही घटक को दो बार शामिल किया गया है, तो नियंत्रकों को प्रारंभ नहीं किया जाता है। दोनों नियंत्रक शून्य हैं।

main_window_content.fxml

<VBox fx:controller="com.foo.MainController"> 
     <fx:include fx:id="dialog1" source="dialog.fxml"/> 
     <fx:include fx:id="dialog2" source="dialog.fxml"/> 
     ... 
    </VBox> 

MainController.java

public class MainController extends Controller { 
     @FXML private Window dialog1; 
     @FXML private DialogController dialogController1; 
     @FXML private Window dialog2; 
     @FXML private DialogController dialogController2; 

कोई मुझे समस्या को हल करने में मदद कर सकता है? धन्यवाद

यह मेरा एफएक्सएमएल लोडिंग कोड है। यह मुख्य आवेदन विधि में निष्पादित किया जाता है: मैं अपने कोड में त्रुटि पाई (OTN से) डैनियल को

public void start(Stage stage) throws Exception { 
    Parent root = FXMLLoader.load(getClass().getResource("main_window_content.fxml")); 
    stage.setTitle("FXML Welcome"); 
    stage.setScene(new Scene(root, 300, 275)); 
    stage.show(); 
} 
+0

दूसरा प्रश्न इस प्रश्न का सही समाधान है, इसे "स्वीकृत" चिह्नित किया जाना चाहिए –

+0

@AmirArad कौन सा "दूसरा" है? – glglgl

उत्तर

29

धन्यवाद, मेरी नियंत्रक चर के नाम गलत थे। वे <fx:id>Controller होना चाहिए। दूसरे शब्दों में यह होना चाहिए:

MainController.java

public class MainController extends Controller { 
@FXML private Window dialog1; 
@FXML private DialogController dialog1Controller; 
@FXML private Window dialog2; 
@FXML private DialogController dialog2Controller; 

लेकिन अध्ययन changes संस्करण 2.2 में पेश किया मैंने पाया कि सब कुछ आसानी से <fx:root> टैग (like this tutorial) का उपयोग करके हल किया जा सकता। मैं FXML में मेरे घटक प्रवेश किया बस इस तरह यह घोषणा की:

<HBox> 
    <Dialog id="dialog1" text="Hello World!"/> 
    <Dialog id="dialog2" text="Hello World!"/> 
</HBox> 

मैं उपयोगी

+16

साथ ही, अपनी समस्या के समाधान के रूप में इसे और अधिक दृश्यमान बनाने के लिए, अपना स्वयं का उत्तर स्वीकृत के रूप में चिह्नित करें। बस इस उत्तर के बगल में टिक क्लिक करें। –

1

वहाँ नेस्टेड fxmls साथ 8.0 के साथ-साथ NetBeans में एक बग हो रहा है होने की उम्मीद है। आपके लिए नेस्टेड एफएक्सएमएल नियंत्रक ऑब्जेक्ट बनाने के लिए नेटबीन पर भरोसा नहीं कर सकता है, इसे मैन्युअल रूप से आपके मेनकंट्रोलर में डालना होगा। हर बार जब नेटबीन में नियंत्रक को अद्यतन किया जाता है तो यह मिटा दिया जाता है, इसलिए यह बहुत कठिन हो सकता है। इस उदाहरण के लिए कि इस मामले में मुख्य नियंत्रक में मैन्युअल

@FXML private DialogController dialog1Controller; 

लाइन डालने की जाएगी, तो यह सामान्य रूप से काम करता है। बड़े fxmls/नियंत्रकों के आयोजन के लिए बहुत उपयोगी है।