Py学习  »  tornado

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

Hexworks • 5 年前 • 1001 次点击  

我正在使用 Workspace 龙卷风的特点,我正在努力使他们与 Scopes . 当我启动应用程序时,我需要设置一些东西,当它完成时,我启动TornadoFX应用程序并提供 Scope 我的第一个观点。之后我想能够 dock 我的其他观点 工作空间 在新的 范围 但这不起作用,因为某些原因:原始的 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})")
    }

}

单击w后的输出 new child 按钮是这样的:

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 . 如果我点击 新生儿童 再一次 ChildView 脱离连接,一个新的 儿童观 停靠,但我仍然只看到 父视图 :

10:56:31.228 [JavaFX Application Thread] INFO  Test - Undocking child (cbc5)
10:56:31.228 [JavaFX Application Thread] INFO  Test - Docking child (1dd8)
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/30961
 
1001 次点击  
文章 [ 1 ]  |  最新文章 5 年前
Edvin Syse
Reply   •   1 楼
Edvin Syse    5 年前

这个 App 已经定义了 Scope 与相应的 Workspace 例如,当你的初始 View 停靠在 工作空间 你的新 ParentScope 定义新的 工作空间 实例。当你停靠 ChildView 进入 工作空间 它确实做到了这一点,但相关的工作区不会显示在屏幕上。

要解决这个问题,您可以这样覆盖应用程序的主要作用域:

class TestApp : WorkspaceApp(ParentView::class) {
    init {
        scope = ParentScope()
    }
}

还请注意,我使用 WorkspaceApp 子类,因此我不需要停靠 ParentView 手动。

在研究这个问题时,我意识到,如果您将一个ui组件停靠到一个工作区中,那么它应该假定它已经停靠在一个工作区中。出于这个原因,我已经提交了一个修复程序,这样您的初始代码就可以在不进行修改的情况下工作。