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);
非常感谢!好办法。这就是我需要的。 – Leo