javafx
एफएक्सएमएल और कंट्रोलर्स
खोज…
वाक्य - विन्यास
- xmlns: fx = " http://javafx.com/fxml " // नामस्थान घोषणा
उदाहरण 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
विधि कई क्रियाएं करती है, और यह उस क्रम को समझने के लिए उपयोगी है जिसमें वे होते हैं। इस सरल उदाहरण में:
FXMLLoader
FXML फ़ाइल को पढ़ता और पार्स करता है। यह फ़ाइल में परिभाषित तत्वों के अनुरूप ऑब्जेक्ट बनाता है, और किसी भीfx:id
ध्यान देता हैfx:id
विशेषताओं को उन पर परिभाषित किया गया है।चूंकि एफएक्सएमएल फ़ाइल के रूट तत्व ने एक
fx:controller
परिभाषित किया थाfx:controller
विशेषता,FXMLLoader
उस वर्ग का एक नया उदाहरण बनाता है जिसे वह निर्दिष्ट करता है। डिफ़ॉल्ट रूप से यह निर्दिष्ट वर्ग पर नो-तर्क कंस्ट्रक्टर को लागू करने से होता है।fx:id
साथ कोई भी तत्वfx:id
विशेषताओं को परिभाषित किया गया है जिसमें नियंत्रक में फ़ील्ड के साथ मेल खाने वाले नाम हैं, और जो या तोpublic
(अनुशंसित नहीं हैं) या एनोटेट@FXML
(अनुशंसित) उन संबंधित क्षेत्रों में "इंजेक्ट" हैं। तो इस उदाहरण में, चूंकिfx:id="label"
साथ FXML फ़ाइल में एकLabel
हैfx:id="label"
और नियंत्रक संकेत के रूप में एक फ़ील्ड@FXML private Label label ;
label
फ़ील्ड कोFXMLLoader
द्वारा बनाए गएLabel
उदाहरण से आरंभ किया जाता है।घटना संचालकों को एफएक्सएमएल फ़ाइल में किसी भी तत्व के साथ onXXX
onXXX="#..."
गुणों के साथ पंजीकृत किया गया है। ये ईवेंट हैंडलर नियंत्रक वर्ग में निर्दिष्ट विधि का आह्वान करते हैं। इस उदाहरण में, चूंकिButton
मेंonAction="#handleButtonAction"
, और नियंत्रक एक विधि को परिभाषित करता है@FXML private void handleButtonAction(ActionEvent event) { ... }
जब बटन पर कोई कार्रवाई की जाती है (जैसे उपयोगकर्ता इसे दबाता है), तो यह विधि लागू होती है। विधि में
void
वापसी प्रकार होना चाहिए, और या तो घटना प्रकार से मेल खाने वाले पैरामीटर को परिभाषित कर सकता है (इस उदाहरण मेंActionEvent
), या अपने मापदंडों को परिभाषित कर सकता है।अंत में, यदि नियंत्रक वर्ग एक
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();
यह जटिल लग सकता है, लेकिन यह उपयोगी हो सकता है, अगर एफएक्सएमएल यह तय करने में सक्षम होना चाहिए कि इसे किस नियंत्रक वर्ग की आवश्यकता है।
एफएक्सएमएल में इंस्टेंस निर्माण
निम्न वर्ग का उपयोग यह दर्शाने के लिए किया जाता है कि कक्षाओं के उदाहरण कैसे बनाए जा सकते हैं:
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?>
@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>