我找不到任何关于在PropertySheet
中自定义Editor
的示例,但我想现在我已经弄清楚了。在我的情况下,我只想使用一个Slider
作为Number
的编辑器。这可能不太实用,因为你无法看到滑块的值,但我想滑块可以被简单地替换为带有滑块和标签的面板。
首先,我们需要实现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");
customDataMap.put("basic.My Date", LocalDate.of(2016, Month.JANUARY, 1));
customDataMap.put("misc.My Enum", SomeEnum.ALPHA);
customDataMap.put("misc.My Boolean", false);
customDataMap.put("misc.My Number", 500);
customDataMap.put("misc.My Color", Color.ALICEBLUE);
}
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() {
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() {
if (Number.class.isAssignableFrom(getType())) return Optional.of(NumberSliderEditor.class);
return Optional.empty();
}
}
接下来是
PropertyEditor
实现,它是一个
Node
和一组方法,用于将属性项值与控件连接起来。第一个构造函数是实现所必需的,第二个构造函数是必需的,因为方法
Editors.createCustomEditor(Item)
使用反射查找此构造函数。您不必使用此方法,但默认的PropertyEditorFactory很可能依赖于此。
如果出于某种原因要避免使用反射,则不需要在
您的Item
中覆盖
getPropertyEditorClass()
,并且可以使用
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,它有一个默认的接口实现,所以你通常不会查看它。这个答案中说不要查看这个方法的事实也没有帮助 :/