gpt4 book ai didi

JavaFX:进程运行时禁用所有组件并显示进度指示器

转载 作者:行者123 更新时间:2023-12-01 08:57:26 24 4
gpt4 key购买 nike

我有一个方法可以从数据库读取值并返回 Map<Integer,String>.此方法需要一些时间才能返回 map 。

直到读取时间值,我想要一个进度指示器(仅加载环形指示器就足够了,不需要进度条)显示在屏幕上,并且应禁用所有其他组件,直到显示时间进度条.

public void scanDevice() {
ObservableList<TextField> list = FXCollections.observableArrayList(vehicleId, vehicleName, deviceType,
offboardBroker1, offboardBroker2, postfixQueue, pKIServer);
editedValuesMap.clear();
// devicePlugged = true;
if (cbChooseProject.getSelectionModel().getSelectedItem() != null) {
try {
devicePlugged = dsAdapter.getAdapter();
if (devicePlugged) {
if (bScanDevice.isFocused()) {
readMap = new HashMap<Integer, String>();
//Process Start
readMap = dsAdapter.initScan();
//Process End

if (!readMap.isEmpty() && readMap != null) {
isWritten = true;
isDeviceSideEnabled();
editDeviceContents.setDisable(false);
vehicleId.setText(readMap.get(0));
vehicleName.setText(readMap.get(1));
deviceType.setText(readMap.get(2));
offboardBroker1.setText(readMap.get(3));
offboardBroker2.setText(readMap.get(4));
postfixQueue.setText(readMap.get(5));
pKIServer.setText(readMap.get(6));
lContentsSerialNo.setText(readMap.get(7));
}
}
}

最佳答案

您可以使用如下方法禁用所有节点,但如果您还想在发生某些事情时等待,则使用 StackPane 进行覆盖可能是首选。

public void setNodesDiabled(boolean disable, Node... nodes) {
for(Node node : nodes) {
node.setDisable(disable);
}
}

使用任意节点数,您可以禁用和重新启用与进程相关的任意数量的节点。它还有助于清理,因为您不会有多个 node.setDisable(true); node2.setDisable(true); 等等。

在此示例中,您不需要 setNodesDisabled(),因为 StackPane 覆盖层会阻止单击除其内部内容之外的任何内容。背景颜色为灰色,透明度为 70%,因此您可以看出它是叠加层。

public class ProgressExample extends Application {

public StackPane layout, main, progress;

public StackPane createProgressPane() {
ProgressIndicator indicator = new ProgressIndicator();
indicator.setMaxHeight(50);
indicator.setMaxWidth(50);

StackPane pane = new StackPane();
pane.setAlignment(Pos.CENTER);
pane.setStyle("-fx-background-color: rgba(160,160,160,0.7)");
pane.getChildren().add(indicator);

Task<Void> task = new Task<Void>(){
protected Void call() throws Exception {
// Your process here.
// Any changes to UI components must be inside Platform.runLater() or else it will hang.
Thread.sleep(2000);

Platform.runLater(() -> {
layout.getChildren().remove(pane);
});
return null;
}
};
new Thread(task).start();
return pane;
}

public StackPane createMainPane() {
Label label = new Label("Hello World!");
label.setFont(Font.font("Tahoma", FontWeight.SEMI_BOLD, 16));

Button start = new Button("Start Process");
start.setOnAction(action -> {
progress = createProgressPane();
layout.getChildren().add(progress);
});

VBox vbox = new VBox(10);
vbox.setAlignment(Pos.CENTER);
vbox.getChildren().addAll(label, start);
vbox.setPadding(new Insets(10,10,10,10));

StackPane pane = new StackPane();
pane.getChildren().add(vbox);
return pane;
}

public void start(Stage stage) throws Exception {
main = createMainPane();

layout = new StackPane();
layout.getChildren().add(main);

Scene scene = new Scene(layout, 900, 550);
stage.setScene(scene);
stage.setTitle("Progress Example");
stage.setOnCloseRequest(e -> {
Platform.exit();
System.exit(0);
});
stage.show();
}

public static void main(String[] args) {
launch(args);
}
}
<小时/>

我相信问题是您正在尝试更改 Task 内的 TextField 的值,这不是 FX 应用程序线程,这就是您得到 不在 FX 应用程序线程上。要解决此问题,您需要将修改 Platform.runLater() 内的节点的行放入 if 语句中,如下所示。

if (readMap != null && !readMap.isEmpty()) { // Swap the order, can't check empty if it's null.
isWritten = true;
isDeviceSideEnabled();
Platform.runLater(() -> {
editDeviceContents.setDisable(false);
vehicleId.setText(readMap.get(0));
vehicleName.setText(readMap.get(1));
deviceType.setText(readMap.get(2));
offboardBroker1.setText(readMap.get(3));
offboardBroker2.setText(readMap.get(4));
postfixQueue.setText(readMap.get(5));
pKIServer.setText(readMap.get(6));
lContentsSerialNo.setText(readMap.get(7));
});
}

关于JavaFX:进程运行时禁用所有组件并显示进度指示器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41955874/

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