खोज…


वाक्य - विन्यास

उदाहरण FXML

एक सरल एफएक्सएमएल दस्तावेज़ जिसमें बटन और एक लेबल नोड युक्त AnchorPane रूपरेखा है:

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<AnchorPane id="AnchorPane" prefHeight="200" prefWidth="320" xmlns:fx="http://javafx.com/fxml/1" 
        fx:controller="com.example.FXMLDocumentController">
    <children>
        <Button layoutX="126" layoutY="90" text="Click Me!" onAction="#handleButtonAction" fx:id="button" />
        <Label layoutX="126" layoutY="120" minHeight="16" minWidth="69" fx:id="label" />
    </children>
</AnchorPane>

यह उदाहरण एफएक्सएमएल फ़ाइल एक नियंत्रक वर्ग के साथ जुड़ा हुआ है। इस मामले में एफएक्सएमएल और नियंत्रक वर्ग के बीच संबंध, एफएक्सएमएल के मूल तत्व में fx:controller विशेषता के मूल्य के रूप में वर्ग के नाम को निर्दिष्ट करके बनाया गया है: fx:controller="com.example.FXMLDocumentController" । एफएक्सएमएल फ़ाइल में परिभाषित यूआई तत्वों पर उपयोगकर्ता कार्यों के जवाब में नियंत्रक वर्ग जावा कोड को निष्पादित करने की अनुमति देता है:

package com.example ;

import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;

public class FXMLDocumentController {
    
    @FXML
    private Label label;
    
    @FXML
    private void handleButtonAction(ActionEvent event) {
        System.out.println("You clicked me!");
        label.setText("Hello World!");
    }
    
    @Override
    public void initialize(URL url, ResourceBundle resources) {
        // Initialization code can go here. 
        // The parameters url and resources can be omitted if they are not needed
    }    
    
}

एक FXMLLoader का उपयोग FXML फाइल को लोड करने के लिए किया जा सकता है:

public class MyApp extends Application {

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

        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(getClass().getResource("FXMLDocument.fxml"));
        Parent root = loader.load();
        
        Scene scene = new Scene(root);
        
        stage.setScene(scene);
        stage.show();
    }

}

load विधि कई क्रियाएं करती है, और यह उस क्रम को समझने के लिए उपयोगी है जिसमें वे होते हैं। इस सरल उदाहरण में:

  1. FXMLLoader FXML फ़ाइल को पढ़ता और पार्स करता है। यह फ़ाइल में परिभाषित तत्वों के अनुरूप ऑब्जेक्ट बनाता है, और किसी भी fx:id ध्यान देता है fx:id विशेषताओं को उन पर परिभाषित किया गया है।

  2. चूंकि एफएक्सएमएल फ़ाइल के रूट तत्व ने एक fx:controller परिभाषित किया था fx:controller विशेषता, FXMLLoader उस वर्ग का एक नया उदाहरण बनाता है जिसे वह निर्दिष्ट करता है। डिफ़ॉल्ट रूप से यह निर्दिष्ट वर्ग पर नो-तर्क कंस्ट्रक्टर को लागू करने से होता है।

  3. fx:id साथ कोई भी तत्व fx:id विशेषताओं को परिभाषित किया गया है जिसमें नियंत्रक में फ़ील्ड के साथ मेल खाने वाले नाम हैं, और जो या तो public (अनुशंसित नहीं हैं) या एनोटेट @FXML (अनुशंसित) उन संबंधित क्षेत्रों में "इंजेक्ट" हैं। तो इस उदाहरण में, चूंकि fx:id="label" साथ FXML फ़ाइल में एक Label है fx:id="label" और नियंत्रक संकेत के रूप में एक फ़ील्ड

    @FXML
    private Label label ;
    

    label फ़ील्ड को FXMLLoader द्वारा बनाए गए Label उदाहरण से आरंभ किया जाता है।

  4. घटना संचालकों को एफएक्सएमएल फ़ाइल में किसी भी तत्व के साथ onXXX onXXX="#..." गुणों के साथ पंजीकृत किया गया है। ये ईवेंट हैंडलर नियंत्रक वर्ग में निर्दिष्ट विधि का आह्वान करते हैं। इस उदाहरण में, चूंकि Button में onAction="#handleButtonAction" , और नियंत्रक एक विधि को परिभाषित करता है

    @FXML
    private void handleButtonAction(ActionEvent event) { ... }
    

    जब बटन पर कोई कार्रवाई की जाती है (जैसे उपयोगकर्ता इसे दबाता है), तो यह विधि लागू होती है। विधि में void वापसी प्रकार होना चाहिए, और या तो घटना प्रकार से मेल खाने वाले पैरामीटर को परिभाषित कर सकता है (इस उदाहरण में ActionEvent ), या अपने मापदंडों को परिभाषित कर सकता है।

  5. अंत में, यदि नियंत्रक वर्ग एक initialize विधि को परिभाषित करता है, तो यह विधि लागू होती है। ध्यान दें कि यह @FXML फ़ील्ड्स के इंजेक्ट होने के बाद होता है, इसलिए उन्हें इस पद्धति में सुरक्षित रूप से एक्सेस किया जा सकता है और एफएक्सएमएल फ़ाइल में तत्वों के अनुरूप इंस्टेंस के साथ आरंभ किया जाएगा। initialize() विधि या तो कोई पैरामीटर नहीं ले सकती है, या एक URL और एक ResourceBundle ले सकती है। बाद के मामले में, ये पैरामीटर FXML फ़ाइल के स्थान का प्रतिनिधित्व करने वाले URL , और loader.setResources(...) . loader.setResources(...) माध्यम से loader.setResources(...) पर सेट किए गए किसी भी ResourceBundle FXMLLoader द्वारा loader.setResources(...) । यदि सेट नहीं किया गया था, तो इनमें से कोई भी null हो सकता है।

नेस्ट कंट्रोलर

एक एकल नियंत्रक का उपयोग करके एक एफएक्सएमएल में पूरे यूआई बनाने की कोई आवश्यकता नहीं है।

एक fxml फ़ाइल को दूसरे में शामिल करने के लिए <fx:include> टैग का उपयोग किया जा सकता है। शामिल किए गए fxml के नियंत्रक को सम्मिलित फ़ाइल के कंट्रोलर में उसी तरह इंजेक्ट किया जा सकता है जैसे कि FXMLLoader द्वारा बनाई गई कोई अन्य वस्तु।

यह fx:id विशेषता को <fx:include> तत्व से जोड़कर किया जाता है। इस तरह से शामिल किए गए fxml के नियंत्रक को <fx:id value>Controller के नाम के साथ फ़ील्ड में इंजेक्ट किया जाएगा।

उदाहरण:

fx: आईडी वैल्यू इंजेक्शन के लिए क्षेत्र का नाम
foo fooController
answer42 answer42Controller
xyz xYzController

नमूना fxmls

काउंटर

यह एक Fxml है जिसमें Text नोड के साथ StackPane है। इस fxml फ़ाइल के लिए नियंत्रक वर्तमान काउंटर मान प्राप्त करने के साथ-साथ काउंटर को बढ़ाने की अनुमति देता है:

counter.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.text.*?>
<?import javafx.scene.layout.*?>

<StackPane prefHeight="200" prefWidth="200" xmlns:fx="http://javafx.com/fxml/1" fx:controller="counter.CounterController">
    <children>
        <Text fx:id="counter" />
    </children>
</StackPane>

CounterController

package counter;

import javafx.fxml.FXML;
import javafx.scene.text.Text;

public class CounterController {
    @FXML
    private Text counter;

    private int value = 0;
    
    public void initialize() {
        counter.setText(Integer.toString(value));
    }
    
    public void increment() {
        value++;
        counter.setText(Integer.toString(value));
    }
    
    public int getValue() {
        return value;
    }
    
}

जिसमें एफएक्सएमएल भी शामिल है

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<BorderPane prefHeight="500" prefWidth="500" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="counter.OuterController">
    <left>
        <Button BorderPane.alignment="CENTER" text="increment" onAction="#increment" />
    </left>
    <center>
        <!-- content from counter.fxml included here -->
        <fx:include fx:id="count" source="counter.fxml" />
    </center>
</BorderPane>

OuterController

शामिल fxml के नियंत्रक को इस नियंत्रक में इंजेक्ट किया जाता है। यहां Button लिए onAction इवेंट के हैंडलर का उपयोग काउंटर को बढ़ाने के लिए किया जाता है।

package counter;

import javafx.fxml.FXML;

public class OuterController {

    // controller of counter.fxml injected here
    @FXML
    private CounterController countController;

    public void initialize() {
        // controller available in initialize method
        System.out.println("Current value: " + countController.getValue());
    }

    @FXML
    private void increment() {
        countController.increment();
    }

}

Fxmls को इस तरह से लोड किया जा सकता है, यह मानते हुए कि कोड को एक वर्ग से outer.fxml पैकेज के रूप में कहा जाता है।

Parent parent = FXMLLoader.load(getClass().getResource("outer.fxml"));

ब्लॉक और परिभाषित करें

कभी-कभी एफएक्सएमएल में सामान्य ऑब्जेक्ट संरचना के बाहर एक तत्व बनाने की आवश्यकता होती है।

यह वह जगह है जहाँ परिभाषित ब्लॉक खेलने में आते हैं:

<fx:define> तत्व के अंदर सामग्री को मूल तत्व के लिए बनाई गई वस्तु में नहीं जोड़ा जाता है।

<fx:define> हर बाल तत्व को एक fx:id विशेषता चाहिए।

इस तरह से बनाई गई वस्तुओं को बाद में <fx:reference> तत्व या अभिव्यक्ति बंधन का उपयोग करके संदर्भित किया जा सकता है।

<fx:reference> तत्व का उपयोग किसी भी तत्व को fx:id साथ संदर्भित करने के लिए किया जा सकता है fx:id विशेषता जिसे <fx:reference> तत्व से पहले संभाला जाता है, fx:id के समान मान का उपयोग करके नियंत्रित किया जाता है <fx:reference> तत्व का fx:id विशेषता <fx:reference> तत्व का source गुण।

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.text.*?>
<?import java.lang.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>


<VBox xmlns:fx="http://javafx.com/fxml/1" prefHeight="300.0" prefWidth="300.0" xmlns="http://javafx.com/javafx/8">
    <children>
        <fx:define>
            <String fx:value="My radio group" fx:id="text" />
        </fx:define>
        <Text>
            <text>
                <!-- reference text defined above using fx:reference -->
                <fx:reference source="text"/>
            </text>
        </Text>
        <RadioButton text="Radio 1">
            <toggleGroup>
                <ToggleGroup fx:id="group" />
            </toggleGroup>
        </RadioButton>
        <RadioButton text="Radio 2">
            <toggleGroup>
                <!-- reference ToggleGroup created for last RadioButton -->
                <fx:reference source="group"/>
            </toggleGroup>
        </RadioButton>
        <RadioButton text="Radio 3" toggleGroup="$group" />
        
        <!-- reference text defined above using expression binding -->
        <Text text="$text" />
    </children>
</VBox>

FXML को डेटा पास करना - मौजूदा नियंत्रक तक पहुंचना

समस्या: कुछ डेटा को एक fxml से लोड किए गए दृश्य में पास करने की आवश्यकता होती है।

समाधान

FXMLLoader का उपयोग करके एक नियंत्रक निर्दिष्ट करें fx:controller विशेषता और FXMLLoader लोड करने के लिए उपयोग किए जाने वाले FXMLLoader उदाहरण से लोडिंग प्रक्रिया के दौरान बनाया गया नियंत्रक उदाहरण प्राप्त करें।

कंट्रोलर इंस्टेंस पर डेटा पास करने के तरीके जोड़ें और उन तरीकों से डेटा को हैंडल करें।

FXML

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.text.*?>
<?import javafx.scene.layout.*?>

<VBox xmlns:fx="http://javafx.com/fxml/1" fx:controller="valuepassing.TestController">
    <children>
        <Text fx:id="target" />
    </children>
</VBox>

नियंत्रक

package valuepassing;

import javafx.fxml.FXML;
import javafx.scene.text.Text;

public class TestController {

    @FXML
    private Text target;

    public void setData(String data) {
        target.setText(data);
    }

}

कोड का उपयोग fxml लोड करने के लिए किया जाता है

String data = "Hello World!";

FXMLLoader loader = new FXMLLoader(getClass().getResource("test.fxml"));
Parent root = loader.load();
TestController controller = loader.<TestController>getController();
controller.setData(data);

FXML को डेटा पास करना - नियंत्रक उदाहरण निर्दिष्ट करना

समस्या: कुछ डेटा को एक fxml से लोड किए गए दृश्य में पास करने की आवश्यकता होती है।

समाधान

FXMLLoader लोड करने के लिए बाद में उपयोग किए जाने वाले FXMLLoader उदाहरण का उपयोग करके नियंत्रक सेट करें।

सुनिश्चित करें कि कंट्रोलर में fxml लोड करने से पहले संबंधित डेटा है।

नोट: इस स्थिति में fxml फ़ाइल में fx:controller विशेषता नहीं होनी चाहिए।

FXML

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.text.*?>
<?import javafx.scene.layout.*?>

<VBox xmlns:fx="http://javafx.com/fxml/1">
    <children>
        <Text fx:id="target" />
    </children>
</VBox>

नियंत्रक

import javafx.fxml.FXML;
import javafx.scene.text.Text;

public class TestController {

    private final String data;

    public TestController(String data) {
        this.data = data;
    }
    
    @FXML
    private Text target;
    
    public void initialize() {
        // handle data once the fields are injected
        target.setText(data);
    }

}

कोड का उपयोग fxml लोड करने के लिए किया जाता है

String data = "Hello World!";

FXMLLoader loader = new FXMLLoader(getClass().getResource("test.fxml"));

TestController controller = new TestController(data);
loader.setController(controller);

Parent root = loader.load();

एफएक्सएमएल के लिए पैरामीटर पारित करना - एक नियंत्रक का उपयोग करना

समस्या: कुछ डेटा को एक fxml से लोड किए गए दृश्य में पास करने की आवश्यकता होती है।

समाधान

एक नियंत्रक कारखाना निर्दिष्ट करें जो नियंत्रक बनाने के लिए जिम्मेदार है। कारखाने द्वारा बनाए गए नियंत्रक उदाहरण के लिए डेटा पास करें।

FXML

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.text.*?>
<?import javafx.scene.layout.*?>

<VBox xmlns:fx="http://javafx.com/fxml/1" fx:controller="valuepassing.TestController">
    <children>
        <Text fx:id="target" />
    </children>
</VBox>

नियंत्रक

package valuepassing;

import javafx.fxml.FXML;
import javafx.scene.text.Text;

public class TestController {

    private final String data;

    public TestController(String data) {
        this.data = data;
    }
    
    @FXML
    private Text target;
    
    public void initialize() {
        // handle data once the fields are injected
        target.setText(data);
    }

}

कोड का उपयोग fxml लोड करने के लिए किया जाता है

स्ट्रिंग डेटा = "हैलो वर्ल्ड!";

Map<Class, Callable<?>> creators = new HashMap<>();
creators.put(TestController.class, new Callable<TestController>() {

    @Override
    public TestController call() throws Exception {
        return new TestController(data);
    }

});

FXMLLoader loader = new FXMLLoader(getClass().getResource("test.fxml"));

loader.setControllerFactory(new Callback<Class<?>, Object>() {

    @Override
    public Object call(Class<?> param) {
        Callable<?> callable = creators.get(param);
        if (callable == null) {
            try {
                // default handling: use no-arg constructor
                return param.newInstance();
            } catch (InstantiationException | IllegalAccessException ex) {
                throw new IllegalStateException(ex);
            }
        } else {
            try {
                return callable.call();
            } catch (Exception ex) {
                throw new IllegalStateException(ex);
            }
        }
    }
});

Parent root = loader.load();

यह जटिल लग सकता है, लेकिन यह उपयोगी हो सकता है, अगर एफएक्सएमएल यह तय करने में सक्षम होना चाहिए कि इसे किस नियंत्रक वर्ग की आवश्यकता है।

एफएक्सएमएल में इंस्टेंस निर्माण

निम्न वर्ग का उपयोग यह दर्शाने के लिए किया जाता है कि कक्षाओं के उदाहरण कैसे बनाए जा सकते हैं:

JavaFX 8

Person(@NamedArg("name") String name) में एनोटेशन Person(@NamedArg("name") String name) को हटाया जाना है, क्योंकि @NamedArg एनोटेशन अनुपलब्ध है।

package fxml.sample;

import javafx.beans.NamedArg;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;

public class Person {

    public static final Person JOHN = new Person("John");

    public Person() {
        System.out.println("Person()");
    }
    
    public Person(@NamedArg("name") String name) {
        System.out.println("Person(String)");
        this.name.set(name);
    }
    
    public Person(Person person) {
        System.out.println("Person(Person)");
        this.name.set(person.getName());
    }

    private final StringProperty name = new SimpleStringProperty();

    public final String getName() {
        System.out.println("getter");
        return this.name.get();
    }

    public final void setName(String value) {
        System.out.println("setter");
        this.name.set(value);
    }

    public final StringProperty nameProperty() {
        System.out.println("property getter");
        return this.name;
    }
    
    public static Person valueOf(String value) {
        System.out.println("valueOf");
        return new Person(value);
    }
    
    public static Person createPerson() {
        System.out.println("createPerson");
        return new Person();
    }
    
}

मान लें कि fxml लोड करने से पहले Person वर्ग को पहले से ही आरंभ कर दिया गया है।

आयात पर एक नोट

निम्नलिखित fxml उदाहरण में आयात अनुभाग छोड़ दिया जाएगा। हालाँकि fxml के साथ शुरू होना चाहिए

<?xml version="1.0" encoding="UTF-8"?>

fxml फ़ाइल में उपयोग किए गए सभी वर्गों को आयात करने वाले एक आयात अनुभाग के बाद। वे आयात गैर-स्थिर आयात के समान हैं, लेकिन प्रसंस्करण निर्देशों के रूप में जोड़े जाते हैं। यहां तक कि java.lang पैकेज से कक्षाएं आयात करने की आवश्यकता है।

इस मामले में निम्नलिखित आयातों को जोड़ा जाना चाहिए:

<?import java.lang.*?>
<?import fxml.sample.Person?>

JavaFX 8

@NamedArg एनोटेट कंस्ट्रक्टर

यदि कोई ऐसा कंस्ट्रक्टर है जहाँ हर पैरामीटर को @NamedArg साथ एनोटेट किया @NamedArg और @NamedArg एनोटेशन के सभी मान @NamedArg में मौजूद हैं, तो कंस्ट्रक्टर का उपयोग उन मापदंडों के साथ किया जाएगा।

<Person name="John"/>
<Person xmlns:fx="http://javafx.com/fxml">
    <name>
        <String fx:value="John"/>
    </name>
</Person>

यदि लोड किया जाता है, तो दोनों निम्न कंसोल आउटपुट में परिणाम करते हैं:

Person(String)

कोई आर्गन्स कंस्ट्रक्टर नहीं

यदि कोई उपयुक्त नहीं है @NamedArg एनोटेट निर्माणकर्ता उपलब्ध है, तो कोई पैरामीटर नहीं लेने वाले निर्माणकर्ता का उपयोग किया जाएगा।

कंस्ट्रक्टर से @NamedArg एनोटेशन निकालें और लोड करने का प्रयास करें।

<Person name="John"/>

यह बिना पैरामीटर के कंस्ट्रक्टर का उपयोग करेगा।

आउटपुट:

Person()
setter

fx:value विशेषता

fx:value विशेषता एक करने के लिए इसे के मूल्य पारित करने के लिए इस्तेमाल किया जा सकता static valueOf विधि एक लेने String पैरामीटर और उपयोग करने के उदाहरण लौटने।

उदाहरण

<Person xmlns:fx="http://javafx.com/fxml" fx:value="John"/>

आउटपुट:

valueOf
Person(String)

fx:factory

fx:factory विशेषता मनमाने ढंग से static तरीकों का उपयोग करके वस्तुओं के निर्माण की अनुमति देती है जो पैरामीटर नहीं लेते हैं।

उदाहरण

<Person xmlns:fx="http://javafx.com/fxml" fx:factory="createPerson">
    <name>
        <String fx:value="John"/>
    </name>
</Person>

आउटपुट:

createPerson
Person()
setter

<fx:copy>

fx:copy का उपयोग करना fx:copy एक कॉपी कंस्ट्रक्टर को कॉपी किया जा सकता है। Fx को निर्दिष्ट करना fx:id किसी अन्य व्यक्ति का fx:id टैग का source गुण पैरामीटर के रूप में उस ऑब्जेक्ट के साथ कॉपी कंस्ट्रक्टर को आमंत्रित करेगा।

उदाहरण:

<ArrayList xmlns:fx="http://javafx.com/fxml">
    <Person fx:id="p1" fx:constant="JOHN"/>
    <fx:copy source="p1"/>
</ArrayList>

उत्पादन

Person(Person)
getter

fx:constant

fx:constant static final फ़ील्ड से मान प्राप्त करने की अनुमति देता है।

उदाहरण

<Person xmlns:fx="http://javafx.com/fxml" fx:constant="JOHN"/>

किसी भी आउटपुट का उत्पादन नहीं किया जाएगा, क्योंकि यह सिर्फ JOHN संदर्भित करता है जो कि क्लास को इनिशियलाइज़ करते समय बनाया गया था।

गुण स्थापित करना

Fxml में किसी ऑब्जेक्ट में डेटा जोड़ने के कई तरीके हैं:

<property> टैग

एक संपत्ति के नाम के साथ एक टैग एक उदाहरण बनाने के लिए उपयोग किए गए तत्व के बच्चे के रूप में जोड़ा जा सकता है। इस टैग के बच्चे को सेटर का उपयोग करके संपत्ति सौंपी जाती है या संपत्ति की सामग्री में जोड़ा जाता है (आसानी से सूची / नक्शा गुण)।

डिफ़ॉल्ट संपत्ति

एक क्लास को @DefaultProperty एनोटेशन के साथ एनोटेट किया जा सकता है। इस मामले में संपत्ति के नाम के साथ एक तत्व का उपयोग किए बिना तत्वों को सीधे बाल तत्व के रूप में जोड़ा जा सकता है।

property="value" गुण

गुण नाम और गुण मान के रूप में गुण नाम का उपयोग करके गुण असाइन किए जा सकते हैं। यह निम्नलिखित तत्व को टैग के बच्चे के रूप में जोड़ने के समान है:

<property>
    <String fx:value="value" />
</property>

स्थिर वासी

गुण static सेटर्स का उपयोग करके भी सेट किए जा सकते हैं। ये setProperty नाम के static तरीके हैं जो तत्व को पहले पैरामीटर के रूप में लेते हैं और दूसरे पैरामीटर के रूप में सेट करने के लिए मूल्य। इन तरीकों में किसी भी वर्ग में recide सकता है और का उपयोग कर इस्तेमाल किया जा सकता ContainingClass.property सामान्य संपत्ति नाम के बजाय।

नोट: वर्तमान में ऐसा प्रतीत होता है कि एक स्थिर स्टेटिक गेटर विधि होना चाहिए (यानी स्टैटिक विधि नामक getProperty को तत्व को उसी क्लास में स्टैटिक सेटर के रूप में लेने के लिए) इसके लिए काम करें जब तक कि वैल्यू टाइप String

ज़बरदस्ती टाइप करें

निम्नलिखित तंत्र का उपयोग असाइनमेंट के दौरान सही वर्ग की वस्तु प्राप्त करने के लिए किया जाता है, उदाहरण के लिए एक सेटर विधि के पैरामीटर प्रकार के अनुरूप।

यदि कक्षाएं असाइन करने योग्य हैं, तो मान स्वयं उपयोग किया जाता है।

अन्यथा मान निम्नानुसार परिवर्तित होता है

लक्ष्य प्रकार उपयोग किया गया मूल्य (स्रोत मान s )
Boolean , boolean Boolean.valueOf(s)
char , Character s.toString.charAt(0)
अन्य आदिम प्रकार या आवरण प्रकार लक्ष्य प्रकार के लिए उपयुक्त विधि, यदि s एक Number , तो रैपर के लिए valueOf(s.toString()) अन्यथा
BigInteger BigInteger.valueOf(s.longValue()) है s एक है Number , new BigInteger(s.toString()) अन्यथा
BigDecimal BigDecimal.valueOf(s.doubleValue()) s एक Number , new BigDecimal(s.toString()) अन्यथा
संख्या Double.valueOf(s.toString()) यदि s.toString() में ए . , Long.valueOf(s.toString()) अन्यथा
Class Class.forName(s.toString()) संदर्भ का उपयोग करके आह्वान किया गया कि क्लास को आरम्भ किए बिना वर्तमान थ्रेड के ClassLoader का उपयोग करें।
enum का परिणाम valueOf विधि, अतिरिक्त अपरकेस सब एक के लिए परिवर्तित कर String से अलग _ , प्रत्येक अपरकेस अक्षर से पहले सम्मिलित करता है, तो s एक है String है कि एक छोटा अक्षर के साथ शुरू होता है
अन्य मूल्य एक द्वारा दिया static valueOf TargetType में विधि, एक पैरामीटर के प्रकार से मेल खाते है कि s या उस प्रकार के सुपर क्लास

नोट: यह व्यवहार अच्छी तरह से प्रलेखित नहीं है और इसे बदलने के अधीन किया जा सकता है।

उदाहरण

public enum Location {
    WASHINGTON_DC,
    LONDON;
}
package fxml.sample;

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javafx.beans.DefaultProperty;

@DefaultProperty("items")
public class Sample {
    
    private Location loaction;

    public Location getLoaction() {
        return loaction;
    }

    public void setLoaction(Location loaction) {
        this.loaction = loaction;
    }

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }
    
    int number;

    private final List<Object> items = new ArrayList<>();

    public List<Object> getItems() {
        return items;
    }
    
    private final Map<String, Object> map = new HashMap<>();

    public Map<String, Object> getMap() {
        return map;
    }
    
    private BigInteger serialNumber;

    public BigInteger getSerialNumber() {
        return serialNumber;
    }

    public void setSerialNumber(BigInteger serialNumber) {
        this.serialNumber = serialNumber;
    }

    @Override
    public String toString() {
        return "Sample{" + "loaction=" + loaction + ", number=" + number + ", items=" + items + ", map=" + map + ", serialNumber=" + serialNumber + '}';
    }
    
}
package fxml.sample;

public class Container {

    public static int getNumber(Sample sample) {
        return sample.number;
    }

    public static void setNumber(Sample sample, int number) {
        sample.number = number;
    }

    private final String value;

    private Container(String value) {
        this.value = value;
    }

    public static Container valueOf(String s) {
        return new Container(s);
    }

    @Override
    public String toString() {
        return "42" + value;
    }

}

नीचे दिए गए fxml फ़ाइल पैदावार लोड करने का परिणाम मुद्रण

Sample{loaction=WASHINGTON_DC, number=5, items=[42a, 42b, 42c, 42d, 42e, 42f], map={answer=42, g=9.81, hello=42A, sample=Sample{loaction=null, number=33, items=[], map={}, serialNumber=null}}, serialNumber=4299}
<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import fxml.sample.*?>

<Sample xmlns:fx="http://javafx.com/fxml/1" Container.number="5" loaction="washingtonDc">
    
    <!-- set serialNumber property (type coercion) -->
    <serialNumber>
        <Container fx:value="99"/>
    </serialNumber>
    
    <!-- Add elements to default property-->
    <Container fx:value="a"/>
    <Container fx:value="b"/>
    <Container fx:value="c"/>
    <Container fx:value="d"/>
    <Container fx:value="e"/>
    <Container fx:value="f"/>
    
    <!-- fill readonly map property -->
    <map g="9.81">
        <hello>
            <Container fx:value="A"/>
        </hello>
        <answer>
            <Container fx:value=""/>
        </answer>
        <sample>
            <Sample>
                <!-- static setter-->
                <Container.number>
                    <Integer fx:value="33" />
                </Container.number>
            </Sample>
        </sample>
    </map>
</Sample>


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow