ScalaFX如何创建一个方法来响应var(ObjectProperty)中的更改?

ScalaFX如何创建一个方法来响应var(ObjectProperty)中的更改?,scala,scalafx,Scala,Scalafx,我正在制作一个多人游戏客户端,带有ScalaFX GUI和用于联网的Akka远程处理。当我的客户端收到游戏数据时,它会将其存储在Model.gameData中。我需要GUI来响应这个变量的更改 我使用gameData在模型对象中创建data:ObjectProperty: object Model { var gameData:Option[GameData] = None val data = new ObjectProperty(this,"data",Model.game

我正在制作一个多人游戏客户端,带有ScalaFX GUI和用于联网的Akka远程处理。当我的客户端收到游戏数据时,它会将其存储在Model.gameData中。我需要GUI来响应这个变量的更改

我使用gameData在模型对象中创建data:ObjectProperty:

object Model  {
    var gameData:Option[GameData] = None
    val data = new ObjectProperty(this,"data",Model.gameData)
    ...
}
drawGrid和drawPlayer是我用来更新GUI的方法,位于CleintGUI对象中。我厌倦了使用addListener和onChange,它们可以编译,但我放在其中的方法从未被调用

object ClientGUI extends JFXApp{
 ...

 Model.data.addListener{ (o: javafx.beans.value.ObservableValue[_ <:Option[GameData]], oldVal: Option[GameData], newVal: Option[GameData]) =>
  drawGrid
  drawPlayer
 }

 Model.data onChange {
  drawGrid
  drawPlayer
 }

}
objectclientgui扩展了JFXApp{
...
Model.data.addListener{(o:javafx.beans.value.observeValue[\u
牵引格栅
拉丝机
}
Model.data onChange{
牵引格栅
拉丝机
}
}
我遗漏了什么?我是否在ClientGUI中错误地声明了data:ObectProperty或方法?

val data = new BooleanProperty(this,"data",Model.gameData.isDefined)

val msgLabel = new Label{
                 text <== when(data) choose " " otherwise "No GameData"
               } 
val data = new BooleanProperty(this,"data",Model.gameData.isDefined)

val msgLabel = new Label{
                 text <== when(data) choose " " otherwise "No GameData"
               } 
drawGrid和drawPlayer在我通过提交文本字段中的字符串创建事件来手动调用它们时都可以工作。当我收到游戏数据时,我也尝试在我的actor类中直接调用drawGrid和drawPlayer表单,但我得到了一个错误“不是FX线程”

编辑:我通过改变控件属性来更新GUI。但是,理想情况下,我希望通过使用条件表达式来定义控件属性:

val data = new BooleanProperty(this,"data",Model.gameData.isDefined)

val msgLabel = new Label{
                 text <== when(data) choose " " otherwise "No GameData"
               } 
val data = new BooleanProperty(this,"data",Model.gameData.isDefined)

val msgLabel = new Label{
                 text <== when(data) choose " " otherwise "No GameData"
               } 
val data=new BooleanProperty(此“数据”,Model.gameData.isDefined)
val msgLabel=新标签{

text当我收到游戏数据时,我正在使用GridPane.add方法向GUI添加新元素

我没有这样做,而是在对象创建期间添加了所有控件(gui节点/元素),然后在收到游戏数据时更改了它们的相关属性。

e、 g.当我收到游戏数据时,我将Label.text从“无游戏数据”设置为空字符串:

def update {
ClientGUI.msgLabel = " "
}
我不认为这是最好的方法,因为现在我已经在多线程应用程序中公开了可用的变量,但是因为我只在收到新数据时从一个地方更改它们,所以应该可以

理想情况下,我希望使用条件表达式定义控件属性:

val data = new BooleanProperty(this,"data",Model.gameData.isDefined)

val msgLabel = new Label{
                 text <== when(data) choose " " otherwise "No GameData"
               } 
val data = new BooleanProperty(this,"data",Model.gameData.isDefined)

val msgLabel = new Label{
                 text <== when(data) choose " " otherwise "No GameData"
               } 
val data=new BooleanProperty(此“数据”,Model.gameData.isDefined)
val msgLabel=新标签{

哪个控件使用变量gameData还是data?@ItachiUchiha I更新了帖子。