我有一组自定义控件,作为扩展 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 导入到场景生成器中。它应该是可编辑的:
确保您使用正确版本的场景生成器。我是在 11/12 构建的,所以我使用 Scene Builder 11.0.0 .
关于javafx - 如何在场景构建器中使 StylableDoubleProperty 可编辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56565243/