Можно ли ссылаться на конвертеры в JavaFX через FXML? - PullRequest
0 голосов
/ 17 января 2019

Я сейчас настраиваю свои конвертеры (StringConverter) в контроллере, но мне было интересно, можно ли это сделать прямо из файла FXML?

Спасибо

1 Ответ

0 голосов
/ 17 января 2019

FXMLLoader создает экземпляры типов посредством отражения. Это означает, что класс должен иметь конструктор, чьи параметры помечены @NamedArg, или конструктор с нулевыми параметрами. @NamedArg решает проблему с именами параметров, которые не обязательно сохраняются в байтовом коде, как лучше объяснено этим ответом . Остальные атрибуты будут установлены для объекта в соответствии с правилами, указанными в этом разделе из Введение в FXML . Подводя итог, можно сказать, что атрибут / элемент FXML должен иметь соответствующий установщик свойств, свойство List только для чтения или свойство Map только для чтения в целевом классе.

Что все это значит для вашего вопроса:

  1. Это зависит от реализации StringConverter.
    • Он должен иметь конструктор без аргументов или иметь @NamedArg аннотированные параметры конструктора.
  2. Это зависит от объекта, на который вы устанавливаете StringConverter.
    • Он должен иметь соответственно аннотированный параметр конструктора или свойство должно иметь установщик. В противном случае загрузчик FXML не будет знать, как настроить конвертер.

Глядя на исходный код, похоже, что ни одна из реализаций StringConverter не использует аннотацию @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>

Или, если вам не нужен пользовательский форматировщик, вы можете просто использовать конструктор без аргументов.

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