代码之家  ›  专栏  ›  技术社区  ›  devoured elysium

是否可以通过fxml引用javafx中的转换器?

  •  0
  • devoured elysium  · 技术社区  · 6 年前

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

    谢谢

    1 回复  |  直到 6 年前
        1
  •  2
  •   Slaw    6 年前

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

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

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

    看看源代码,它看起来不像 串级变换器 实现使用 @ NamedArg 注释。但是,它们通常提供一个无参数构造函数。这将允许您使用它们,但您可能会失去自定义它们的能力。例如,当使用 LocalDateStringConverter 您将无法自定义格式。

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

    public class Converters {
    
        public static StringConverter<LocalDate> myAwesomeConverter() {
            DateTimeFormatter formatter = ...;
            return new LocalDateStringConverter(formatter, formatter);
        }
    
    }
    
    <DatePicker>
        <converter>
            <Converters fx:factory="myAwesomeConverter"/>
        </converter>
    </DatePicker>
    

    或者,如果不需要自定义格式化程序,可以使用转换器的no arg构造函数。

    <DatePicker>
        <converter>
            <LocalDateStringConverter/>
        </converter>
    </DatePicker>
    
    推荐文章