Как бороться с «грязными детьми» в динамически обновляемом представлении TornadoFX? - PullRequest
0 голосов
/ 04 июня 2019

Я пишу симуляцию MVP, которая инициализирует "мир" симуляции в фоновом режиме, а затем рисует его в пользовательском интерфейсе. Вот основной вид:

class SimView : View() {
val presenter: SimPresenter = find(SimPresenter::class)
val canvas: Pane
val registeredVehiclesRender: MutableList<Vehicle.VehicleRender> = mutableListOf()


init {
    val (worldWidth, worldHeight, startingVehicles) = arrayOf(400.0, 400.0, 10.0)
    canvas = pane {
    }
    canvas.prefHeight = worldHeight
    canvas.prefWidth = worldWidth
    runAsync {
        presenter.startSimulation(worldWidth, worldHeight, startingVehicles, find(SimView::class))
    } ui {
        renderWorld(it)
    }
}


override val root = vbox {
    anchorpane {
        canvas
        anchorpaneConstraints {
            topAnchor = 0.0
            bottomAnchor = 0.0
            rightAnchor = 0.0
            leftAnchor = 0.0
        }
        vboxConstraints {
            vgrow = Priority.ALWAYS
        }
    }
}

fun renderWorld(model: SimModel) {
    renderVehicles(model.vehicles)
    renderWorldObjects(model.objects)
}

fun renderVehicles(
    vehicles: Set<Vehicle>
) { //TODO
    vehicles.forEach {
        if (!registeredVehiclesRender.contains(it.render)) { //add new
            with(canvas) {
                this += it.render.element //JavaFX Shape (Group of Rectangles)
            }
            registeredVehiclesRender.add(it.render)
        } else {
            it.render.update(it.speed)
        }
    }
}

fun renderWorldObjects(wobjs: MutableCollection<WorldObject>) = wobjs.forEach {
    //TODO
    with(canvas) {
        this += it.shape //JavaFX Shape (circle)
    }
}
}

Я не вставляю весь код инициализации. То, что затем добавляется в «canvas» в качестве детей, - «javafx.Shape». Панель «Canvas» сначала добавляет все эти фигуры, объявляя их «грязными», но затем, после выполнения пользовательского интерфейса задачи, полностью очищает дочерние элементы «Canvas» (0 дочерних и 0 грязных). Как я могу заставить их «держаться» и не исчезать?

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