代码之家  ›  专栏  ›  技术社区  ›  Zephyr

更新任务中的消息将挂起应用程序

  •  0
  • Zephyr  · 技术社区  · 8 年前

    我使用的是背景 Thread 运行我的加载代码并希望绑定 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,并将标签绑定到 消息属性 . 标签 更新以显示“加载任务…”,但控制台输出保持不变;代码位于 更新消息() 调用的方法不执行。

    第二次编辑:

    我运行了我的步骤调试程序, IllegalStateException 正在从 任务 类:“只能从fx应用程序线程使用任务”

    1 回复  |  直到 8 年前
        1
  •  3
  •   Halko Karr-Sajtarevic    8 年前

    getMessage() Platform.runLater(() -> System.out.println("Message: " + getMessage()));

    推荐文章