我目前正在Controller中设置转换器(StringConverter),但是我想知道是否可以直接从FXML文件中进行转换吗?
谢谢
答案 0 :(得分:2)
FXMLLoader
通过反射实例化类型。这意味着该类必须具有其参数用@NamedArg
注释的构造函数或具有零参数的构造函数。 @NamedArg
解决了参数名不一定要保存在字节码中的问题,正如this answer更好地解释的那样。其余属性将根据 FXML简介的this section中指定的规则在对象上设置。总之,FXML属性/元素必须在目标类中具有相应的属性设置器,只读List
属性或只读Map
属性。
这对您的问题意味着什么
StringConverter
的实现。
@NamedArg
带注释的构造函数参数。StringConverter
设置为打开的对象。
在源代码上,看起来没有任何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>