我有一组自定义控件,它们被实现为扩展javafx.scene.control.Control和javafx.scene.control.SkinBase的标准类对。本质上,它们是一组具有标签和一个或多个“数据”控件的复合控件,例如表示值的TextBox和表示度量单位的ChoiceBox。
我有几个属性可以与SceneBuilder正确交互,但是在SceneBuilder中有两个属性value和min-label-width显示为只读。如何使这些属性在SceneBuilder中可编辑?在FXML控制器中使用控件时,如果以编程方式操作这些控件,它们将正常工作。
我用CssMetaData设置了最小标签宽度的皮肤,但这没有什么区别。我一直在查看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的属性检查器的自定义部分中编辑Min Label Width条目,但该字段是灰色的并且是只读的。
发布于 2019-06-13 04:35:49
你在正确的轨道上。
与任何CSSMetaData
对象一样,MIN_LABEL_WIDTH
必须在这个私有StyleableProperties
类中创建(例如参见TextField),然后添加到由控件的getClassCssMetaData()
返回的STYLEABLES
列表中。
还要注意添加正确的类型: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导入到场景生成器中。应该是可编辑的:
确保使用正确版本的场景生成器。我是在11/12基础上构建的,所以我使用Scene Builder 11.0.0。
发布于 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
下面是简单得多的属性集。
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
STYLEABLES = Collections.unmodifiableList(styleables);
}
public List<CssMetaData<? extends Styleable, ?>> getControlCssMetaData() {
return STYLEABLES;
}
https://stackoverflow.com/questions/56565243
复制相似问题