You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Scene Builder中根据属性值启用/禁用自定义组件的自定义属性

核心原因说明

你当前在组件内写的active属性监听器仅会在程序运行时生效,Scene Builder的设计态是通过读取Java Bean的元数据来渲染属性面板,不会执行组件的运行时逻辑,因此需要额外配置属性的依赖规则让Scene Builder识别动态禁用逻辑。

实现方案

方案一:自定义BeanInfo类(全版本兼容,推荐)

这是适配所有Scene Builder版本的通用方案,Scene Builder会自动读取组件同包下、命名为[组件类名]BeanInfo的类作为属性元数据配置。

  1. 在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();
        }
    }
}
  1. 补充运行时的禁用逻辑(可选,建议添加)
    为了保证运行时逻辑和设计态一致,你可以修改setSelectType方法做权限判断:
@Override
public void setSelectType(TypesEnum selectType) {
    // 仅当active为true时允许修改selectType
    if (isActive()) {
        this.selectType.set(selectType);
    }
}
  1. 重新打包自定义组件的Jar包,重新导入Scene Builder即可生效。

方案二:注解配置(仅支持Scene Builder 16及以上版本)

如果使用较新版本的Scene Builder,可以直接通过@FXMLProperty注解声明规则,无需额外写BeanInfo类:

  1. 首先引入OpenJFX的FXML注解依赖(Maven示例):
<dependency>
    <groupId>org.openjfx</groupId>
    <artifactId>javafx-fxml</artifactId>
    <version>对应你的JavaFX版本</version>
</dependency>
  1. 在selectType的Getter方法上加注解配置依赖规则:
import org.openjfx.fxml.FXMLProperty;

// 省略其他代码

@FXMLProperty(
    dependsOn = "active",
    enabledWhen = "active == true"
)
public TypesEnum getSelectType() {
    return selectType.get();
}

后续重新打包导入Scene Builder即可生效。

内容的提问来源于stack exchange,提问作者Doombringer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 17:06:03