用于Tableviews单元格的Typesafe样式表,具体取决于条件

时间:2019-03-07 12:56:26

标签: javafx kotlin tornadofx

我有以下代码来定义一个表格视图,其中特定的单元格会根据情况改变颜色。

如何定义类型安全样式表类并将其应用于当前代码以防止将来重复?

class MonitorView : View("Monitor") {
    override val root = borderpane {
        center = tableview<ServerModel> {
            items = readConfiguration().observable()
            readonlyColumn("Environment", ServerModel::env)
            readonlyColumn("Host", ServerModel::host)
            readonlyColumn("Port", ServerModel::port)
            readonlyColumn("Application Name", ServerModel::appName)
            column("Is online", ServerModel::isReachable).cellFormat {
                styleDependingOnBoolean(it)
                graphic = hbox {
                    button("Restart").action {
                        isDisable = true
                    }
                }
            }
        }
    }

private fun TableCell<ServerModel, Boolean>.styleDependingOnBoolean(it: Boolean) {
    if (it) {
        style = "-fx-background-color:#00b200; -fx-text-fill:white"
        text = it.toString()
    } else {
        style = "-fx-background-color:#8b0000; -fx-text-fill:white"
        text = it.toString()
    }
}

}

2 个答案:

答案 0 :(得分:0)

如果我理解正确,那么您正在寻找类似于以下内容的东西;

javafxNode.getStyleClass().add("myCssClass");
// passing true here will activate your css code below
javafxNode.pseudoClassStateChanged("myPseudoClass",yourBoolean);

在您的CSS文件中:

.myCssClass:myPseudoClass{
     -fx-text-fill:white 
}

答案 1 :(得分:0)

您可以创建类型安全的样式表,并为此连接列创建具有默认背景色的选择器。然后添加另一个称为“可达”的选择器,该选择器将覆盖此颜色,如下所示:

class MyStyles : Stylesheet() {
    companion object {
        val reachable by cssclass()
        val connectivityColumn by cssclass()
    }

    init {
        connectivityColumn {
            backgroundColor += c("#8b0000")
        }
        connectivityColumn and reachable {
            backgroundColor += c("#00b200")
        }
    }
}

确保此列获取connectivityColumn类,并使用reachable切换toggleClass状态:

column("Reachable", Server::reachableProperty) {
    addClass(MyStyles.connectivityColumn)
    cellFormat {
        toggleClass(MyStyles.reachable, item)
        graphic = hbox {
            button("Restart")
        }
    }
}

请注意,这仅在重新绘制表格视图时更新颜色。如果在不重绘表视图时需要根据外部事件更新颜色,请触发事件以重绘它,或者改用绑定。如果您对第一种方法有所了解,我会推荐它,因为它不附加任何侦听器。