FXML 中的例項建立

以下類用於演示如何建立類的例項:

Version < JavaFX 8

由於 @NamedArg 註釋不可用,因此必須刪除 Person(@NamedArg("name") String name) 中的註釋。

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

Version >= 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 屬性可用於將其值傳遞給 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: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