Как работать с Scopes при использовании Workspaces в TornadoFX? - PullRequest
0 голосов
/ 25 сентября 2018

Я использую функцию Workspace в TornadoFX и пытаюсь заставить их работать с 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})")
    }

}

Вывод после нажатия кнопки 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.Если я снова нажму 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)

1 Ответ

0 голосов
/ 25 сентября 2018

App уже определяет Scope с соответствующим экземпляром Workspace, поэтому, пока ваш начальный View пристыкован к Workspace, ваш новый ParentScope определяет новый Workspace экземпляр.Когда вы присоединяете ChildView к этому Workspace, он делает именно это, но рабочая область, о которой идет речь, не отображается на экране.

Чтобы исправить это, вы можете переопределить основную область вашего приложения, например:

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

Обратите внимание, что я использую подкласс WorkspaceApp, поэтому мне не нужно стыковать ParentView вручную.

Когда я смотрел на эту проблему, я понял, что если вы пристыковываетесьUIComponent в Workspace, он должен предполагать рабочее пространство, в котором он был закреплен. По этой причине я зафиксировал исправление, чтобы ваш исходный код работал без изменений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...