2016-09-08 6 views
0

In meinem Programm mache ich oft Änderungen an der Benutzeroberfläche mit einem anderen Thread. Die Änderungen sehen wie folgt aus:Platform.runLater() mit Lambda-Ausdruck funktioniert nicht

buffer.add(new Object[]{message.getSecondNode().getUINode(), "red"}); 

deshalb ich diese Änderungen, um Puffer nicht die Benutzeroberfläche zu überlasten. In der folgenden Methode führt das Programm jedoch nicht alle Änderungen im Puffer aus.

private void changeColor(List<Object[]> buffer) { 
    Platform.runLater(() -> { 
     for (Object[] object : buffer) { 
      if (object[0] instanceof UIEdge) { 
       UIEdge edge = (UIEdge) object[0]; 
       edge.setColor((String) object[1]); 
      } else if (object[0] instanceof UINode) { 
       if ((String) object[1] == "red") 
        Util.print(""); 
       UINode node = (UINode) object[0]; 
       node.getEllipse().setFill(Paint.valueOf((String) object[1])); 
      } 
     } 
    }); 
} 

Im folgende Bild sehen Sie, dass der Puffer eine andere Größe in dem Verfahren zu seiner globalen Größe im Programm hat. Weiß jemand warum?

+2

Ist 'buffer' ein threadsicherer Typ? – RealSkeptic

+0

OT, aber 'if ((String) object [1] ==" red ")' [wird nicht funktionieren] (http://stackoverflow.com/questions/513832/how-do-i-compare-strings-in -java) –

+0

@James_D In diesem Beispiel wird es funktionieren (mit String-Literalen), aber es ist wahrscheinlich Glück. – assylias

Antwort

0

Sie könnten mit JavaFX Service und Task anstelle eines Puffers zu prüfen, Änderungen zu machen. Dies sind JavaFX-Klassen, die bereitgestellt werden, um das Multithreading in einer JavaFX-Anwendung zu erleichtern.

https://docs.oracle.com/javase/8/javafx/api/javafx/concurrent/Task.html

Da die Aufgabe für die Verwendung mit JavaFX GUI-Anwendungen konzipiert ist, stellt sicher, dass jede Änderung ihrer öffentlichen Eigenschaften, sowie Änderungsbenachrichtigungen für Staat, Fehler und für Event-Handler, die alle auftreten auf dem Haupt-JavaFX-Anwendungs-Thread.

https://docs.oracle.com/javase/8/javafx/api/javafx/concurrent/Service.html

Der Dienst verwendet standardmäßig einen Thread-Pool Executor mit einem nicht näher Standard oder maximale Threadpoolgröße. Dies geschieht, damit der naive Code das System nicht vollständig überschwemmt, indem er Tausende von Threads erstellt.

Hier ist ein kurzes Tutorial, wenn Sie nicht bereits mit ihnen vertraut sind. https://docs.oracle.com/javase/8/javafx/interoperability-tutorial/concurrency.htm

Verwandte Themen