3

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 を定義する方法がわからないため、これは機能しません。

4

1 に答える 1

1

GridPane.add メソッドを使用して、gameData を受け取ったときに GUI に新しい要素を追加していました。

そうする代わりに、オブジェクトの作成中にすべてのコントロール (GUI ノード/要素) を追加し、gameData を受け取ったときに関連する属性を変更しました。

たとえば、gameData を受け取るときに、Label.text を「No Game Data」から空の文字列に設定します。

def update {
ClientGUI.msgLabel = " "
}

マルチスレッドアプリケーションで変数を公開しているため、これが最善のアプローチだとは思いませんが、新しいデータを受け取ったときに 1 つの場所から変数を変更するだけなので、問題ないはずです。

理想的には、条件式を使用してコントロール属性を定義したいと思います。

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 を定義する方法がわからないため、これは機能しません。

于 2015-11-16T13:05:45.160 に答える