【问题标题】:Popup intended to display ProgressBar not showing in JavaFX用于显示 ProgressBar 的弹出窗口未在 JavaFX 中显示
【发布时间】:2020-11-26 18:25:54
【问题描述】:

我想在 JavaFX 中使用Popup 显示ProgressBar,这样我就可以通过调用PopUphide() 方法使ProgressBar 消失。但是,当后台任务完成时,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);
    }
}

当我运行上面的代码时,我看到的只是一个空白阶段,如下所示:

如果我使用root.getChildren().add(bar) 手动将ProgressBar 添加到Stage,则该栏正确显示,其progressProperty 正确绑定,所以我知道问题出在Popup。但是,使用该方法,后台任务完成后该栏不会消失。

【问题讨论】:

    标签: java multithreading javafx popup progress-bar


    【解决方案1】:

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

    @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();
    
        }
    

    【讨论】:

    • 它有效。谢谢。刚刚无法接受,因为我在几分钟前编辑了问题。
    猜你喜欢
    • 1970-01-01
    • 2015-08-28
    • 1970-01-01
    • 2018-12-12
    • 2017-03-28
    • 2016-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多