জাভাএফএক্স এফএক্সএমএল নিয়ন্ত্রক - নির্মাণকারী বনাম প্রাথমিক পদ্ধতি initial


89

আমার Applicationক্লাসটি এমন দেখাচ্ছে:

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সংশ্লিষ্ট নিয়ামক (দেওয়া একটি দৃষ্টান্ত সৃষ্টি FXMLমাধ্যমে ফাইল fx:controllerপ্রথম ডিফল্ট কন্সট্রাকটর এবং তারপর invoking দ্বারা) initializeপদ্ধতি:

public class MainViewController {

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

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

আউটপুটটি হ'ল:

first
second

তাহলে, initializeপদ্ধতিটি কেন বিদ্যমান? কন্ট্রাক্টর ব্যবহারকারী বা initializeনিয়ামক প্রয়োজনীয় জিনিস শুরু করার পদ্ধতিটির মধ্যে পার্থক্য কী ?

আপনার পরামর্শের জন্য ধন্যবাদ!

উত্তর:


129

কয়েকটি কথায়: কনস্ট্রাক্টরকে প্রথমে বলা হয়, তারপরে যে কোনও @FXMLটীকাকরণ ক্ষেত্রগুলি জনবহুল হয়, তারপরে initialize()তাকে বলা হয়।

এই উপায়ে কন্সট্রাকটর নেই না এক্সেস আছে @FXMLসময়, .fxml ফাইলের মধ্যে নির্ধারণ উপাদান উল্লেখ ক্ষেত্র initialize() আছে তাদের এক্সেস আছে।

থেকে বরাত দিয়ে FXML পরিচিতি :

[...] নিয়ামক একটি প্রাথমিককরণ () পদ্ধতিটি সংজ্ঞায়িত করতে পারেন, যা সম্পর্কিত ডকুমেন্টের বিষয়বস্তু সম্পূর্ণরূপে লোড হয়ে যাওয়ার পরে একটি প্রয়োগকারী নিয়ন্ত্রণকারীকে একবার ডাকা হবে [...] এটি বাস্তবায়নকারী শ্রেণিকে প্রয়োজনীয় পোস্ট সম্পাদন করতে দেয় কন্টেন্ট প্রসেসিং।


4
আমি বুঝতে পারছি না। তিনি যেভাবে এটি করেন FXMLLoader, ঠিক তাই? সুতরাং initialize()- পদ্ধতির জন্য অপেক্ষা করে আমি কোনও সুবিধা দেখছি না । এফএক্সএমএল লোড হওয়ার সাথে সাথে নীচের কোডটিতে @FXMLভেরিয়েবলগুলির অ্যাক্সেস রয়েছে । অবশ্যই, তিনি এটি নির্মাণ পদ্ধতিতে না শুরুর পদ্ধতিতে করেন তবে initialize()তার ক্ষেত্রে কোনও উপকার পাবেন?
কোডেপ্লেব

93

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. 
    }
}

11

উপরের উত্তরগুলি ছাড়াও, সম্ভবত লক্ষ করা উচিত যে সূচনাটি বাস্তবায়নের জন্য একটি উত্তরাধিকারের উপায় রয়েছে। একটা ইন্টারফেস বলা হয় Initializable fxml লাইব্রেরি থেকে।

import javafx.fxml.Initializable;

class MyController implements Initializable {
    @FXML private TableView<MyModel> tableView;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        tableView.getItems().addAll(getDataFromSource());
    }
}

পরামিতি:

location - The location used to resolve relative paths for the root object, or null if the location is not known.
resources - The resources used to localize the root object, or null if the root object was not localized. 

এবং ডক্সের নোটটি কেন ব্যবহারের সহজ উপায় @FXML public void initialize():

NOTEএই ইন্টারফেসটি নিয়ন্ত্রণকারীর মধ্যে অবস্থান এবং সংস্থানসমূহের বৈশিষ্ট্যগুলির স্বয়ংক্রিয়ভাবে ইনজেকশন দ্বারা ছাড়িয়ে গেছে। এফএক্সএমএলএলডার এখন স্বয়ংক্রিয়ভাবে নিয়ামক দ্বারা নির্ধারিত যেকোন উপযুক্ত এনোটোটেড নো-আরগ আরম্ভ () পদ্ধতিটি কল করবে method এটি যখনই সম্ভব সম্ভব ইনজেকশন পদ্ধতির ব্যবহার করার পরামর্শ দেওয়া হয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.