Функция контроллера вызова javafx из другого потока
Вопрос дня: как вызвать функцию контроллеров из другого потока. Мое приложение выглядит так:
public class Server {
//(...)
public String setMsg(String string) {
msg.set(string+"\n");
mainScreenController.updateLog();
}
//(...)
while (true){
doThings();
}
}
public class MainScreenController {
//(...)
public void startServer(){
new Thread(server::start).start();
}
public void updateLog(){
Platform.runLater(()->{ testAreaLog.setText(testAreaLog.getText() + server.getMsg()); });
}
//(...)
}
Я хочу позвонить updateLog()
в блоке finally, поэтому каждый раз сервер обновляет msg
GUI добавляет это сообщение в окно журнала. мой msg
является
private volatile AtomicReference<String> msg = new AtomicReference<String>();
это работает, когда я звоню updateLog();
в startServer()
, отображает первое сообщение Starting server
как вы уже догадались, но зовет другого updateLog();
туда возвращается null
поэтому я хотел позвонить сразу после getMsg()
используется.
1 ответ
Решение
Не совсем понятно, почему ты не можешь просто сделать
public class MainScreenController {
//(...)
public void startServer(){
new Thread(server::start).start();
}
public void updateLog(String message){
Platform.runLater(()-> testAreaLog.appendText(message + "\n"));
}
//(...)
}
а также
public class Server {
public void start() {
while (true){
doThings();
String newMessage = ... ;
mainScreenController.updateLog(newMessage);
doMoreThings();
}
}
}
Это предполагает что-то в вашем while
цикл является блокирующим (или трудоемким) вызовом, поэтому вы не переполняете поток пользовательского интерфейса слишком большим количеством Platform.runLater()
звонки.