2017-06-22 4 views
0

je un programme simple JavaFX à Scala où j'ai un volet que j'écris des formes dans.Ajoutez des formes lors de l'exécution d'une autre classe dans 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) 
    } 
} 

Maintenant la classe SimpleWindow va être sur un thread séparé , et je veux être en mesure de faire une nouvelle ligne à partir d'une classe extérieure en utilisant la méthode lineTo. C'est là que tout échoue, quand j'utilise le lineTo de l'autre classe (sur un thread séparé) le gui ne se met pas à jour, et je crois que j'ai besoin d'un écouteur pour le mettre à jour quand un noeud est ajouté mais Je ne sais pas comment.

Une idée de comment je peux résoudre ce problème?

Répondre

0

Dans JavaFX comme dans la plupart des autres frameworks GUI, vous devez accéder aux contrôles de l'interface utilisateur uniquement depuis le "thread UI" dédié. Si vous souhaitez communiquer des informations à partir d'un thread d'arrière-plan, vous devez utiliser l'appel Platform.runLater qui publie des travaux sur ce thread.

Vous pouvez également envisager de lire le tutoriel Concurrency in JavaFX sur certaines API de plus haut niveau.

+0

J'ai enveloppé ma méthode lineTo dans un Platform.runLater mais cela n'a pas aidé du tout. Mais je vais essayer de regarder plus dans une solution en utilisant ça, merci. – Superovan

+0

@Superovan, 'runLater' devrait aider. Si ce n'est pas le cas, nous avons besoin d'un exemple reproductible où il en résulte une exception (ou un comportement incorrect) de toute façon. – SergGr