TornadoFX如何将Node样式(或styleClass)绑定到属性?

时间:2017-08-02 16:47:35

标签: kotlin tornadofx

考虑以下示例:

class MainView : View("Example") {
    val someBooleanProperty: SimpleBooleanProperty = SimpleBooleanProperty(true)
    override val root = borderpane {
        paddingAll = 20.0
        center = button("Change bg color") {
            action {
                // let's assume that new someBooleanProperty value is updated
                // from some API after button clicked
                // so changing style of the borderpane in action block
                // of the button is not the solution
                someBooleanProperty.value = !someBooleanProperty.value
            }
        }
    }
}

class Styles : Stylesheet() {
    companion object {
        val red by cssclass()
        val green by cssclass()
    }

    init {
        red { backgroundColor += Color.RED }
        green { backgroundColor += Color.GREEN }
    }
}

如何根据borderpane动态更改someBooleanProperty的背景颜色(例如true时的红色和false时的绿色)?是否有可能将CSS类绑定到属性?是否有任何解决方案可以不使用CSS(意味着在style块内等)

1 个答案:

答案 0 :(得分:2)

如果要切换类(基于布尔属性添加或删除类),可以使用Node.toggleClass(CssRule, ObservableValue<Boolean>)函数。

val someBooleanProperty = SimpleBooleanProperty(true)
...
borderpane {
    toggleClass(Styles.red, someBooleanProperty)
    toggleClass(Styles.green, someBooleanProperty.not())
}

另一方面,如果要绑定到更改的类值,可以使用Node.bindClass(ObservableValue<CssRule>)函数。

val someClassyProperty = SimpleObjectProperty(Styles.red)
...
borderpane {
    bindClass(someClassyProperty)
}

然后,您可以将课程设置为您想要的任何内容。