2017-05-29 6 views
1

Ich interessiere mich für eine interessante Aufgabe. Ich habe UI in JavaFx mit einem anderen Thread, der die Benutzeroberfläche aktualisiert. Ich habe Updates von Platform.runLater gestartet. Code:JavaFX Update UI von einem Thread Java 8

private void startUpdateDaemon() { 
    updateUserStatus(); 
    updateTable(); 
} 

private void startUpdateDaemonTask() { 
    Task task = new Task<Void>() { 
     @Override 
     protected Void call() throws Exception { 
      while (true) { 
       Platform.runLater(() -> { 
        startUpdateDaemon(); 
       }); 
       Thread.sleep(1000); 
      } 
     } 
    }; 
    Thread th = new Thread(task); 
    th.setDaemon(true); 
    th.start(); 
} 

@Override 
public void initialize(URL location, ResourceBundle resources) { 
    startUpdateDaemonTask(); 
} 

Auch habe ich in einer anderen Klasse, wo ich UI-Updates:

private void startUpdateDaemonTask() { 
    Task task = new Task<Void>() { 
     @Override 
     protected Void call() throws Exception { 
      while (true) { 
       Platform.runLater(new Runnable() { 
        @Override 
        public void run() { 
         updateGameStatus(); 
        } 
       }); 
       Thread.sleep(1000); 
      } 
     } 
    }; 

    Thread th = new Thread(task); 
    th.setDaemon(true); 
    th.start(); 
} 

So, endlich habe ich zwei Plätze mit Call "Platform.runLater" und verschiedene Methoden im Inneren. Meine Frage ist Kann ich nur "eine" Methode mit einmaligem Aufruf "Platform.runLater" erstellen und an diese Methode verschiedene Methoden senden die aufgerufen werden ?? Kann ich sein, kann ich Methode mit den Endverbrauchern schreiben und ihm die Methoden 'startUpdateDaemon()' und 'updateGameStatus()' schicken? Vielen Dank.

Antwort

3

Sie können Ihrer Methode einen Runnable Parameter hinzufügen. Dieser Parameter wird Ihnen gegeben Platform.runLater:

private void startUpdateDaemonTask(Runnable runner) { 
    Task task = new Task<Void>() { 
     @Override 
     protected Void call() throws Exception { 
      while (true) { 
       Platform.runLater(runner); 
       Thread.sleep(1000); 
      } 
     } 
    }; 

    Thread th = new Thread(task); 
    th.setDaemon(true); 
    th.start(); 
} 

Jetzt können Sie diese Methode mit Ihrer Methode Verweise aufrufen:

startUpdateDaemonTask(this::startUpdateDaemon); 
startUpdateDaemonTask(this::updateGameStatus); 
+0

Vielen Dank! Gute Möglichkeit. Das ist was ich brauche. – Leo

Verwandte Themen