我正在使用背景Thread
运行我的加载代码并希望绑定(bind) MessageProperty
Task
的到标签。
但是,当调用updateMessage()
时任务挂起;该消息永远不会更新,并且下一行代码不会执行。
这里使用的是 JDK 1.10.1。这是一个 MCVE:
import javafx.application.Application;
import javafx.concurrent.Task;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class Main extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
VBox root = new VBox(10);
Label label = new Label("Message");
root.getChildren().add(label);
primaryStage.setScene(new Scene(root));
Task loadingTask = new LoadingTask();
Thread loadingThread = new Thread(loadingTask);
loadingThread.setDaemon(true);
label.textProperty().bind(loadingTask.messageProperty());
loadingThread.start();
primaryStage.setWidth(200);
primaryStage.setHeight(200);
primaryStage.show();
}
}
class LoadingTask<Void> extends Task {
@Override
protected Object call() throws Exception {
System.out.println("Loading task ...");
updateMessage("Loading task ...");
System.out.println("Message: " + getMessage());
return null;
}
}
输出:
Loading task ...
第二个System.out.println()
永远不会被执行。
编辑:
我向 MCVE 添加了一个简单的 GUI,其标签绑定(bind)到 MessageProperty
。标签确实更新为显示“正在加载任务...”,但控制台输出保持不变; updateMessage()
之后的代码方法被调用并不执行。
第二次编辑:
我运行了我的单步调试器,并且出现 IllegalStateException
正在从Task
抛出class: “任务只能在 FX 应用程序线程中使用”
我不确定这意味着什么,因为重点是在不同的线程上运行此任务...
最佳答案
您唯一的问题是,您不能从 FX UI 线程以外的其他线程访问 getMessage()
。尝试 Platform.runLater(() -> System.out.println("Message: "+ getMessage()));
关于java - 更新任务中的消息会挂起应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51224740/