Я пишу симуляцию 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 грязных).
Как я могу заставить их «держаться» и не исчезать?