ScalaFX GUI とネットワーク用の Akka リモート処理を使用して、マルチプレイヤー ゲーム クライアントを作成しています。クライアントがゲーム データを受信すると、それを Model.gameData 内に保存します。この変数の変更に対応するには、GUI が必要です。
モデル オブジェクトに data:ObjectProperty を作成するために gameData を使用しました。
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
}
}
私は何が欠けていますか?ClientGUI 内で data:ObectProperty またはメソッドを正しく宣言していませんか?
drawGrid と drawPlayer はどちらも、TextField に文字列を送信してイベントを作成し、手動で呼び出すと機能します。GameData を受け取ったときに、アクター クラス内で drawGrid と drawPlayer フォームを直接呼び出そうとしましたが、「FX スレッドではありません」というエラーが発生しました。
編集: コントロール属性を変更して GUI を更新しました。ただし、条件式を使用してコントロール属性を定義するのが理想的です。
val data = new BooleanProperty(this,"data",Model.gameData.isDefined)
val msgLabel = new Label{
text <== when(data) choose " " otherwise "No GameData"
}
しかし、boolean Model.gameData.isDefined に応じて when(data) が値を変更するように BooleanProperty を定義する方法がわからないため、これは機能しません。