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

时间:2018-05-23 16:24:28

标签: multithreading javafx shared-variable

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

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都会将此消息添加到日志窗口。我的msg

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

当我在updateLog();中拨打startServer()时,它会显示第一条消息Starting server,您可能会猜到,但是调用另一条updateLog();会返回null所以我想在使用getMsg()后直接调用它。

1 个答案:

答案 0 :(得分:0)

不清楚为什么你不能做

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线程泛滥。