我找不到PropertySheet
的自定义Editor
的任何示例,但我想我现在已经明白了。在我的情况下,我只想使用Slider
作为Number
的编辑器。这可能不太实际,因为您无法看到Slider的价值,但我想像Slider可以简单地被带有滑块和标签的窗格取代。
首先,我们需要我们的实现Item
,在这里稍微修改了controlsfx-samples的版本。 Map
被搬到这个班,但可能在任何地方。虽然你可能根本不想使用地图,因为把类别和名称组合起来已经不太实际了;加上没有空间来创建项目的描述。
public class CustomPropertyItem implements PropertySheet.Item {
public static Map<String, Object> customDataMap = new LinkedHashMap<>();
static {
customDataMap.put("basic.My Text", "Same text"); // Creates a TextField in property sheet
customDataMap.put("basic.My Date", LocalDate.of(2016, Month.JANUARY, 1)); // Creates a DatePicker
customDataMap.put("misc.My Enum", SomeEnum.ALPHA); // Creates a ChoiceBox
customDataMap.put("misc.My Boolean", false); // Creates a CheckBox
customDataMap.put("misc.My Number", 500); // Creates a NumericField
customDataMap.put("misc.My Color", Color.ALICEBLUE); // Creates a ColorPicker
}
private String key;
private String category, name;
public CustomPropertyItem(String key)
{
this.key = key;
String[] skey = key.split("\\.", 2);
category = skey[0];
name = skey[1];
}
@Override
public Class<?> getType() {
return customDataMap.get(key).getClass();
}
@Override
public String getCategory() {
return category;
}
@Override
public String getName() {
return name;
}
@Override
public String getDescription() {
// doesn't really fit into the map
return null;
}
@Override
public Object getValue() {
return customDataMap.get(key);
}
@Override
public void setValue(Object value) {
customDataMap.put(key, value);
}
@Override
public Optional<ObservableValue<? extends Object>> getObservableValue() {
return Optional.empty();
}
@Override
public Optional<Class<? extends PropertyEditor<?>>> getPropertyEditorClass() {
// for an item of type number, specify the type of editor to use
if (Number.class.isAssignableFrom(getType())) return Optional.of(NumberSliderEditor.class);
// ... return other editors for other types
return Optional.empty();
}
}
接下来,该实施PropertyEditor
,这是一个Node
和一组与控制连接属性项值的方法。第一个构造函数对于实现需要和需要第二个构造函数,因为方法Editors.createCustomEditor(Item)
使用反射来查找此构造函数。您不必使用此方法,但默认的PropertyEditorFactory最可能依赖于此。 如果你想避免由于某种原因反思,你不需要覆盖getPropertyEditorClass()
你的Item
,你可以使用setPropertyEditorFactory(Callback)
并在那里创建PropertyEditor
的新实例。 请注意,根本不需要使用setPropertyEditorFactory(Callback)
(在本例中)。
public class NumberSliderEditor extends AbstractPropertyEditor<Number, Slider> {
public NumberSliderEditor(Item property, Slider control)
{
super(property, control);
}
public NumberSliderEditor(Item item)
{
this(item, new Slider());
}
@Override
public void setValue(Number n) {
this.getEditor().setValue(n.doubleValue());
}
@Override
protected ObservableValue<Number> getObservableValue() {
return this.getEditor().valueProperty();
}
}
从这里开始,您只需创建PropertySheet
并添加所有地图条目。
PropertySheet propertySheet = new PropertySheet();
for (String key : CustomPropertyItem.customDataMap.keySet()) propertySheet.getItems().add(new CustomPropertyItem(key));
我希望这是有帮助的人,因为似乎没有到这里来了任何的例子,展示了使用定制Editor
的。对此的唯一暗示是Item.getPropertyEditorClass()
的javadoc,它有一个默认的接口实现,所以你通常不会看它。事实上,在这里有一个答案,说不看这种方法也没有帮助:/
你看过样品吗?具体的HelloPropertySheet示例。 –