【问题标题】:Is it possible to refer to converters in JavaFX through FXML?是否可以通过 FXML 引用 JavaFX 中的转换器?
【发布时间】:2019-06-11 02:27:07
【问题描述】:

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

谢谢

【问题讨论】:

  • 取决于转换器,以及 getter+setter 是否可用于目标属性或具有 @NamedArg 的构造函数是否存在初始化属性。
  • 你能不能给我更多的细节(作为答案)或者引导我去搜索更多关于它的关键词?谷歌不是很有帮助。

标签: java javafx fxml


【解决方案1】:

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

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

  1. 这取决于StringConverter的实现。
    • 它必须有一个无参数的构造函数或有@NamedArg注解的构造函数参数。
  2. 这取决于您设置StringConverter 的对象。
    • 它必须具有适当注释的构造函数参数,或者该属性必须具有设置器。否则 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>

【讨论】:

  • 您好,感谢您的精彩解释!现在,从更实际的角度来看,你们一般是从 FXML 中设置转换器还是从 Controller 中设置?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-23
  • 2016-08-08
  • 1970-01-01
  • 2014-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多