是否可以通过FXML引用JavaFX中的转换器?

时间:2019-01-16 22:52:23

标签: java javafx fxml

我目前正在Controller中设置转换器(StringConverter),但是我想知道是否可以直接从FXML文件中进行转换吗?

谢谢

1 个答案:

答案 0 :(得分:2)

FXMLLoader通过反射实例化类型。这意味着该类必须具有其参数用@NamedArg注释的构造函数或具有零参数的构造函数。 @NamedArg解决了参数名不一定要保存在字节码中的问题,正如this answer更好地解释的那样。其余属性将根据 FXML简介this section中指定的规则在对象上设置。总之,FXML属性/元素必须在目标类中具有相应的属性设置器,只读List属性或只读Map属性。

这对您的问题意味着什么

  1. 这取决于StringConverter的实现。
    • 它必须具有无参数构造函数或具有@NamedArg带注释的构造函数参数。
  2. 这取决于您将StringConverter设置为打开的对象。
    • 它必须具有适当注释的构造函数参数,或者属性必须具有setter。否则,FXML加载程序将不知道如何设置转换器。

在源代码上,看起来没有任何StringConverter实现使用@NamedArg批注。但是,它们通常提供无参数的构造函数。这将允许您使用它们,但是您可能无法自定义它们。例如,使用LocalDateStringConverter时将无法自定义格式。

也就是说,您总是可以创建一个工厂类,并在FXML文件中使用fx:factory

public class Converters {

    public static StringConverter<LocalDate> myAwesomeConverter() {
        DateTimeFormatter formatter = ...;
        return new LocalDateStringConverter(formatter, formatter);
    }

}
<DatePicker>
    <converter>
        <Converters fx:factory="myAwesomeConverter"/>
    </converter>
</DatePicker>

或者,如果您不想使用自定义格式化程序,则可以只使用转换器的无参数构造函数。

<DatePicker>
    <converter>
        <LocalDateStringConverter/>
    </converter>
</DatePicker>