如何在Scene Builder中根据属性值启用/禁用自定义组件的自定义属性
核心原因说明
你当前在组件内写的active属性监听器仅会在程序运行时生效,Scene Builder的设计态是通过读取Java Bean的元数据来渲染属性面板,不会执行组件的运行时逻辑,因此需要额外配置属性的依赖规则让Scene Builder识别动态禁用逻辑。
实现方案
方案一:自定义BeanInfo类(全版本兼容,推荐)
这是适配所有Scene Builder版本的通用方案,Scene Builder会自动读取组件同包下、命名为[组件类名]BeanInfo的类作为属性元数据配置。
- 在
CustomControl的同包下新建CustomControlBeanInfo.java:
import java.beans.IntrospectionException; import java.beans.PropertyDescriptor; import java.beans.SimpleBeanInfo; public class CustomControlBeanInfo extends SimpleBeanInfo { @Override public PropertyDescriptor[] getPropertyDescriptors() { try { // 声明active属性描述符 PropertyDescriptor activeDesc = new PropertyDescriptor("active", CustomControl.class); // 声明selectType属性描述符 PropertyDescriptor selectTypeDesc = new PropertyDescriptor("selectType", CustomControl.class); // 核心配置:指定selectType仅在active为true时可编辑 selectTypeDesc.setValue("com.oracle.javafx.scenebuilder.property.enabledWhen", "active == true"); // 有其他自定义属性也可以一并加入数组返回 return new PropertyDescriptor[]{activeDesc, selectTypeDesc}; } catch (IntrospectionException e) { e.printStackTrace(); return super.getPropertyDescriptors(); } } }
- 补充运行时的禁用逻辑(可选,建议添加)
为了保证运行时逻辑和设计态一致,你可以修改setSelectType方法做权限判断:
@Override public void setSelectType(TypesEnum selectType) { // 仅当active为true时允许修改selectType if (isActive()) { this.selectType.set(selectType); } }
- 重新打包自定义组件的Jar包,重新导入Scene Builder即可生效。
方案二:注解配置(仅支持Scene Builder 16及以上版本)
如果使用较新版本的Scene Builder,可以直接通过@FXMLProperty注解声明规则,无需额外写BeanInfo类:
- 首先引入OpenJFX的FXML注解依赖(Maven示例):
<dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-fxml</artifactId> <version>对应你的JavaFX版本</version> </dependency>
- 在
selectType的Getter方法上加注解配置依赖规则:
import org.openjfx.fxml.FXMLProperty; // 省略其他代码 @FXMLProperty( dependsOn = "active", enabledWhen = "active == true" ) public TypesEnum getSelectType() { return selectType.get(); }
后续重新打包导入Scene Builder即可生效。
内容的提问来源于stack exchange,提问作者Doombringer
相关产品推荐
相关产品推荐

