动态创建重复标签时,是否有修复程序?

时间:2019-04-29 17:07:07

标签: tornadofx

我正在尝试使用Tornadofx 1.7.18版动态创建一个标签窗格,由于某些原因,这些标签被复制了。

我有一个配置文件,该文件以可变的值加载到应用程序中,以便程序遵循SOLID原则,特别是开闭原则。 我使用Javafx解决方案通过在tabpane.tabs.add()循环内调用forEach来添加标签。

这是我的问题的简化版本,但仍然显示该问题。

class Example: View() {
    private val tabList = List(3) {
        return@List it.toString()
    }

    override val root = tabpane()

    init {
        with(root) {
            tabClosingPolicy = TabPane.TabClosingPolicy.UNAVAILABLE

            tabList.forEach {
                this.tabs.add(
                    tab(it) {
                        label("Hello $it")
                    }
                )
            }
        }
    }
}

最后显示两个“ 0”选项卡都显示为选中状态。该窗口最终在Windows机器上看起来像这样:

+----------------+
|icon|    |-|[]|X|
+----------------+
||0|0|1|1|2|2|   |
+----------------+
|Hello 0         |
+----------------+

1 个答案:

答案 0 :(得分:1)

代码的问题是您正在使用tab()构建器,然后将结果添加到选项卡列表中。绝对地,TornadoFX中的每个构建器都会自动将其创建的内容添加到其父项中,因此您不必手动进行此操作。

每个生成器还返回其生成的内容,因此这就是您的代码甚至进行编译的原因。您只需删除周围的this.tabs.add()调用即可解决该错误,如下所示:

tabList.forEach {
    tab(it) {
        label("Hello $it")
    }
}

为完整起见,这是使用最佳实践的完整根构建器:

override val root = tabpane {
    tabClosingPolicy = TabPane.TabClosingPolicy.UNAVAILABLE

    tabList.forEach {
        tab(it) {
            label("Hello $it")
        }
    }
}