首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在scenebuilder中使StylableDoubleProperty可编辑

如何在scenebuilder中使StylableDoubleProperty可编辑
EN

Stack Overflow用户
提问于 2019-06-12 23:02:51
回答 2查看 112关注 0票数 2

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

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

我用CssMetaData设置了最小标签宽度的皮肤,但这没有什么区别。我一直在查看controlsFX源代码,以获取有关如何做事情的模板,但还没有找到答案。

代码语言:javascript
复制
// --- 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的属性检查器的自定义部分中编辑Min Label Width条目,但该字段是灰色的并且是只读的。

EN

回答 2

Stack Overflow用户

发布于 2019-06-13 04:35:49

你在正确的轨道上。

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

还要注意添加正确的类型:CssMetaData<CustomControl, Number>

这对我来说很有效:

代码语言:javascript
复制
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导入到场景生成器中。应该是可编辑的:

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

票数 2
EN

Stack Overflow用户

发布于 2019-06-18 02:06:15

在使用不同的搜索词进行搜索后,我发现了一种更简单的方法来解决我的问题: StyleablePropertyFactory。

下面是我在哪里找到这些信息的参考:https://static.rainfocus.com/oracle/oow16/sess/1462484351438001p6a1/ppt/Custom%20Controls.pdf。幻灯片#88根据我的需要进行了复制和更新,效果很好。但是,该示例并未说明如何设置默认值。此链接对Number属性中的默认值进行了适当的调用。

https://docs.oracle.com/javase/8/javafx/api/javafx/css/StyleablePropertyFactory.html

下面是简单得多的属性集。

代码语言:javascript
复制
private static final StyleablePropertyFactory<CustomControl> FACTORY = 
        new StyleablePropertyFactory<>(Control.getClassCssMetaData());

private final StyleableProperty<Number> titleWidth =
        FACTORY.createStyleableNumberProperty(this,"titleWidth", "title-width", s->s.titleWidth, 100.0);
private final StyleableProperty<String> title =
        FACTORY.createStyleableStringProperty(this,"title","title", s->s.title);

@SuppressWarnings("unchecked")
public final ObservableValue<Number> titleWidthProperty() {return (ObservableValue<Number>) titleWidth;}

public final Double getTitleWidth() { return titleWidth.getValue().doubleValue();}
public final void setTitleWidth(Double value) {titleWidth.setValue(value);}

public final StringProperty titleProperty() { return (StringProperty) title;}

public final String getTitle() {return title.getValue();}
public final void setTitle(String newTitle) {title.setValue(newTitle);}

styleables.add(StyleableProperties.ORIENTATION);static final STYLEABLES;List> { final List> styleables =新的ArrayList<>(FACTORY.getCssMetaData());private

代码语言:javascript
复制
  STYLEABLES = Collections.unmodifiableList(styleables);

}

代码语言:javascript
复制
public List<CssMetaData<? extends Styleable, ?>> getControlCssMetaData() {
    return STYLEABLES;
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56565243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档