2017-06-22 63 views
0

我Scala中的一個簡單的JavaFX程序在那裏我有我寫的形狀在一個窗格。添加形狀在JavaFX

class SimpleWindow extends Application { 
    val pane = new BorderPane 
    val subPane = new Pane 
    var coord = (0, 0) 
    var primeStage: Stage = _ 
    var x = 600 
    var y = 600 

    override def start(primaryStage: Stage) { 
    primeStage = primaryStage 
    pane.setCenter(subPane) 
    val line = new Line(25, 25, 50, 50) 
    subPane.getChildren.add(line) 

    val x = 600 
    val y = 600 
    val scene = new Scene(pane, x, y) 

    // Finalize and show the stage 
    primaryStage.setScene(scene) 
    primaryStage.setTitle("The Click Me App") 
    primaryStage.show() 
    } 

    def moveTo(x: Int, y: Int): Unit = { 
    SimpleWindow.this.coord = (x, y) 
    } 

    def lineTo(x: Int, y: Int): Unit = { 
    val line = new Line(coord._1, coord._2, x, y) 
    SimpleWindow.this.subPane.getChildren.add(line) 
    SimpleWindow.this.coord = (x, y) 
    } 
} 

現在simplewindow類將是一個單獨的線程,我希望能夠使用lineTo方法從外部類創建一個新行。這是所有失敗的地方,當我使用其他類的lineTo(在一個單獨的線程上)時,gui不會更新,我相信我需要在窗格上添加某種偵聽器,以便在添加節點時進行更新,但是我不知道怎麼。

任何想法如何解決這個問題?

回答

0

在JavaFX中與其他大多數GUI框架一樣,您只能從專用的「UI線程」訪問UI控件。如果你想從後臺線程傳遞一些信息,你應該使用Platform.runLater調用哪些帖子工作到該線程。

您也可以考慮閱讀Concurrency in JavaFX關於一些更高級別的API的教程。

+0

我沒有包裹我的lineTo方法在Platform.runLater中,但它根本沒有幫助。但我會試着用更多的東西來看看,謝謝。 – Superovan

+0

@Superovan,'runLater'應該有所幫助。如果沒有,我們需要一個可重複的例子,它會導致異常(或錯誤的行爲)。 – SergGr