首页 > 解决方案 > 表格视图单元格的类型安全样式表,具体取决于条件

问题描述

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

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

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()
    }
}

}

标签: javafxkotlintornadofx

解决方案


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

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")
        }
    }
}

请注意,这只在 tableview 重绘时更新颜色。如果您需要在 tableview 不重绘时根据外部事件更新颜色,请触发事件以重绘它,或者使用绑定代替。如果您使用第一种方法获得方法,我会推荐它,因为它不附加任何听众。


推荐阅读