2016-01-14 10 views
45

मेरे Application वर्ग इस तरह दिखता है:JavaFX FXML नियंत्रक - निर्माता बनाम इनिशियलाइज़ विधि

public class Test extends Application { 

    private static Logger logger = LogManager.getRootLogger(); 

    @Override 
    public void start(Stage primaryStage) throws Exception { 

     String resourcePath = "/resources/fxml/MainView.fxml"; 
     URL location = getClass().getResource(resourcePath); 
     FXMLLoader fxmlLoader = new FXMLLoader(location); 

     Scene scene = new Scene(fxmlLoader.load(), 500, 500); 

     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 

FXMLLoader पहले डिफ़ॉल्ट निर्माता लागू द्वारा इसी नियंत्रक (fx:controller के माध्यम से FXML फ़ाइल में दी गई) का एक उदाहरण बनाता है और तो initialize विधि:

public class MainViewController { 

    public MainViewController() { 
     System.out.println("first"); 
    } 

    @FXML 
    public void initialize() { 
     System.out.println("second"); 
    } 
} 

उत्पादन होता है:

first 
second 

तो, initialize विधि क्यों मौजूद है? कंट्रोलर आवश्यक चीजों को आरंभ करने के लिए एक कन्स्ट्रक्टर या initialize विधि का उपयोग करने के बीच क्या अंतर है?

आपके सुझावों के लिए धन्यवाद!

उत्तर

51

initialize विधि @FXML एनोटेटेड सदस्यों को इंजेक्शन देने के बाद बुलाया जाता है। मान लीजिए आप एक तालिका दृश्य आप डेटा के साथ पॉप्युलेट करने के लिए करना चाहते हैं:

class MyController { 
    @FXML 
    TableView<MyModel> tableView; 

    public MyController() { 
     tableView.getItems().addAll(getDataFromSource()); // results in NullPointerException, as tableView is null at this point. 
    } 

    @FXML 
    public void initialize() { 
     tableView.getItems().addAll(getDataFromSource()); // Perfectly Ok here, as FXMLLoader already populated all @FXML annotated members. 
    } 
} 
62

कुछ शब्दों में: निर्माता पहले कहा जाता है, तो किसी भी @FXML एनोटेट क्षेत्रों भर जाती है, तो initialize() कहा जाता है। तो कन्स्ट्रक्टर को @FXML फ़ील्ड तक पहुंच नहीं है, जो .fxml फ़ाइल में परिभाषित घटकों का जिक्र करते हैं, जबकि initialize() उनके पास पहुंच है।

Introduction to FXML से हवाला देते हुए:

पूरी तरह से

[...] नियंत्रक एक Initialize() विधि है, जो एक को लागू करने नियंत्रक पर एक बार बुलाया जाएगा परिभाषित कर सकते हैं जब उसके संबंधित दस्तावेज़ की सामग्री रहे हैं भरी हुई [...] यह कार्यान्वयन वर्ग को सामग्री पर आवश्यक पोस्ट-प्रोसेसिंग करने की अनुमति देता है।

+1

मुझे समझ में नहीं आता है। जिस तरह से वह करता है वह 'FXMLLoader' से अधिक है, है ना? इसलिए मुझे 'प्रारंभिक() '- विधि की प्रतीक्षा में लाभ दिखाई नहीं देता है। जैसे ही FXML लोड हो जाता है, निम्न कोड के पास '@ FXML' चरों तक पहुंच है। निश्चित रूप से, वह इसे प्रारंभिक तरीके से करता है, न कि कन्स्ट्रक्टर में, लेकिन 'प्रारंभिक()' अपने मामले में कोई लाभ लाएगा? – codepleb

संबंधित मुद्दे