Каково соответствие между типами свойств и их редакторами в SettingsPane?

SettingsPane может автоматически выбирать редактор свойств. В документации написано

Элемент управления SettingsPane предназначен для того, чтобы разработчики могли легко представить конечным пользователям список параметров, которые можно изменить, используя соответствующие встроенные редакторы в соответствии с типом этих параметров.

В связи с этим у меня 2 вопроса:

  1. Какой компонент выбирается для каждого типа недвижимости? Я видел, что у логических значений есть переключатель вправо-влево, у чисел есть текстовое поле, у ObjectProperty<Color> есть выбор цвета (который выскакивает на рабочем столе - я не знаю, что произойдет на мобильном телефоне?). Какие остальные отображения?

  2. Когда я пытаюсь получить свойство перечисления: ObjectProperty<EnumType> я получаю сообщение об ошибке отсутствия рендерера. Я думаю, что поле со списком будет использоваться по умолчанию для выбора из известного числа констант перечисления, не так ли? Я знаю, что могу сделать это с фабрикой редакторов самостоятельно, но я все равно хотел спросить об этом, может быть, в качестве предложения, если я не ошибся.

Изменить

Я снова смотрю на пример SettingPane для пользовательского редактора: http://docs.gluonhq.com/charm/javadoc/4.3.7/com/gluonhq/charm/glisten/control/SettingsPane.html, и я заметил 2 проблемы:

  1. В примере кода редактора флажков см. мои комментарии:

    public class CheckBoxEditor implements OptionEditor<Boolean> {
        private final CheckBox checkBox;
        public CheckBoxEditor(Option<Boolean> option) {
           this.checkBox = new CheckBox();
           valueProperty().bindBidirectional(option.valueProperty());
        }} // only 1 }
        @Override public Node getEditor() { return checkBox; }
        @Override public final Property<Boolean> valueProperty() { return checkBox.selectedProperty(); }
        @Override public Boolean getValue() { return checkBox.isSelected(); }
        @Override public void setValue(Boolean value) { checkBox.setSelected(value); }
    // missing }
    
  2. В примере использования:

    final Option<BooleanProperty> dateOption = new DefaultOption(MaterialDesignIcon.DATE_RANGE.graphic(),
           "Show Date", "Show the date", "Category", settings.showDateProperty(), true,
           option -> new CheckBoxEditor((Option<Boolean>) option));
    

лямбда дает мне ошибку компиляции:

Type mismatch: cannot convert from CheckBoxEditor to OptionEditor<BooleanProperty>

и option относится к типу Option<BooleanProperty>, а приведение к Option<Boolean>. Ошибка?


person Mark    schedule 10.09.2017    source источник


Ответы (1)


Редакторы по умолчанию для SettingsPane control< /а> являются:

  • Строка: TextField.
  • Числа (byte и Byte, Short и Short, int и Integer, long и Long, float и Float, double и Double, BigInteger, BigDecimal): TextField с применением TextFormatter.
  • Логическое значение: ToggleButton.
  • Местная дата: DatePicker.
  • Цвет/краска: ColorPicker.
  • Перечисления: ComboBox.

Вы можете переопределить это, установив свою собственную фабрику с помощью SettingsPane::setOptionEditorFactory, но вам придется предоставить все необходимые редакторы.

Также вы можете переопределить определенный редактор или добавить свой собственный редактор для данного типа.

Это пример варианта Enum:

enum OS { WINDOWS, MAC, LINUX, OTHER }

ObjectProperty<OS> os = new SimpleObjectProperty<>(OS.MAC);

Option<OS> OSOption = new DefaultOption(MaterialDesignIcon.LAPTOP.graphic(), "Operative System", 
            "Set the preferred OS", "Operative System", os, true);

Что касается JavaDoc, да, это опечатки, которые нужно исправить. Я подал и выдал по нему.

Что касается запуска образца, у меня он работает как есть. См. рисунок выше для опции WiFi:

final BooleanProperty wifi = new SimpleBooleanProperty();
final Option<BooleanProperty> wifiOption = new DefaultOption(MaterialDesignIcon.WIFI.graphic(), 
            "WiFi", "Set Wifi or Wire", "Devices", wifi, true, 
            option -> new CheckBoxEditor((Option<Boolean>) option));
person José Pereda    schedule 11.09.2017
comment
После тестирования я обнаружил, что ошибка для перечисления в моем втором вопросе возникает, когда значение свойства равно нулю, тогда это печатается Error, no rendering options for: <option name>. Что касается ошибки компиляции лямбда, я обнаружил, что это происходит, если вы делаете DefaultOption универсальным (DefaultOption<> или DefaultOption<BooleanProperty>). Не уверен, почему. - person Mark; 12.09.2017
comment
Для каждого свойства вам нужен способ отобразить его значение. Вы можете определить конвертер, если вам нужно. Что касается универсального, использование new DefaultOption<> прекрасно работает, если вы используете редактор по умолчанию, но при добавлении пользовательского редактора типы BooleanProperty и Boolean не совпадают, и вы не можете. Это сработало бы, если бы тип Option был просто Booleanwifi.getValue()), но тогда его нельзя было бы наблюдать. - person José Pereda; 12.09.2017