функция вызова контроллера javafx из другого потока - PullRequest
0 голосов
/ 23 мая 2018

Вопрос дня: как вызвать функцию контроллеров из другого потока.Мое приложение выглядит так:

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 Ответ

0 голосов
/ 23 мая 2018

Не совсем понятно, почему вы не можете просто сделать

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().

...