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

Is it possible to refer to converters in JavaFX through FXML?

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

谢谢

FXMLLoader 通过反射实例化类型。这意味着 class 必须有一个构造函数,其参数用 FXML 简介@NamedArg or a constructor with zero parameters. The @NamedArg solves the issue of parameter names not necessarily being saved in the byte code, as better explained by this answer. The remaining attributes will be set on the object according to the rules specified in this section 注释。总而言之,FXMLattribute/element必须有对应的属性setter,只读List属性,或只读Map属性 在目标 class.

这对你的问题意味着什么:

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

查看源代码,似乎没有任何 StringConverter 实现使用 @NamedArg 注释。然而,它们通常确实提供了一个无参数的构造函数。这将允许您使用它们,但您可能无法自定义它们。例如,当使用 LocalDateStringConverter 时,您将无法自定义格式。

也就是说,您始终可以创建工厂 class 并在 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>