草庐IT

JavaFX : Update UI label asynchronously with messages while application different methods execution

coder 2024-03-14 原文

我正在尝试使用应用程序的各种状态消息异步更新我的 JavaFx GUI 中的标签。

例如

我的应用程序中的“更新”按钮调用 Controller 中的方法 updateSettings()。现在我尝试通过以下方式更新 UI 上的标签。

@FXML
private void updateSettings() {
    label.text("message1");

    //some action

    lable.text("action done");

    label.text("calling method.. wait for some time")
    // call to time consuming method - timeConsumingMethod();

    label.text
    label.text("operation completely successfully");
}

private void timeConsumingMethod() {

    label.text("message2");
    //some actions
    label.text("message3");

    //more  time consuming actions
    label.text("time consuming method is done with success");
}

我希望在执行流程时这些消息应显示在标签中,以向用户展示应用程序中正在进行的各种 Activity 。

如何实现这种行为?

最佳答案

您在 JavaFX 应用程序线程之外运行耗时的方法(在 Task 中)。任务中有特殊的 API,可以轻松提供状态消息,这些消息可以显示在绑定(bind)标签中。

我对下面的代码所做的是尝试创建一个系统来模仿您在问题中提供的建议流程和消息报告。由于代码中记录的各种原因,用户只能看到一些消息。

import javafx.concurrent.Task;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.stage.*;
import javafx.application.*;

public class MessagingDemo extends Application {
  public void start(Stage stage) {
    // "message1" won’t be seen because we perform the next action on the JavaFX 
    // application thread then update the label text again without releasing the 
    // thread to the JavaFX system.
    Label label = new Label("message1");
    label.setPrefWidth(300);

    // some action

    // "action done" won’t be seen because we set text again in the next statement.
    label.setText("action done");

    // you're not going to see this because we immediately bind text to the task text and launch the task. 
    label.text("calling method.. wait for some time") 

    Task <Void> task = new Task<Void>() {
      @Override public Void call() throws InterruptedException {
        // "message2" time consuming method (this message will be seen).
        updateMessage("message2");

        // some actions
        Thread.sleep(3000);

        // "message3" time consuming method (this message will be seen).
        updateMessage("message3"); 

        //more  time consuming actions
        Thread.sleep(7000);

        // this will never be actually be seen because we also set a message 
        // in the task::setOnSucceeded handler.
        updateMessage("time consuming method is done with success");

        return null;
      }
    };

    label.textProperty().bind(task.messageProperty());

    // java 8 construct, replace with java 7 code if using java 7.
    task.setOnSucceeded(e -> {
      label.textProperty().unbind();
      // this message will be seen.
      label.setText("operation completed successfully");
    });

    Thread thread = new Thread(task);
    thread.setDaemon(true);
    thread.start();

    stage.setScene(new Scene(label));
    stage.show();
  }

  public static void main(String args[]) {
    launch(args);
  }
}

关于JavaFX : Update UI label asynchronously with messages while application different methods execution,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19968012/

有关JavaFX : Update UI label asynchronously with messages while application different methods execution的更多相关文章

随机推荐