任务完成后,JavaFX会隐藏进度条

时间:2014-07-04 12:23:41

标签: progress-bar task javafx-8

我正在编写一个程序来从网址流式传输视频,并添加一个不确定的进度条来显示视频加载。加载视频将写入任务内,并且任务完成后应隐藏进度条。视频加载没有任何错误,但我的问题是进度条永远不会出现!

这是我的 SSCCE

package application;

import javafx.application.Application;
import javafx.concurrent.Task;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.ProgressBar;
import javafx.scene.control.ProgressIndicator;
import javafx.scene.layout.AnchorPane;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.scene.media.MediaView;
import javafx.stage.Popup;
import javafx.stage.Stage;


public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {
        try {
            AnchorPane root = new AnchorPane();
            MediaView mediaView = new MediaView();

            Task task = new Task<Media>() {
                @Override
                protected Media call()throws Exception {

                    System.out.println("Loading...");
                    Media media = new Media("http://download.blender.org/peach/bigbuckbunny_movies/BigBuckBunny_320x180.mp4");
                    return media;
                }

            };

            ProgressBar progressBar = new ProgressBar();
            progressBar.setProgress(ProgressIndicator.INDETERMINATE_PROGRESS);
            progressBar.progressProperty().bind(task.progressProperty());

            Popup newPopup = new Popup();
            newPopup.getContent().add(progressBar);

            task.setOnSucceeded(new EventHandler<Event>() {

                @Override
                public void handle(Event event) {
                    newPopup.hide();
                    MediaPlayer mediaplayer = new MediaPlayer((Media)task.getValue());
                    mediaView.setMediaPlayer(mediaplayer);
                    mediaplayer.setAutoPlay(true);

                }
            });

            root.getChildren().add(mediaView);

            Scene scene = new Scene(root,640,480);

            primaryStage.setScene(scene);
            primaryStage.show();
            newPopup.show(primaryStage);
            new Thread(task).start();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

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

1 个答案:

答案 0 :(得分:3)

您的任务会在媒体加载时立即返回。您希望在媒体播放器准备就绪时隐藏弹出窗口。

        task.setOnSucceeded(new EventHandler<Event>() {

            @Override
            public void handle(Event event) {
                //newPopup.hide();
                MediaPlayer mediaplayer = new MediaPlayer((Media)task.getValue());
                mediaView.setMediaPlayer(mediaplayer);
                mediaplayer.setAutoPlay(true);
                mediaplayer.statusProperty().addListener((obs,ov,nv) -> {
                    if(nv == MediaPlayer.Status.READY)
                        newPopup.hide();
                });
            }
        });

我无法让您的链接正常工作,但是从本地文件中我可以看到几毫秒的弹出窗口。