我一直在寻找使用 ControlsFX PropertySheet 的任何好的例子,但除了这个找不到任何东西。

https://www.google.nl/search?q=Main.java+amazonaws.com&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:nl:official&client=firefox-a&channel=sb&gfe_rd=cr&ei=d5aeU5bvBI3k-gan94HQBA#channel=sb&q=https%3A%2F%2Fbitbucket-assetroot.s3.amazonaws.com%2Fcontrolsfx%2Fcontrolsfx+Main.java&rls=org.mozilla:nl:official

在这个例子中,包含 NameItem 对象的 ObservableList 项目被添加到它的构造函数中的 PropertySheet 对象,就像文档所说的那样。

http://controlsfx.bitbucket.org/org/controlsfx/control/PropertySheet.html

但是,正如本文档所述,PropertySheet 的一列“提供了一个 PropertyEditor,允许最终用户操作属性”。它甚至说,在 Editors 包中提供的众多编辑器中,有一个“CheckEditor、ChoiceEditor、TextEditor 和 FontEditor”。

我不想局限于我的 NameItem 示例。我还想添加复选框、选择框和其他动态编辑器元素。任何人都可以举例说明如何使用一个或多个编辑器来构建一个简单的 PropertySheet?

最佳答案

PropertySheet 确实支持一些开箱即用的属性编辑器,具体取决于属性类型。

以下示例是 ControlsFX 示例应用程序的扩展。它显示了 String、LocalDate、Enum、Boolean 和 Integer 类型如何分别映射到 TextField、DatePicker、ChoiceBox、CheckBox 和 NumericField。

public class PropertySheetExample extends VBox {
    private static Map<String, Object> customDataMap = new LinkedHashMap<>();
    static {
        customDataMap.put("Group 1#My Text", "Same text"); // Creates a TextField in property sheet
        customDataMap.put("Group 1#My Date", LocalDate.of(2000, Month.JANUARY, 1)); // Creates a DatePicker
        customDataMap.put("Group 2#My Enum Choice", SomeEnumType.EnumValue); // Creates a ChoiceBox
        customDataMap.put("Group 2#My Boolean", false); // Creates a CheckBox
        customDataMap.put("Group 2#My Number", 500); // Creates a NumericField
    }

    class CustomPropertyItem implements PropertySheet.Item {
        private String key;
        private String category, name;

        public CustomPropertyItem(String key) {
            this.key = key;
            String[] skey = key.split("#");
            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);
        }
    }

    public PropertySheetExample {
        ObservableList<PropertySheet.Item> list = FXCollections.observableArrayList();
        for (String key : customDataMap.keySet())
            list.add(new CustomPropertyItem(key));

        PropertySheet propertySheet = new PropertySheet(list);
        VBox.setVgrow(propertySheet, Priority.ALWAYS);
        getChildren().add(propertySheet);
    }
}

这种行为可以通过两种方式进一步扩展。首先,现有编辑器可用于默认属性编辑器工厂不支持的类型。以下示例设置新的属性编辑器工厂,它将为 List 类型创建 ChoiceBox。对于其他类型,它将编辑器创建委托(delegate)给默认工厂。
SimpleObjectProperty<Callback<PropertySheet.Item, PropertyEditor<?>>> propertyEditorFactory = new SimpleObjectProperty<>(this, "propertyEditor", new DefaultPropertyEditorFactory());

propertySheet.setPropertyEditorFactory(new Callback<PropertySheet.Item, PropertyEditor<?>>() {
    @Override
    public PropertyEditor<?> call(PropertySheet.Item param) {
        if(param.getValue() instanceof List) {
            return Editors.createChoiceEditor(param, (List) param.getValue());
        }

        return propertyEditorFactory.get().call(param);
    }
});

最后,我们可以创建自定义编辑器并覆盖 PropertySheet.Item 中的 getPropertyEditorClass() 方法以返回自定义编辑器类型。在这种情况下,默认属性编辑器工厂将创建编辑器,无需覆盖工厂方法。

关于javafx - 使用 PropertyEditor (ControlsFX) 的属性表示例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24238858/

10-12 05:51