SceneBuilder 8.4.1:自定义Font属性无法在自定义属性区显示
解决SceneBuilder中自定义组件Font属性不显示的问题
我之前也碰到过一模一样的情况,SceneBuilder对JavaBean属性的识别有挺严格的规范,尤其是像Font这种有内置编辑器的特定类型属性,咱们一步步来排查修复:
1. 先把JavaBean属性规范拉满
你代码里的属性变量名是TextFont(大写开头),这不符合JavaBean的命名规则,SceneBuilder全靠这个规范来识别属性。正确的写法应该是这样:
// 变量名小写开头,严格匹配JavaBean规范 private final SimpleObjectProperty<Font> textFont = new SimpleObjectProperty<>(this, "textFont", Font.font("System", FontWeight.NORMAL, 12)); // Getter方法:属性名首字母大写,前缀用get public Font getTextFont() { return textFont.get(); } // Setter方法:前缀用set,参数对应Font类型 public void setTextFont(Font font) { textFont.set(font); } // 必须提供这个property方法,SceneBuilder靠它识别可绑定属性 public SimpleObjectProperty<Font> textFontProperty() { return textFont; }
这里要注意两个关键点:
SimpleObjectProperty的构造参数里,第二个参数要填属性名("textFont"),和变量名、getter/setter的属性部分完全一致,帮SceneBuilder正确关联属性。- 一定要写
textFontProperty()方法,SceneBuilder不仅靠它监听属性变化,还会以此判断这是一个合法的JavaFX可绑定属性。
2. 进阶:让Font属性支持CSS(可选)
如果你的自定义组件是继承自javafx.scene.control.Control(或它的子类),可以把Font属性定义为StyleableProperty,这样不仅能在SceneBuilder里显示,还支持CSS样式设置,更贴合JavaFX组件的设计规范:
private final StyleableObjectProperty<Font> textFont = new SimpleStyleableObjectProperty<>( StyleableProperties.TEXT_FONT, this, "textFont", Font.font("System", FontWeight.NORMAL, 12) ); // 对应的getter、setter、property方法和上面一致 // 内部静态类定义StyleableProperty的元数据 private static class StyleableProperties { private static final CssMetaData<YourCustomComponent, Font> TEXT_FONT = new CssMetaData<>("-fx-text-font", FontConverter.getInstance(), Font.font("System", FontWeight.NORMAL, 12)) { @Override public boolean isSettable(YourCustomComponent control) { return !control.textFont.isBound(); } @Override public StyleableProperty<Font> getStyleableProperty(YourCustomComponent control) { return control.textFont; } }; private static final List<CssMetaData<? extends Styleable, ?>> STYLEABLES = new ArrayList<>(Control.getClassCssMetaData()) {{ add(TEXT_FONT); }}; } @Override public List<CssMetaData<? extends Styleable, ?>> getControlCssMetaData() { return StyleableProperties.STYLEABLES; }
3. 重新打包并导入SceneBuilder
修改代码后,重新编译打包成Jar,然后在SceneBuilder里先移除旧的Jar,再导入新的Jar。有时候SceneBuilder会缓存旧的组件元数据,重新导入能确保它加载最新的属性定义。
如果还是不显示,可以试试手动在FXML里引用这个属性:
<YourCustomComponent textFont="Arial 14 bold" />
如果FXML能正常识别并运行,说明代码没问题,大概率是SceneBuilder的缓存问题,重启软件或者清除它的缓存目录(比如Windows是C:\Users\<你的用户名>\.SceneBuilder\Library)后再重新导入Jar就行。
内容的提问来源于stack exchange,提问作者karlp
相关产品推荐
相关产品推荐

