在JavaFX中,属性 binding 通常可用于实现与ChangeListener
或InvalidationListener
相同的目标。在受更改影响的属性可能需要在其他位置设置的情况下,绑定是有问题的,因为无法设置绑定的属性(除非绑定是双向的,具有其自身的问题)。
在这种背景下,我需要知道是否可以通过样式文件中的CSS更改绑定的属性(例如,皮肤中的属性)。
我正在一些控件上设置绑定的默认值。如果将“更改CSS”与设置值(无效)相同,那么我将不得不求助于侦听器。
感谢您的投入。谢谢!
答案 0 :(得分:3)
简短回答,不。
一个StyleableProperty
有一个对应的CssMetaData
。后一类具有方法isSettable(Styleable)
,该方法指出(强调我的):
检查给定节点上的相应属性是否为 可设置的。在查找任何样式之前将调用此方法 给定的属性。它是抽象的,因此代码可以检查是否 可设置属性,而无需扩展属性。 通常, 属性可以设置为非null或未绑定。
此方法的存在表明StyleableProperty
可能由于某些任意原因而无法设置。
在实现自己的StyleableProperty
和相应的CssMetaData
时,必须实现此方法。如果StyleableProperty
也实现了Property
,则此方法应检查Property
是否绑定,并返回false
。这是对所有内部StyleableProperty
(也是Property
)进行的操作。另外,如果您使用的是StyleablePropertyFactory
,则它创建的CssMetaData
将检查StyleableProperty
是否是Property
的实例,然后检查其绑定状态。
即使isSettable
返回true,这也会在CSS引擎尝试设置StyleableProperty
时导致异常。正如您自己提到的那样,无法设置边界Property
。如果尝试这样做,Property
的所有标准实现都将引发异常。
话虽如此,您必须注意如何设置属性。为设置StyleableProperty
的方法分配了优先级。 Javadoc of StyleableProperty
告诉您哪些方法优先于其他方法。
StyleableProperty允许从CSS设置javafx.beans.property的样式。
此接口允许CSS处理与 javafx.beans.property。实施确保优先考虑 将值设置为,以递增顺序并假定等于 重要性:
- Application.setUserAgentStylesheet(java.lang.String)中用户代理样式表中的样式
- 通过代码设置的值,例如调用Node.setOpacity(double)
- Scene.getStylesheets()或Parent.getStylesheets()中作者样式表中的样式
- Node.setStyle(java.lang.String)中的样式