1

在 JavaFX 中,属性绑定ChangeListener通常可用于完成与或相同的目标InvalidationListener。如果可能需要在其他地方设置受更改影响的属性,则绑定是有问题的,因为无法设置绑定的属性(除非绑定是双向的,它有自己的一组问题)。

在这样的背景下,我需要知道绑定的属性(例如在皮肤中)是否仍然可以通过样式文件中的 CSS 进行更改。

我正在研究一些我想使用绑定设置默认值的控件。如果“CSS 更改”被视为与设置值相同(这不起作用),那么我将不得不求助于侦听器。

将不胜感激输入。谢谢!

4

1 回答 1

3

简短的回答,不。

AStyleableProperty有对应的CssMetaData. 后一类具有isSettable(Styleable)说明(强调我的)的方法:

检查给定节点上的相应属性是否可设置。在为给定属性查找任何样式之前调用此方法。它是抽象的,因此代码可以在不扩展属性的情况下检查属性是否可设置。通常,如果该属性不为 null 或未绑定,则该属性是可设置的

该方法的存在表明aStyleableProperty有可能由于某种任意原因而不可设置。

当实现你自己的StyleableProperty,以及相应的CssMetaData,你必须实现这个方法。如果StyleableProperty也实现了Property,那么这个方法应该检查是否Property被绑定,false如果是则返回。这是对所有 internal StyleablePropertys(也是 a Property)所做的。此外,如果您使用它StyleablePropertyFactoryCssMetaData它创建的将检查是否StyleableProperty是一个实例,Property然后检查它的绑定状态。

即使isSettable返回 true,当 CSS 引擎尝试设置StyleableProperty. 正如您自己提到的那样,Property无法设置界限。如果您尝试这样做,所有标准实现Property都会抛出异常。

话虽如此,您必须小心设置属性的方式。有一个优先级分配给用于设置StyleableProperty. JavadocStyleableProperty告诉您哪些方法优先于另一个。

StyleableProperty 允许从 CSS 设置 javafx.beans.property 样式。

这个接口允许 CSS 处理和 javafx.beans.property 之间的协调。该实现确保设置值的优先级按递增顺序并假设同等重要性:

  1. Application.setUserAgentStylesheet(java.lang.String) 中用户代理样式表的样式
  2. 从代码中设置的值,例如调用 Node.setOpacity(double)
  3. Scene.getStylesheets() 或 Parent.getStylesheets() 中作者样式表的样式
  4. 来自 Node.setStyle(java.lang.String) 的样式
于 2018-07-15T11:21:39.353 回答