javafx 从另一个线程调用控制器函数

javafx call controller function from another thread

今天的问题是:如何从另一个线程调用控制器函数。我的应用程序如下所示:

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

我想在 finally 块中调用 updateLog(),所以每次服务器更新 msg GUI 都会将此消息添加到日志 window。我的 msg

private volatile AtomicReference<String> msg = new AtomicReference<String>();

当我在 startServer() 中调用 updateLog(); 时它起作用了,它显示了第一条消息 Starting server,正如您可能猜到的那样,但是在那里调用了另一个 updateLog(); returns null所以我想在用完getMsg()后直接调用

不太清楚为什么你不能这样做

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() 调用淹没 UI 线程。