0

我正在使用 TornadoFX 库在 Kotlin 中工作。想象一下,您有一个工具栏,其中显示了对您拥有的当前视图有用的工具。所以我们有一个 MainController ,它有一个 subController 属性,它是工具栏旁边某个视图的控制器。因此,如果我们的 subController 发生变化,视图应该会更新。此外,如果 subController 的任何属性(例如 selectedTool、tools)发生更改,工具栏也应相应更新。暂时,工具栏没有更新。

class ToolBar : View("Tool bar") {
    private val controller: MainController by inject()
    override val root = vbox {
        tilepane {
            for (tool in controller.subController.tools) {
                button(tool.name, group).action {
                    controller.subController.changeTool(tool) // changes selected tool
                }
            }
        }
        this += controller.subController.selectedTool.options
    }
}

额外信息:subController.tools 是一个 ArrayList 并且 subController.selectedTool 是一个工具。

现在我的问题是,在 TornadoFX 中推荐的方法是什么?

4

1 回答 1

1

你有几个选择。AParent支持一个被调用的函数,该函数bindChildren接受一个可观察的项目列表和一个将这些项目中的每一个转换为节点的函数。您可以使用它在工具栏中创建按钮:

tilepane { 
    bindChildren(controller.subController.tools) { tool ->
        Button(tool.name) ...
    }
}

如果您需要更多控制,也可以手动执行此操作:

tilepane { controller.subController.tools.onChange { children.clear() // 在此处创建新按钮,就像在您的示例中一样 } }

但是,您应该有一个注入当前范围的 ToolsModel,而不是注入控制器来访问 subController 以访问工具。工具模型可以有一个工具列表和选定的工具,并且可以注入到所有需要它的视图和控制器中。你说 selectedTool 是一个工具,但你没有展示什么是工具,但从你的代码来看,它看起来 Tool.options 是一个节点子类(?)。

您可以使用相同的技术添加/删除 tool.options 元素,甚至将其包装在堆栈窗格或其他布局容器中,以便能够使用相同的技术识别更改时要删除的工具(或简单地删除堆栈窗格的所有子项) .

于 2017-12-06T19:24:14.950 回答