2017-06-22 64 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