TornadoFx: сложное связывание - PullRequest
0 голосов
/ 22 декабря 2018

Я беру свой первый эксперимент с TornadoFX и столкнулся с проблемой, которую я не понимаю.

У меня есть объект Wind:

enum class Direction(val displayName: String, val abbrevation: String, val deltaX: Int, val deltaY: Int) {

    NORTH("Észak", "É", 0, -1),
    NORTH_EAST("Északkelet", "ÉK", 1, -1),
    EAST("Kelet", "K", 1, 0),
    SOUTH_EAST("Délkelet", "DK", 1, 1),
    SOUTH("Dél", "D", 0, 1),
    SOUTH_WEST("Délnyugat", "DNy", -1, 1),
    WEST("Nyugat", "Ny", -1, 0),
    NORTH_WEST("Északnyugat", "ÉNy", -1, -1);

    val diagonal: Boolean = deltaX != 0 && deltaY != 0
    val degree: Double = ordinal * 45.0

    fun turnClockwise(eighth: Int = 1) = values()[(ordinal + eighth) umod 8]
    fun turnCounterClockwise(eighth: Int = 1) = values()[(ordinal - eighth) umod 8]
    fun turn(eighth: Int = 1) = if (eighth < 0) turnCounterClockwise(eighth.absoluteValue) else turnClockwise(eighth)

    infix operator fun plus(eighth: Int) = turn(eighth)
    infix operator fun minus(eighth: Int) = turn(-eighth)

    infix operator fun minus(other: Direction) = (ordinal - other.ordinal) umod 8
}

object Wind {

    val directionProperty = SimpleObjectProperty<Direction>(Direction.NORTH)
    var direction: Direction
        get() = directionProperty.value
        set(value) {
            println("SET WIND: $value")
            directionProperty.value = value
        }
}

Я хотел быпривязать преобразование вращения к настройке направления ветра.

Когда я использую старый стиль JavaFX, он работает:

rot.angleProperty().bind(
    createDoubleBinding(
        Callable { 
            println("Direction: ${Wind.direction}");       
            Wind.directionProperty.value.degree * 45 
        }, 
        Wind.directionProperty))

Когда я пытаюсь использовать более элегантный стиль Kotlinверсия, это не связывает:

rot.angleProperty().doubleBinding(rot.angleProperty() ) {
    println("Direction: ${Wind.direction}")
    Wind.directionProperty.value.degree * 45
}

Я что-то пропустил?

1 Ответ

0 голосов
/ 22 декабря 2018

Функция doubleBinding() создает Binding, но она ни к чему не привязывает.

Фактически у нас есть два способа создать эту привязку:

  1. doubleBinding(someProperty) { ... }.Оператор на имущество (это) и ожидает, что вы вернете Double.Это не обнуляемое значение.

  2. someProperty.doubleBinding() { ... } получает значение в качестве параметра и ожидает, что вы вернете Double.Параметр имеет значение nullable, поэтому вам необходимо учесть это

, что оставляет вам два варианта:

rot.angleProperty().bind(doubleBinding(Wind.directionProperty) {
    value.degree * 45
})

или

rot.angleProperty().bind(Wind.directionProperty.doubleBinding {
    it?.degree ?: 0.0 * 45 
})

Какой из них вы выберете, в основном зависит от вкуса, хотя в некоторых случаях один будет более естественным, чем другой.

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