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
。
是否可以在创建后调整 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
。