Можно ли ссылаться на конвертеры в JavaFX через FXML?

Это может быть удобно при использовании разделяемой памяти, среди других применений ... Например: http://www.boost.org/doc/libs/1_51_0/doc/html/interprocess/synchronization_mechanisms.html# interprocess.synchronization_mechanisms.conditions.conditions_anonymous_example

0
задан devoured elysium 16 January 2019 в 22:52
поделиться

1 ответ

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>
0
ответ дан Slaw 16 January 2019 в 22:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: