0

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

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 块中调用,所以每次服务器更新msgGUI 时都会将此消息添加到日志窗口。我msg的是

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

当我打电话时它会起作用updateLog();,它会显示您可能猜到startServer()的第一条消息,但是在那里调用另一个消息会返回,所以我想在使用后直接调用它。Starting serverupdateLog();nullgetMsg()

4

1 回答 1

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

于 2018-05-23T17:32:52.433 回答