gpt4 book ai didi

JavaFX - 事件期间的 Action

转载 作者:行者123 更新时间:2023-11-30 08:26:18 29 4
gpt4 key购买 nike

我试图在 javaFX 中的事件期间影响 UI 元素。

void buttonClicked(ActionEvent e) {
labelInfo.setText("restarting - might take a few seconds");
jBoss.restart();
labelInfo.setText("JBoss successfully restarted");
}

“jBoss.restart()” Action 等待 JBoss 重启。

问题:

不显示文本“restarting - ...”。应用程序等待 JBoss 重新启动,然后显示文本“JBoss successfully restarted”。

我的想法:场景在事件完成后刷新。所以第一次标签更改不会发生。

如何在 Activity 期间显示信息消息?

最佳答案

问题在于 FX 线程没有安全操作。所以我猜测 jBoss.restart() 会花费很多时间。所以你必须把这个命令放在一个服务中。此外,我还向您推荐一个进度指示器,以向用户显示您正在进行的长时间操作。

这是一个示例,但我鼓励您转到 Concurrency in JavaFX并深入了解它。也许还有其他事情可以帮助您。

import javafx.application.Application;
import javafx.concurrent.Service;
import javafx.concurrent.Task;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ProgressIndicator;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class Test extends Application {

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

private Label labelInfo;
private Button button;
private ProgressIndicator progressIndicator;

@Override
public void start(Stage stage) throws Exception {
VBox vbox = new VBox(5);
vbox.setAlignment(Pos.CENTER);
labelInfo = new Label();
button = new Button("Restart");
button.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
buttonClicked(event);
}
});
progressIndicator = new ProgressIndicator(-1);
progressIndicator.setVisible(false);
vbox.getChildren().addAll(labelInfo, progressIndicator, button);

Scene scene = new Scene(vbox, 300, 200);
stage.setScene(scene);
stage.show();
}

void buttonClicked(ActionEvent e) {
Service<Void> service = new Service<Void>() {
@Override
protected Task<Void> createTask() {
return new Task<Void>() {
@Override
protected Void call() throws Exception {
updateMessage("restarting - might take a few seconds");
// Here the blocking operation
// jBoss.restart();
Thread.sleep(10000);
updateMessage("JBoss successfully restarted");
return null;
}
};
}
};
// Make the progress indicator visible while running
progressIndicator.visibleProperty().bind(service.runningProperty());
// Bind the message of the service to text of the label
labelInfo.textProperty().bind(service.messageProperty());
// Disable the button, to prevent more clicks during the execution of
// the service
button.disableProperty().bind(service.runningProperty());
service.start();
}
}

关于JavaFX - 事件期间的 Action ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21621450/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com