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 线程。
今天的问题是:如何从另一个线程调用控制器函数。我的应用程序如下所示:
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 线程。