JavaFx:在执行应用程序不同方法时,与消息异步更新UI标签
我正在尝试使用各种状态消息为应用程序异步更新JavaFx GUI中的标签。
例如
我的应用程序中的“更新”按钮在控制器中调用方法updateSettings()。现在,我尝试以以下方式更新UI上的标签。
@FXMLprivate 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");
}
我希望这些消息应在流程执行时显示在标签中,以向用户显示应用程序中正在进行的各种活动。
如何实现这种行为?
回答:
您可以在JavaFX应用程序线程之外(在Task中)运行耗时的方法。任务中具有特殊的API,可轻松提供状态消息,这些消息可以在绑定的标签中显示。
我对以下代码所做的工作是尝试创建一个模拟您在问题中提供的建议流程和消息报告的系统。由于代码中记录的各种原因,用户只能看到一些消息。
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:在执行应用程序不同方法时,与消息异步更新UI标签 的全部内容, 来源链接: utcz.com/qa/423464.html