[英]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.