在TornadoFX中使用工作区时如何使用范围?

时间:2018-09-25 08:55:08

标签: kotlin tornadofx

我正在使用TornadoFX的Workspace功能,并且试图使它们与Scopes一起使用。启动应用程序时,我需要进行一些设置,完成后,我将启动TornadoFX应用程序,并在第一个视图中提供Scope。之后,我希望能够在新的dock中将Workspace的其他视图Scope进入我的View,但这由于某些原因而无法正常工作:原始的View无法正常工作取消停靠,但是新的fun main(args: Array<String>) { Application.launch(TestApp::class.java, *args) } class ParentScope : Scope() { val id = UUID.randomUUID().toString().substring(0, 4) } class ChildScope : Scope() { val id = UUID.randomUUID().toString().substring(0, 4) } class TestApp : App(Workspace::class) { override fun onBeforeShow(view: UIComponent) { workspace.dock<ParentView>(ParentScope()) } } class ParentView : View("parent") { override val scope = super.scope as ParentScope override val root = hbox { button("new child") { action { workspace.dock<ChildView>(ChildScope()) } } } override fun onDock() { logger.info("Docking parent (${scope.id})") } override fun onUndock() { logger.info("Undocking parent (${scope.id})") } } class ChildView : View("child") { override val scope = super.scope as ChildScope override val root = hbox { text("In child") } override fun onDock() { logger.info("Docking child (${scope.id})") } override fun onUndock() { logger.info("Undocking child (${scope.id})") } } 停靠了,我只是在屏幕上看不到它。可能是什么问题呢?这是我的代码来重现该问题:

new child

单击w 10:56:19.415 [JavaFX Application Thread] INFO Test - Docking parent (d202) 10:56:23.967 [JavaFX Application Thread] INFO Test - Docking child (cbc5) 按钮后的输出是这样:

ParentView

我看到的是相同的new child。如果再次单击ChildView,则ChildView会停靠,而新的ParentView会停靠,但我仍然只看到10:56:31.228 [JavaFX Application Thread] INFO Test - Undocking child (cbc5) 10:56:31.228 [JavaFX Application Thread] INFO Test - Docking child (1dd8)

list-style-type: none;

1 个答案:

答案 0 :(得分:1)

App已经定义了一个Scope和一个相应的Workspace实例,因此,当您的初始View停靠在Workspace中时,新的{{ 1}}定义了一个新的ParentScope实例。当您将Workspace停靠在该ChildView中时,它确实可以执行此操作,但是有关的工作区不会显示在屏幕上。

要解决此问题,您可以像这样覆盖应用程序的主要范围:

Workspace

还请注意,我使用了class TestApp : WorkspaceApp(ParentView::class) { init { scope = ParentScope() } } 子类,因此不需要手动停靠WorkspaceApp

在查看此问题时,我意识到,如果将UIComponent停靠在工作区中,则应该假定它已停靠在其中。因此,我已提交了一个修复程序,以便您的初始代码无需修改即可工作