问题是
Clock.curTime
它只是一个变量,其值会定期更新-它不是一个观察到的属性,因此当它被更改时不会发生任何事情。特别是,这个变量和您的
Text
元素的内容
您所做的是初始化
StringProperty
具有该值-但由于属性本身从未更新,因此标签也不会更新。我想你想做的是
curTime
一
StringProperty
而不仅仅是一个
String
. 现在,无论何时更改该属性的值
文本
元素的值将相应更改。
您应该注意,与
JavaFX
/
ScalaFX公司
只能发生在
JavaFX应用程序线程
,因此如果您尝试更新
柯蒂姆
从另一个线程,你会遇到问题。实现这一点的一种方法是传递实际更新的代码
柯蒂姆
到
Platform.runLater
.
然而,更简单的方法是使用定时
ScalaFX公司
要更新的事件
柯蒂姆
从内部定期
/
ScalaFX公司
,如下所示:
import model.Clock
import scalafx.application.JFXApp
import scalafx.application.JFXApp.PrimaryStage
import scalafx.geometry.Insets
import scalafx.scene.Scene
import scalafx.scene.layout.HBox
import scalafx.scene.text.Text
import scalafx.Includes._
object Main
extends JFXApp {
val clock = new Text()
clock.text <== Clock.curTime
stage = new PrimaryStage {
title = "ScalaFX clock"
scene = new Scene {
content = new HBox {
padding = Insets(50, 80, 50, 80)
children = clock
}
}
}
}
在里面
Clock.scala
:
import java.util.Date
import java.text.SimpleDateFormat
import scalafx.animation.PauseTransition
import scalafx.application.Platform
import scalafx.beans.property.StringProperty
import scalafx.util.Duration
import scalafx.Includes._
object Clock {
assert(Platform.isFxApplicationThread)
private val dateFormat = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss")
val curTime = new StringProperty(getDate())
val timer = new PauseTransition(Duration(1000))
timer.onFinished = {_ =>
curTime.value = getDate()
timer.playFromStart()
}
timer.play()
private def getDate() = dateFormat.format(new Date())
}