javafx - 如何在场景构建器中使 StylableDoubleProperty 可编辑

标签 javafx properties custom-controls scenebuilder gluon

我有一组自定义控件,作为扩展 javafx.scene.control.Control 和 javafx.scene.control.SkinBase 的标准类对实现。本质上,它们是一组带有标签和一个或多个“数据”控件的复合控件,例如用于值的 TextBox 和用于度量单位的 ChoiceBox。

我有几个可以与 SceneBuilder 正确交互的属性,但是 value 和 min-label-width 这两个属性在 SceneBuilder 中显示为只读。如何使这些属性在 SceneBuilder 中可编辑?当在 FXML Controller 中使用这些控件时,以编程方式进行操作时,它们可以正常工作。

我使用 CssMetaData 使 min-label-width 可换肤,但这没有什么区别。我一直在查看controlsFX源代码以获取有关如何做事的模板,但尚未找到答案。

// --- min-label-width Defines the space for the label of the control so that
// controls can easily be lined up.

private DoubleProperty minLabelWidth;

public final void setMinLabelWidth(double val)
{
    minLabelWidthProperty().set(val);
}

public final Double getMinLabelWidth()
{
    return minLabelWidthProperty().get();
}

/**
 * lazy allocation of DoubleProperty minLabelWidth.
 *
 * @return the minLabelWidth
 */
public final DoubleProperty minLabelWidthProperty()
{
    if (minLabelWidth == null)
    {
        minLabelWidth = new StyleableDoubleProperty(100.0)
        {

            @Override
            public Object getBean()
            {
                return CustomControl.this;
            }

            @Override
            public String getName()
            {
                return "minLabelWidth"; //$NON-NLS-1$
            }

            @Override
            public CssMetaData<? extends Styleable, Number> getCssMetaData()
            {
                return StyleableProperties.MIN_LABEL_WIDTH;
            }
        };
    }
    return minLabelWidth;
}

 private static final CssMetaData<CustomControl, Number> MIN_LABEL_WIDTH =
            new CssMetaData<CustomControl, Number>("-min-label-width", SizeConverter.getInstance(), 100)
            {

                @Override
                public Number getInitialValue(CustomControl node)
                {
                    // A vertical Slider should remain vertical
                    return node.getMinLabelWidth();
                }

                @Override
                public StyleableProperty<Number> getStyleableProperty(CustomControl arg0)
                {
                    return (StyleableProperty<Number>) arg0.minLabelWidthProperty();
                }

                @Override
                public boolean isSettable(CustomControl arg0)
                {

                    return arg0.minLabelWidth == null || !arg0.minLabelWidth.isBound();
                }

            };

我希望能够在 Java 属性检查器的自定义部分中编辑“最小标签宽度”条目,但该字段是灰色的并且是只读的。

最佳答案

你走在正确的道路上。

像任何CSSMetaData一样对象,MIN_LABEL_WIDTH必须在此私有(private) StyleableProperties 中创建类(例如 TextField ),然后添加到 STYLEABLES控件的 getClassCssMetaData() 返回的列表。

另请注意添加正确的类型:CssMetaData<CustomControl, Number> .

这对我有用:

private static class StyleableProperties {

     private static final CssMetaData<CustomControl, Number> MIN_LABEL_WIDTH =
            new CssMetaData<>("-min-label-width", SizeConverter.getInstance(), 100.0) {

        @Override
        public Number getInitialValue(CustomControl node) {
            // A vertical Slider should remain vertical
            return node.getMinLabelWidth();
        }

        @Override
        public StyleableProperty<Number> getStyleableProperty(CustomControl control) {
            return (StyleableProperty<Number>) control.minLabelWidthProperty();
        }

        @Override
        public boolean isSettable(CustomControl control) {

            return control.minLabelWidth == null || !control.minLabelWidth.isBound();
        }

    };

    private static final List<CssMetaData<? extends Styleable, ?>> STYLEABLES;
    static {
        final List<CssMetaData<? extends Styleable, ?>> styleables = 
                new ArrayList<>(Control.getClassCssMetaData());
        styleables.add(MIN_LABEL_WIDTH);

        STYLEABLES = Collections.unmodifiableList(styleables);
    }
}

public static List<CssMetaData<? extends Styleable, ?>> getClassCssMetaData() {
    return StyleableProperties.STYLEABLES;
}

@Override
public List<CssMetaData<? extends Styleable, ?>> getControlCssMetaData() {
    return getClassCssMetaData();
}

编译并构建您的控件,并将 jar 导入到场景生成器中。它应该是可编辑的:

Styleable property

确保您使用正确版本的场景生成器。我是在 11/12 构建的,所以我使用 Scene Builder 11.0.0 .

关于javafx - 如何在场景构建器中使 StylableDoubleProperty 可编辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56565243/

相关文章:

c# - WPF:具有在按下 Enter 键时触发的事件的 TextBox

javaFX MediaPlayer getCurrentTime() 不可靠

java - JOIN 2 个表并选择特定行

javascript - 动态填充 JavaScript 数组

c# - 创建自定义全尺寸日历控件

c# - 通过自定义控件 (.NET) 在设计时提供属性

java - 如何正确填充treeTableView

java - 带数据验证的文本框

spring - 特定于机器的 webapp 配置

javascript - 在javascript中使用外键访问数组属性