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
。