2017-12-11 4 views
1

Ich versuche TextArea mit Platform.runLater von einer anderen Klasse zu aktualisieren, die Runnable implementiert. Ich habe alle meine GUI in einer Klasse (dort ist, wo meine TextArea ist), ich erstelle einen new server Thread und läuft es, wenn ich die GUI erstellen. Ich versuche Platform.runLater aus dem Server Thread zu verwenden, um meine TextArea zu aktualisieren, aber Platform.runLater kann meine TextArea nicht erreichen.JavaFX Update TextArea aus einem anderen Thread mit Platform.runLater

public class SimulationWindow { 
    public SimulationWindow instance() { 
     return this; 
    } 
    public static void DisplaySimulationWindow() throws FileNotFoundException { 
     Stage SimuStage = new Stage(); 
     SimuStage.initModality(Modality.APPLICATION_MODAL); 
     SimuStage.setTitle("Simulation Window"); 
     Server myServer = new Server(instance()); 
     Thread serverThread = new Thread(myServer); 
     serverThread.start(); 
     TextArea serverTextArea; 
     . 
     . 
     . 
} 

public class Server implements Runnable { 
    @Override 
    public void run() { 
     while(true){ 
      whileConnected(); 
     . 
     . 
    } 
    private void whileConnected() throws IOException { 

     sendMessage(message); 

     do { 
      try { 
       message = (String) input.readObject(); 
       showMessage(message); 
       . 
       . 
       . 
    } 
    private void showMessage(String x) { 
    Platform.runLater(() -> serverTextArea.appendText(x));   
    } 

Ich habe versucht, die Instanz von meinem SimulationWindow an den Konstruktor Server vorbei, wie sie hier tun: Modifying JavaFX gui from different thread in different class

Aber Java lassen gewohnt meine SimulationWindow Instanz als Parameter für den Server construtor geben. Andere Lösungen haben die Server- und SimulationWindow-Klasse als eine, aber ich möchte sie getrennt halten. Irgendwelche Tipps werden geschätzt!

+1

Fügen Sie in Server einen Konstruktor hinzu, der textArea als Parameter annimmt – kleopatra

+0

* "Aber Java wird meine SimulationWindow-Instanz nicht als Parameter für den Server-Konstruktor übergeben." * Was für eine "SimulationWindow" -Instanz: Es gibt keine in Ihrem Code. Muss 'displaySimulationWindow() 'wirklich' statisch 'sein? –

+0

hi @James_D Ich habe der Frage die Instanzmethode hinzugefügt. Danke, dass du das gezeigt hast. Ich entfernte statische und jetzt kann ich die Instanz an den Server-Konstruktor senden, aber immer noch kann ich nicht auf die ServerTextArea aus dem Server zugreifen. – CCBoy

Antwort

0

Ich löste dies als kleopatra vorgeschlagen. Ich habe einen TextArea an meinen Server-Konstruktor übergeben. Ich wollte meine TextArea in meiner GUI von meiner GUI-Klasse und beim Abrufen von Nachrichten von einem Client in der Server-Klasse aktualisieren. (I erstellen und starten Sie meine Server innerhalb SimuWindow())

public class myGUI{ 
    public void SimuWindow(){ 
     //this method creates all the GUI. 
     Server myServer = new Server(serverTextArea); 
     Thread serverThread = new Thread(myServer); 
     serverThread.start(); 

     sendingTest = new TextField(); 
     sendingTest.setPromptText("test communication here"); 
     sendingTest.setOnAction(event -> { 
     String message = new String ("\nServer says: "); 
     message = message + sendingTest.getText(); 
     serverTextArea.appendText(message); 
     myServer.sendMessage(message); 
     sendingTest.clear(); 
    }); 
    } 
} 

public class Server implements Runnable{ 
    //This is my server class that connects and listens to clients 
    TextArea mytextArea; 
    public Server(TextArea x) { 
     this.mytextArea = x; 
    } 
    private void whileConnected() throws IOException {   
    do { 
     try { 
      message = (String) input.readObject(); 
      showMessage(message);    
     }catch(ClassNotFoundException classNotFoundException) { 
      System.out.println("\n i dont know the message"); 
     } 
    }while(!message.equals("Disconnected"));  

    private void showMessage(String mess) { 
      Platform.runLater(() -> mytextArea.appendText(mess));   
    } 
} 

tat ich das gleiche auf meinem Client-Klasse. Danke für Ihre Hilfe.

Verwandte Themen