我正在寻找一个tornadofx tableview,其第一行位于用作过滤器字段的标题的底部。数据从第二行存储到加号。 但是不幸的是,tornodofx和javafx中都没有这样的uicomponent。
我当时正在考虑通过使用vbox中收集的两个表视图A和B构建此组件。 A有标头,第一行带有过滤器字段,而B没有标头,并且与A中的过滤器字段同步。
问题是我面临一些挑战:
可以帮忙吗?
思考
答案 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,可能可以简化,但我认为它可以使想法得到传播。我承认这有点冗长,但是如果您足够聪明,则可以使用构建器函数来缩小此过程。