CSS可以修改绑定的JavaFX属性吗?

时间:2018-07-15 09:59:30

标签: css javafx property-binding

在JavaFX中,属性 binding 通常可用于实现与ChangeListenerInvalidationListener相同的目标。在受更改影响的属性可能需要在其他位置设置的情况下,绑定是有问题的,因为无法设置绑定的属性(除非绑定是双向的,具有其自身的问题)。

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

我正在一些控件上设置绑定的默认值。如果将“更改CSS”与设置值(无效)相同,那么我将不得不求助于侦听器。

感谢您的投入。谢谢!

1 个答案:

答案 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。实施确保优先考虑   将值设置为,以递增顺序并假定等于   重要性:

     
      
  1. Application.setUserAgentStylesheet(java.lang.String)中用户代理样式表中的样式
  2.   
  3. 通过代码设置的值,例如调用Node.setOpacity(double)
  4.   
  5. Scene.getStylesheets()或Parent.getStylesheets()中作者样式表中的样式
  6.   
  7. Node.setStyle(java.lang.String)中的样式
  8.