2013-02-09 28 views
8

में इंजेक्शन नहीं दिया जा रहा है मेरे पास एक सीमावर्ती (मेनकंट्रोलर से जुड़ा हुआ है), सीमावर्ती के लिए FXML <fx:include> का उपयोग करता है ताकि एक लेबल (नियंत्रक स्थितिबैर नियंत्रक के साथ) सीमावर्ती क्षेत्र के निचले क्षेत्र में शामिल हो सके। दुर्भाग्य से स्टेटसबार नियंत्रक को मेनकंट्रोलर क्लास इंस्टेंस में इंजेक्शन नहीं दिया गया है और मैं समझ नहीं पा रहा हूं कि क्यों।उप नियंत्रक को मुख्य नियंत्रक

main.fxml: शामिल प्रस्थिति साथ BorderPane

<fx:root type="javafx.scene.layout.BorderPane" fx:id="borderPane" xmlns:fx="http://javafx.com/fxml" fx:controller="com.example.controllers.MainController"> 
    <bottom> 
    <fx:include source="statusbar.fxml" /> 
    </bottom> 
</fx:root> 

statusbar.fxml: लेबल और यह संबद्ध नियंत्रक

<Label fx:id="statusbar" text="A label simulating a status bar" xmlns:fx="http://javafx.com/fxml" fx:controller="com.example.controllers.StatusBarController" /> 

MainController StatusBarController के लिए एक क्षेत्र के साथ :

public class MainController 
{ 
    @FXML 
    private StatusBarController statusbarController; // PROBLEM HERE: I would expect the StatusBarController to be injected but this does not happen! 


    // Implementing Initializable Interface no longer required on JavaFX 2.2 according to 
    // http://docs.oracle.com/javafx/2/fxml_get_started/whats_new2.htm 
    // (I also tested this, the initialize() method is being called) 
    @SuppressWarnings("unused") // only called by the FXMLLoader 
    @FXML // This method is called by the FXMLLoader when initialization is complete 
    private void initialize() { 
     // initialize your logic here: all @FXML variables will have been injected 
     assert borderPane != null : "fx:id=\"borderPane\" was not injected: check your FXML file 'main.fxml'."; 
     System.out.println("MainController initialize()"); 

     //statusbarController.setStatusText("Hello from MainController"); // PROBLEM HERE: this fails because statusbarController is not injected as expected 
    } 
} 

और आवेदन की शुरुआत: क्यों StatusBarController statusbarController चर में इंजेक्शन नहीं है:

public void start(Stage primaryStage) 
    {  
     Parent root = null; 

     try { 
      root = FXMLLoader.load(getClass().getResource("/resources/main.fxml")); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     primaryStage.setTitle("Demo"); 
     primaryStage.setScene(new Scene(root, 800, 600)); 
     primaryStage.show(); 
    } 

मेरी नमूने के पूर्ण स्रोत कोड तो सवाल यह है http://codestefan.googlecode.com/svn/trunk/SubcontrollerAccess/

पर उपलब्ध है मेनकंट्रोलर का?

किसी भी संकेत के लिए धन्यवाद!

उत्तर

15

@FXML टैग का उपयोग करने के लिए आपको fx:id प्रदान करना होगा।

अद्यतन अपने main.fxml:

<bottom> 
    <fx:include fx:id="statusbar" source="statusbar.fxml" /> 
</bottom> 

उसके बाद आप अपनी MainController.java अगले स्थिरांक का उपयोग कर सकते हैं:,

@FXML 
Label statusbar; // node itself 
@FXML 
private StatusBarController statusbarController; // controller 

ध्यान दें कि statusbarController एक आंशिक रूप से लोवरकेस वर्ग के नाम नहीं है, लेकिन fx:id + Controller शब्द ।

+1

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

+0

@ सर्गी, मुझे एक ही समस्या थी, और मेरा मुद्दा ठीक आपके नोट Fx: id + नियंत्रक में था। एक अच्छा पकड़ !!!! कृपया इस प्रश्न का उत्तर अपने नोट के साथ दें क्योंकि यह मेरी समस्या को ठीक करता है। https: // stackoverflow।कॉम/प्रश्न/4547520 9/शून्य-अपवाद-जब-मैं-कोशिश-से-पहुंच-ए-नियंत्रक-कि-i-pass-use-javafx – Moe

+0

@ मुझे यकीन है, संकेत के लिए धन्यवाद :) –

0

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

@FXML निजी स्थितिबार नियंत्रक स्थिति पट्टी नियंत्रक डालने वाला होगा;

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