我正在制作一个多人游戏客户端,使用ScalaFX GUI和Akka远程进行网络连接。当我的客户端收到游戏数据时,它将其存储在Model.gameData中。我需要我的GUI来响应这个变量。
我使用gameData在我的Model对象中创建数据:ObjectProperty:
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
}
}
drawGrid和drawPlayer是我用来更新GUI的方法,位于CleintGUI对象中。我厌倦了使用addListener和onChange,他们编译,但我放在其中的方法永远不会被调用。
val data = new BooleanProperty(this,"data",Model.gameData.isDefined)
val msgLabel = new Label{
text <== when(data) choose " " otherwise "No GameData"
}
我错过了什么?我是否声明了数据:我的ClientGUI中的ObectProperty或方法不正确?
当我通过在TextField中提交字符串创建事件来手动调用它们时,drawGrid和drawPlayer都可以工作。当我收到GameData时,我也尝试直接在我的actor类中调用drawGrid和drawPlayer表单,但是我得到了一个错误&#34;不是FX线程&#34;。编辑:我通过改变控件属性来更新GUI。但是,理想情况下,我希望使用条件表达式来定义控件属性:
sum
但这并不起作用,因为我无法找到一种方法来定义BooleanProperty,以便当(数据)根据布尔值更改值时Model.gameData.isDefined
答案 0 :(得分:0)
当我通过使用GridPane.add方法收到gameData时,我正在向GUI添加新元素。
我没有这样做,而是在创建对象时添加了所有控件(gui节点/元素),然后在收到gameData时更改了相关属性。
e.g。我从&#34; No Game Data&#34;设置了Label.text;收到gameData时为空字符串:
def update {
ClientGUI.msgLabel = " "
}
我不认为这是最好的方法,因为现在我在多线程应用程序中有公开可用的变量,但由于我只是在收到新数据时从一个地方更改它们应该没问题。
理想情况下,我想通过使用条件表达式来定义控件属性:
val data = new BooleanProperty(this,"data",Model.gameData.isDefined)
val msgLabel = new Label{
text <== when(data) choose " " otherwise "No GameData"
}
但这并不起作用,因为我无法找到一种方法来定义BooleanProperty,以便当(数据)根据布尔值更改值时Model.gameData.isDefined