JavaFX中getStyleableProperty返回类型、传参及使用方法咨询
JavaFX
getStyleableProperty 方法相关类型与用法说明 1. <? capture of extends Styleable> 类型定义与运行逻辑
这个是Java泛型的通配符捕获类型,对应CssMetaData<S extends Styleable, V>接口定义的第一个泛型参数:
- 定义约束:通配符
? extends Styleable表示该类型是任意实现了Styleable接口的JavaFX节点类(比如你用到的HBox、Button都属于该类别的实现),capture of标识是编译器生成的标记,代表运行时会自动匹配该通配符对应的具体节点类型。 - 运行逻辑:该类型的作用是约束当前
CssMetaData实例只能绑定到对应类型的Styleable节点上,避免跨类型调用时出现类型转换异常,运行时会自动校验传入的节点是否匹配该泛型要求的类型。
2. getStyleableProperty 参数要求与返回值类型
- 入参要求:必须传入和当前
CssMetaData泛型匹配的Styleable节点实例,你示例中是从hbox实例获取的CssMetaData,直接传入hbox本身即可。 - 返回值类型:返回
StyleableProperty<V>实例,V是属性对应的值类型,-fx-max-width对应的V为Double,最终返回StyleableProperty<Double>类型的属性对象。
3. 强转失败的原因
你尝试将-fx-max-width属性强转为Styleable类型失败的原因是:-fx-max-width是Styleable节点(也就是HBox)的属性,本身并不是Styleable接口的实现类实例,类型不匹配自然会强转失败。
修正后的代码示例
hbox.getCSSMetadata().stream() // 修正原代码contains的拼写错误,直接用getProperty获取属性名匹配更准确 .filter(prop -> prop.getProperty().contains("-fx-max-width")) .forEach(prop2->{ String propName = prop2.getProperty(); // 正常返回属性名称字符串 // 传入当前hbox作为入参,强转为对应类型的StyleableProperty StyleableProperty<Double> fxMaxWidthProp = (StyleableProperty<Double>) prop2.getStyleableProperty(hbox); // 可直接操作属性,比如读取当前值 System.out.println("当前-fx-max-width值:" + fxMaxWidthProp.getValue()); });
额外优化提示:如果要避免 unchecked 强转警告,可以先调用
prop2.getStyleableClass()获取对应的Class对象,和传入节点的类做匹配校验,确认一致后再调用方法、转换类型。
内容的提问来源于stack exchange,提问作者fjsantosaorin
相关产品推荐
相关产品推荐

