gpt4 book ai didi

java - 用于显示 ProgressBar 的弹出窗口未在 JavaFX 中显示

转载 作者:行者123 更新时间:2023-12-03 12:53:51 26 4
gpt4 key购买 nike

我想显示 ProgressBar使用 Popup在 JavaFX 中,这样我就可以制作 ProgressBar调用PopUp消失的hide()方法。然而,当后台任务完成时,ProgessBar 并没有消失,而是根本不显示。

import javafx.application.Application;
import javafx.concurrent.Task;
import javafx.scene.Scene;
import javafx.scene.control.ProgressBar;
import javafx.scene.layout.StackPane;
import javafx.stage.Popup;
import javafx.stage.Stage;

public class Main extends Application {

@Override
public void start(Stage stage) {
StackPane root = new StackPane();

Popup popup = new Popup();
ProgressBar bar = new ProgressBar();
popup.getContent().add(bar);

Task<Void> task = new Task<>() {
@Override
protected Void call() {
for (int i = 0; i < 100; i++) {
try {
Thread.sleep(100);
updateProgress(i, 100);
} catch (Exception ignored) {
}
}
return null;
}
};

bar.progressProperty().bind(task.progressProperty());
task.setOnSucceeded(workerStateEvent -> popup.hide());
popup.show(stage);
new Thread(task).start();

stage.setScene(new Scene(root, 100, 100));
stage.show();
}

public static void main(String[] args) {
launch(args);
}
}
当我运行上面的代码时,我看到的只是一个空白阶段,如下所示:
Blank stage in place of ProgressBar
如果我添加 ProgressBarStage手动使用 root.getChildren().add(bar) ,条形图正确显示,其 progressProperty正确绑定(bind),所以我知道问题出在 Popup .但是,使用该方法,后台任务完成后该栏不会消失。

最佳答案

我在任何地方都找不到此文档,但我认为 Popup 的所有者必须为 Popup.show(owner) 显示成功的方法。因此,您的代码的以下重新排序(在 stage.show() 之前调用 popup.show(stage) )有效:

@Override
public void start(Stage stage) {
StackPane root = new StackPane();

Popup popup = new Popup();
ProgressBar bar = new ProgressBar();
popup.getContent().add(bar);

Task<Void> task = new Task<>() {
@Override
protected Void call() {
for (int i = 0; i < 100; i++) {
try {
Thread.sleep(100);
updateProgress(i, 100);
} catch (Exception ignored) {
}
}
return null;
}
};

bar.progressProperty().bind(task.progressProperty());
task.setOnSucceeded(workerStateEvent -> popup.hide());

stage.setScene(new Scene(root, 100, 100));
stage.show();

popup.show(stage);
new Thread(task).start();

}
请注意您的其他方法有效:您只需在任务完成后从场景图中删除进度条:
    @Override
public void start(Stage stage) {
StackPane root = new StackPane();

// Popup popup = new Popup();

ProgressBar bar = new ProgressBar();
// popup.getContent().add(bar);
root.getChildren().add(bar);

Task<Void> task = new Task<>() {
@Override
protected Void call() {
for (int i = 0; i < 100; i++) {
try {
Thread.sleep(100);
updateProgress(i, 100);
} catch (Exception ignored) {
}
}
return null;
}
};

bar.progressProperty().bind(task.progressProperty());
// task.setOnSucceeded(workerStateEvent -> popup.hide());
task.setOnSucceeded(event -> root.getChildren().remove(bar));

stage.setScene(new Scene(root, 100, 100));
stage.show();


// popup.show(stage);
new Thread(task).start();

}

关于java - 用于显示 ProgressBar 的弹出窗口未在 JavaFX 中显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63284460/

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