簡體   English   中英

ScalaFX如何創建對var(ObjectProperty)中的更改做出反應的方法?

[英]ScalaFX How do I create a method to react to changes in a var (ObjectProperty)?

我正在使用ScalaFX GUI和Akka遠程處理網絡制作多人游戲客戶端。 當我的客戶收到游戲數據時,它將其存儲在Model.gameData中。 我需要我的GUI來響應此變量更改。

我使用gameData在我的Model對象中創建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
 }

}

我想念什么? 我在ClientGUI中錯誤地聲明了data:ObectProperty或方法嗎?

當我通過在TextField中提交字符串創建事件來手動調用它們時,drawGrid和drawPlayer都可以工作。 當我收到GameData時,我還嘗試直接在actor類內部調用drawGrid和drawPlayer表單,但出現錯誤“ Not a FX thread”。

編輯:我得到了通過更改控件屬性來更新GUI。 但是,理想情況下,我想使用條件表達式來定義控件屬性:

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

val msgLabel = new Label{
                 text <== when(data) choose " " otherwise "No GameData"
               } 

但這是行不通的,因為我無法找出一種定義BooleanProperty的方式,以便when(data)根據boolean Model.gameData.isDefined來更改值

當我使用GridPane.add方法接收到gameData時,正在向GUI添加新元素。

我沒有這樣做,而是在對象創建過程中添加了所有控件(gui節點/元素),然后在收到gameData時更改了它們的相關屬性。

例如,當我收到gameData時,我將Label.text從“ No Game Data”設置為一個空字符串:

def update {
ClientGUI.msgLabel = " "
}

我不認為這是最好的方法,因為現在我在多線程應用程序中具有公開可用的var,但是由於我只在收到新數據時才從一個位置更改它們,所以應該沒問題。

理想情況下,我想使用條件表達式來定義控件屬性:

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

val msgLabel = new Label{
                 text <== when(data) choose " " otherwise "No GameData"
               } 

但這是行不通的,因為我無法找出一種定義BooleanProperty的方式,以便when(data)根據boolean Model.gameData.isDefined來更改值

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM