当天的问题是:如何从另一个线程调用控制器功能。我的应用程序如下所示:
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()
后直接调用它。
答案 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线程泛滥。