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