SettingsPane、SliderEditor (OptionEditor) 创建后更改值

SettingsPane, SliderEditor (OptionEditor) changing values after creation

是否可以在创建后调整 OptionEditor 子 class 的值?

我正在使用示例 http://docs.gluonhq.com/samples/notes/ 中的 SliderEditor 代码来创建 SliderEditor。

public class SliderOption extends OptionBase<Number> {

private final int min;
private final int max;

public SliderOption(Node graphic, String caption, String description, String category, IntegerProperty value,
                    boolean isEditable, int min, int max) {
    super(graphic, caption, description, category, (Property<Number>) value, isEditable);
    this.min = min;
    this.max = max;
}

@Override
public Property<Number> valueProperty() {
    return value;
}

@Override
public Optional<Function<Option<Number>, OptionEditor<Number>>> editorFactoryProperty() {
    return Optional.of(option -> new SliderEditor(option, min, max));
}

public class SliderEditor implements OptionEditor<Number> {

    private final Slider slider;

    public SliderEditor(Option<Number> option, int min, int max) {
        slider = new Slider(min, max, option.valueProperty().getValue().doubleValue());
        slider.setSnapToTicks(true);
        slider.setMajorTickUnit(1);
        slider.setMinorTickCount(0);
        slider.setShowTickLabels(true);
        valueProperty().bindBidirectional(option.valueProperty());
    }

    @Override
    public Node getEditor() {
        return slider;
    }

    @Override
    public Number getValue() {
        return slider.getValue();
    }

    @Override
    public void setValue(Number value) {
        slider.setValue(value.doubleValue());
    }

    @Override
    public final Property<Number> valueProperty() {
        return (Property<Number>) slider.valueProperty();
    }
  }

}

正在创建设置面板和滑块:

    SettingsPane settingsPane  = new SettingsPane();
    settingsPane.setSearchBoxVisible(false);
    final Option<Number> sliderOption = new SliderOption(MaterialDesignIcon.PERSON.graphic(),
            "Text", "Set the text size", null,settings.getProperty() , true, 0, 10);
    settingsPane.getOptions().addAll(sliderOption, new DefaultOption(Option.SEPARATOR)); 

效果很好,但在 buttonEvent 中我想禁用滑块:

     Slider slider = (Slider)settingsPane.getOptionEditorFactory().call(sliderOption).getEditor();
     slider.setDisable(true);
     slider.setValue(10);

Disable 什么都不做,也试过 setmax/setshowticklabels none 工作,除了 setvalues 它工作得很好。似乎我无法修改滑块,除了它的值。我做错了什么?

这不起作用,因为 setDisable 不是在原始 Slider 上调用,而是在工厂方法创建的新实例上调用:

  @Override
    public Optional<Function<Option<Number>, OptionEditor<Number>>> editorFactoryProperty() {
         return Optional.of(option -> new SliderEditor(option, min, max, slider));
    }

因此,不必每次都创建一个新实例,您必须 return 原始实例:

  public  class SliderOption extends OptionBase<Number> {

        private final SliderEditor sliderEditor;

        public SliderOption(Node graphic, String caption, String description, String category, IntegerProperty value,
                            boolean isEditable, int min, int max) {
            super(graphic, caption, description, category, value, isEditable);

            sliderEditor = new SliderEditor(this, min, max);
        }

        @Override
        public Property<Number> valueProperty() {
            return value;
        }

        @Override
        public Optional<Function<Option<Number>, OptionEditor<Number>>> editorFactoryProperty() {
            // return Optional.of(option -> new SliderEditor(option, min, max, slider));
            return Optional.of(option -> sliderEditor);
        }
    }

Disable does nothing, also tried setmax/setshowticklabels none work except setvalues it works like a charm.

setValue 起作用是因为新 Slider 实例的 valueProperty 双向绑定到现有 Option 实例的 valueProperty,后者也绑定到原始 Slider