doubleBinding 无效
doubleBinding has no effect
我正在用 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
}
}
我想将旋转 t运行sformation 绑定到风向设置。
当我使用旧的 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
}
我是不是漏掉了什么?
doubleBinding()
函数创建了一个 Binding
,但没有将其绑定到任何东西。
事实上,我们有两种方法来创建这个绑定:
doubleBinding(someProperty) { ... }
。在 属性 (this) 上运行并期望您 return 一个 Double。它不可为空。
someProperty.doubleBinding() { ... }
接收该值作为参数并期望您 return 一个 Double。该参数可以为空,因此您需要考虑到这一点
你有两个选择:
rot.angleProperty().bind(doubleBinding(Wind.directionProperty) {
value.degree * 45
})
或
rot.angleProperty().bind(Wind.directionProperty.doubleBinding {
it?.degree ?: 0.0 * 45
})
您选择哪一个主要取决于品味,尽管在某些情况下一个会比另一个更自然。
我正在用 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
}
}
我想将旋转 t运行sformation 绑定到风向设置。
当我使用旧的 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
}
我是不是漏掉了什么?
doubleBinding()
函数创建了一个 Binding
,但没有将其绑定到任何东西。
事实上,我们有两种方法来创建这个绑定:
doubleBinding(someProperty) { ... }
。在 属性 (this) 上运行并期望您 return 一个 Double。它不可为空。someProperty.doubleBinding() { ... }
接收该值作为参数并期望您 return 一个 Double。该参数可以为空,因此您需要考虑到这一点
你有两个选择:
rot.angleProperty().bind(doubleBinding(Wind.directionProperty) {
value.degree * 45
})
或
rot.angleProperty().bind(Wind.directionProperty.doubleBinding {
it?.degree ?: 0.0 * 45
})
您选择哪一个主要取决于品味,尽管在某些情况下一个会比另一个更自然。