TornadoFX переопределяет макетыДети по региону

Я пытаюсь перевести этот класс JavaFX в TornadoFX. Hover im не смог определить, как protected void layoutChildren() должна быть сделана с помощью TornadoFX?

Это код, который у меня есть до сих пор:

 class ReversiSquare(x: Int, y: Int) : View() { var x by property(x) fun xProperty() = getProperty(ReversiSquare::y) var y by property(y) fun yProperty() = getProperty(ReversiSquare::y) var highlight: Region by singleAssign() var highlightTransition: FadeTransition by singleAssign() val model = ReversiModel override val root = region { region { opacity = 0.0 style = "-fx-border-width: 3; -fx-border-color: dodgerblue" highlight = this } // todo not sure this works with singleAssign highlightTransition = FadeTransition(Duration.millis(200.0), highlight).apply { fromValue = 0.0 toValue = 1.0 } styleProperty().bind(Bindings.`when`(model.legalMove(x, y)) .then("-fx-background-color: derive(dodgerblue, -60%)") .otherwise("-fx-background-color: burlywood")) val light = Light.Distant().apply { azimuth = -135.0 elevation = 30.0 } effect = Lighting(light) setPrefSize(200.0,200.0) this += highlight addEventHandler(MouseEvent.MOUSE_ENTERED_TARGET) { if(model.legalMove(x ,y).get()) { with(highlightTransition) { rate =1.0 play() } } } addEventHandler(MouseEvent.MOUSE_EXITED_TARGET) { with(highlightTransition) { rate = -1.0 play() } } onDoubleClick { model.play(x, y) highlightTransition.rate = -1.0 highlightTransition.play() } } } 

Я не уверен, что вы имеете в виду, переведя на TornadoFX, но написать layoutChildren в Котлин будет выглядеть примерно так:

 override fun layoutChildren() { layoutInArea(highlight, 0.0, 0.0, width, height, baselineOffset, HPos.CENTER, VPos.CENTER); } 

EDIT: вы обновили пример кода до представления, поэтому я думаю, что понимаю, что вы хотите сейчас 🙂

Во-первых, убедитесь, что в представлении не требуются параметры, потому что это не позволяет вводить это представление. Либо пропустите параметры, используя by param() либо еще лучше, добавьте ViewModel в область представления и вставьте ViewModel в свой вид.

Может быть, вы можете добавить x и y в качестве свойств в ReversiModel?

Если вам нужно создать пользовательский регион, вы можете создать то, что было бы анонимным эквивалентом внутреннего класса, в Java говорят:

 class ReversiSquare : View() { val model: ReversiModel by inject() override val root = object : Region() { // ... override fun layoutChildren() { layoutInArea(highlight, 0.0, 0.0, width, height, baselineOffset, HPos.CENTER, VPos.CENTER); } } } 

Чтобы открыть этот «Просмотр», создайте новую область и вставьте в нее «ReversiModel»:

 // Create the model, set x, y and other initial state in the model val model = ReversiModel() model.x = 42 // Create a new scope and push the ReversiModel into it val scope = Scope(model) // Find the ReversiSquare in the new scope find<ReversiSquare>(scope) { // Do something with the sequare, like openWindow() or similar }