Javafx从线程更新UI Java 8

问题描述:

我对一个有趣的任务感兴趣。我使用另一个更新UI的线程在JavaFx中创建了UI。我从Platform.runLater开始更新。代码:Javafx从线程更新UI 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(); 
} 

我也有发生在另一个类,我更新UI:

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(); 
} 

所以,最后我有两个地方跟叫“Platform.runLater”和内部的不同方法。 我的问题是我可以创建只有一个“方法”一次调用“Platform.runLater”并发送到此方法将调用不同的方法?可能我可以用消费者写完成方法并向他发送方法'startUpdateDaemon()'和'updateGameStatus()'? 非常感谢。

您可以为您的方法添加Runnable参数。这个参数是给你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(); 
} 

现在你可以调用这个方法与你的方法引用:

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

非常感谢!好办法。这就是我需要的。 – Leo