Tornadofx tableview,标题底部的第一行作为过滤字段

时间:2019-11-13 22:03:53

标签: filter synchronization tableview tornadofx

我正在寻找一个tornadofx tableview,其第一行位于用作过滤器字段的标题的底部。数据从第二行存储到加号。 但是不幸的是,tornodofx和javafx中都没有这样的uicomponent。

我当时正在考虑通过使用vbox中收集的两个表视图A和B构建此组件。 A有标头,第一行带有过滤器字段,而B没有标头,并且与A中的过滤器字段同步。

问题是我面临一些挑战:

  • 隐藏表格视图并不容易(有些人使用代码,有些人使用CSS,哪种方法更好?)
  • 同步2个表视图(调整列宽,在A中对ASC / DESC进行排序应在B中进行)
  • A中的过滤器字段可能是类似于Excel的过滤器,并取决于每一列的数据类型

可以帮忙吗?

思考

1 个答案:

答案 0 :(得分:0)

我使用列标题图形来实现所需的结果。我不得不对这个问题感到满意,因为它避免了您计划要处理的所有复杂问题,例如从搜索中排除第一行,同步两个表等。

class Foo(y: Int, z: String) {
    val yProperty = SimpleIntegerProperty(y)
    var y by yProperty
    val zProperty = SimpleStringProperty(z)
    var z by zProperty
}


class TestView : View("Hello TornadoFX") {
    val list = SortedFilteredList<Foo>().apply {
        for(i in 0..10) {
            add(Foo(Random.nextInt(0, 100), "Row $i"))
        }
    }
    var column1Field: TextField by singleAssign()
    var column2Field: TextField by singleAssign()

    override val root = vbox {
        tableview(list) {
            column("", Foo::yProperty) { //Put column name in graphic so text field will be below label
                graphic = vbox(2) {
                    label("Y Column")
                    column1Field = textfield()
                }
            }
            column("", Foo::zProperty) {
                graphic = vbox(2){
                    label("Z Column")
                    column2Field = textfield()
                }
            }
        }
    }

    init {
        column1Field.textProperty().onChange { filterList() }
        column2Field.textProperty().onChange { filterList() }
    }

    fun filterList() {
        list.predicate = { row ->
            val c1Text = column1Field.text
            val c1Filter = if(!c1Text.isNullOrBlank()) row.y.toString().contains(c1Text, true)
            else true

            val c2Text = column2Field.text
            val c2Filter = if(!c2Text.isNullOrBlank()) row.z.contains(c2Text, true)
            else true

            c1Filter && c2Filter
        }
    }
}

这只是一个粗略的POC,可能可以简化,但我认为它可以使想法得到传播。我承认这有点冗长,但是如果您足够聪明,则可以使用构建器函数来缩小此过程。