수색…


통사론

FXML 예제

단추와 레이블 노드를 포함하는 AnchorPane 을 개괄하는 간단한 FXML 문서 :

<?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>

이 예제 FXML 파일은 컨트롤러 클래스와 연관되어 있습니다. 이 경우 FXML과 컨트롤러 클래스 간의 연관은 클래스 이름을 FXML : fx:controller="com.example.FXMLDocumentController" 의 루트 요소에있는 fx:controller 특성 값으로 지정하여 수행됩니다. 컨트롤러 클래스를 사용하면 FXML 파일에 정의 된 UI 요소에 대한 사용자 작업에 대한 응답으로 Java 코드를 실행할 수 있습니다.

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 속성을 기록합니다.

  2. FXML 파일의 루트 요소는 fx:controller 속성을 정의 FXMLLoader 는 지정한 클래스의 새 인스턴스 를 만듭니다. 기본적으로 이것은 지정된 클래스에서 인수가없는 생성자를 호출하여 발생합니다.

  3. 필드 이름이 일치하고 public (권장되지 않음) 또는 주석이있는 @FXML (권장) 인 필드가 컨트롤러에있는 해당 필드에 "주입"되어있는 fx:id 속성을 가진 요소가 있습니다. 이 예에서하며,이 있기 때문에 Label 과 FXML 파일의 fx:id="label" 로 정의 컨트롤러와 필드는

    @FXML
    private Label label ;
    

    label 필드는 FXMLLoader 의해 작성된 Label 인스턴스로 초기화됩니다.

  4. 이벤트 처리기는 onXXX onXXX="#..." 속성이 정의 된 FXML 파일의 요소로 등록됩니다. 이러한 이벤트 핸들러는 컨트롤러 클래스에서 지정된 메서드를 호출합니다. 이 예제에서 Button 에는 onAction="#handleButtonAction" 이 있고 컨트롤러는 메서드를 정의하므로

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

    버튼에 액션이 발생하면 (예 : 사용자가 버튼을 누르면)이 메서드가 호출됩니다. 메소드는 void 반환 유형을 가져야하며 이벤트 유형 (이 예에서는 ActionEvent 과 일치하는 매개 변수를 정의하거나 매개 변수를 정의 할 수 없습니다.

  5. 마지막으로 컨트롤러 클래스가 initialize 메서드를 정의하면이 메서드가 호출됩니다. 이것은 @FXML 필드가 삽입 된 후에 발생 @FXML 메소드에서 안전하게 액세스 할 수 있으며 FXML 파일의 요소에 해당하는 인스턴스로 초기화됩니다. initialize() 메소드는 매개 변수를 취하거나 URLResourceBundle 사용할 수 있습니다. 후자의 경우,이 매개 변수에 의해 채워집니다 URL FXML 파일의 위치를 나타내는, 및 ResourceBundle 온 설정 FXMLLoader 를 통해 loader.setResources(...) . 이들 중 하나는 설정되지 않은 경우 null 일 수 있습니다.

중첩 된 컨트롤러

단일 컨트롤러를 사용하여 단일 FXML에 전체 UI를 만들 필요가 없습니다.

<fx:include> 태그는 하나의 fxml 파일을 다른 파일에 포함시키는 데 사용할 수 있습니다. 포함 된 fxml의 컨트롤러는 FXMLLoader 의해 생성 된 다른 모든 객체와 마찬가지로 포함 파일의 컨트롤러에 삽입 될 수 있습니다.

이는 <fx:include> 요소에 fx:id 속성을 추가하여 수행됩니다. 이렇게하면 포함 된 fxml의 컨트롤러가 <fx:id value>Controller 라는 이름으로 필드에 주입됩니다.

예 :

fx : id 값 주입 용 필드 이름
fooController
답변 42 답변 42 컨트롤러
xYz xYzController

샘플 fxmls

계수기

이것은 Text 노드가있는 StackPane 을 포함하는 fxml입니다. 이 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;
    }
    
}

fxml 포함

<?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의 컨트롤러가이 컨트롤러에 삽입됩니다. 여기서 ButtononAction 이벤트 핸들러는 카운터를 증가시키는 데 사용됩니다.

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();
    }

}

코드가 outer.fxml 과 같은 패키지에있는 클래스에서 호출되었다고 가정하면 fxmls를 다음과 같이로드 할 수 있습니다.

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

블록 및

때로는 요소가 fxml의 일반적인 객체 구조 외부에서 생성되어야합니다.

블록 정의 가 작동하는 곳입니다.

<fx:define> 요소 안의 내용은 부모 요소 용으로 생성 된 개체에 추가되지 않습니다.

<fx:define> 의 모든 자식 요소는 fx:id 속성이 필요합니다.

이 방법으로 생성 된 객체는 나중에 <fx:reference> 요소를 사용하거나 표현식 바인딩을 사용하여 참조 할 수 있습니다.

<fx:reference> 요소는 <fx:reference> 요소가 <fx:reference> 요소의 fx:id 특성과 동일한 값을 사용하여 처리되기 전에 처리되는 fx:id 특성을 가진 요소를 참조하는 데 사용할 수 있습니다 <fx:reference> <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에서로드 된 장면으로 전달되어야합니다.

해결책

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();

controllerFactory를 사용하여 FXML에 매개 변수 전달하기

문제 : 일부 데이터는 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을로드하는 데 사용되는 코드

문자열 데이터 = "Hello World!";

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();

이것은 복잡해 보일 수도 있지만 fxml이 필요한 제어기 클래스를 결정할 수 있으면 유용 할 수 있습니다.

FXML로 인스턴스 생성

다음 클래스는 클래스의 인스턴스를 생성하는 방법을 보여주기 위해 사용됩니다.

JavaFX 8

Person(@NamedArg("name") String name) 주석은 @NamedArg 주석을 사용할 수 @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 예제에서 imports 섹션은 생략됩니다. 그러나 fxml은 다음으로 시작해야합니다.

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

그 다음에 fxml 파일에 사용 된 모든 클래스를 가져 오는 imports 섹션이 있습니다. 이러한 가져 오기는 정적이 아닌 가져 오기와 비슷하지만 처리 지침으로 추가됩니다. java.lang 패키지의 클래스도 임포트해야합니다.

이 경우 다음 가져 오기를 추가해야합니다.

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

JavaFX 8

@NamedArg 주석이 달린 생성자

모든 파라미터로 주석 된 생성자 있으면 @NamedArg 및 모든 값 @NamedArg 주석은 fxml에 존재 생성자는 이러한 매개 변수와 함께 사용한다.

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

로드 된 경우 두 콘솔 결과는 다음과 같이됩니다.

Person(String)

args 생성자 없음

적절한 @NamedArg 주석이있는 생성자가없는 경우 매개 변수를 사용하지 않는 생성자가 사용됩니다.

생성자에서 @NamedArg 주석을 제거하고로드 해보십시오.

<Person name="John"/>

이것은 매개 변수없이 생성자를 사용합니다.

산출:

Person()
setter

fx:value 속성

fx:value 속성은 String 매개 변수를 사용하고 사용할 인스턴스를 반환하는 static valueOf 메서드에 값을 전달하는 데 사용할 수 있습니다.

<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: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:constantstatic final 필드에서 값을 fx:constant 수 있습니다.

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

클래스를 초기화 할 때 생성 된 JOHN 을 참조하기 때문에 출력이 생성되지 않습니다.

속성 설정

fxml의 객체에 데이터를 추가하는 방법에는 여러 가지가 있습니다.

<property> 태그

등록 정보의 이름이있는 태그는 인스턴스 작성에 사용되는 요소의 하위로 추가 될 수 있습니다. 이 태그의 자식은 setter를 사용하여 속성에 할당되거나 속성의 내용에 추가됩니다 (읽기 전용 목록 /지도 속성).

기본 속성

클래스는 @DefaultProperty 어노테이션으로 어노테이션 될 수 있습니다. 이 경우 요소는 특성 이름이있는 요소를 사용하지 않고 하위 요소로 직접 추가 할 수 있습니다.

property="value" 속성

특성 이름으로 특성 이름을 사용하고 특성 값으로 값을 사용하여 특성을 지정할 수 있습니다. 태그의 하위 요소로 다음 요소를 추가하는 것과 같은 효과가 있습니다.

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

고정 세터

static 세터를 사용하여 속성을 설정할 수도 있습니다. 이것들은 요소를 첫 번째 매개 변수로, 두 번째 매개 변수로 설정할 값을 가지는 setProperty 라는 static 메서드입니다. 이러한 메서드는 모든 클래스에서 사용할 수 있으며 일반적인 속성 이름 대신 ContainingClass.property 를 사용하여 사용할 수 있습니다.

참고 : 현재 값 유형이 String 이 아닌 경우 해당 정적 getter 메서드 (즉, getProperty 라는 정적 메서드가 정적 설정자와 동일한 클래스의 매개 변수로 요소를 가져 오는 정적 메서드)를 사용하는 것이 필요합니다.

유형 강요

다음의 메커니즘은 예를 들어 setter 메서드의 매개 변수 유형에 맞게 할당하는 동안 올바른 클래스의 객체를 가져 오는 데 사용됩니다.

클래스가 할당 가능한 경우 값 자체가 사용됩니다.

그렇지 않으면 값은 다음과 같이 변환됩니다.

대상 유형 사용 된 값 (소스 값 s )
Boolean , boolean Boolean.valueOf(s)
char , Character s.toString.charAt(0)
다른 원시적 형 또는 래퍼 형 타겟 형에 적절한 메소드. sNumber 인 경우는 그 래퍼 형의 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 클래스를 초기화하지 않고 현재 스레드의 컨텍스트 ClassLoader 를 사용하여 호출되는 Class.forName(s.toString())
열거 형 valueOf 메서드의 결과는 s 가 소문자로 시작하는 String 인 경우 각 대문자 앞에 _ 구분 된 모든 대문자 String 로 추가로 변환됩니다.
다른 a로 리턴 값 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