JavaFX面纱屏幕

时间:2014-03-22 16:27:37

标签: java javafx javafx-8

当我尝试从JSON加载一些文件时,我想创建一个进度条,将屏幕遮住几秒钟。从JSON加载,进度条工作唯一的问题是面纱。

所以,我的应用程序正在运行,当我尝试加载JSON文件时,我尝试使用舞台的进度条设置场景。到目前为止所有的事情都很顺利(即使是新的场景显示了进度条)。问题来自我进度条完成进度(100%)它显示空白...并且没有向我显示旧的应用程序场景。我该如何解决这个问题?

这是我在进度加载器中的代码:

    public Scene createContent() {

    final StackPane g = new StackPane();
    Region veil = new Region();
    veil.setStyle("-fx-background-color: rgba(0, 0, 0, 0.4)");
    veil.setOpacity(0.8);
    final ProgressIndicator p1 = new ProgressIndicator();
    p1.setPrefSize(100, 100);  
    p1.setMaxSize(150, 150);


    p1.progressProperty().addListener(new ChangeListener<Number>() {

        @Override

        public void changed(ObservableValue ov, Number oldVal, Number newVal) {

            if (p1.getProgress() < 0.25) {
                p1.setStyle("-fx-progress-color: red;");
            } else if (p1.getProgress() < 0.5) {
                p1.setStyle("-fx-progress-color: orange;");
            } else {
                p1.setStyle("-fx-progress-color: green;");
            }

        }

    });
 // animate the styled ProgressIndicator

    timeline.setCycleCount(Timeline.INDEFINITE);
    timeline.setAutoReverse(true);

    final KeyValue kv = new KeyValue(p1.progressProperty(), 1);
    final KeyFrame kf1 = new KeyFrame(Duration.millis(3000), kv);
    timeline.getKeyFrames().add(kf1);


    g.getChildren().addAll(veil,p1);
    g.setAlignment(Pos.CENTER);
    Task task = new Task() {

        @Override
        protected Object call() throws Exception {
            for (int i = 0; i < 500; i++) {
                updateProgress(i, 500);
                Thread.sleep(5);
            }
            stage.hide();
            return null;
        }

    };
    p1.progressProperty().bind(task.progressProperty());
    veil.visibleProperty().bind(task.runningProperty());
    p1.visibleProperty().bind(task.runningProperty());
    new Thread(task).start();
    Scene scene = new  Scene(g, 200, 200);
    return scene;
}

public void play() {
    timeline.play();
}


public void stop() {
    timeline.stop();
}

public void start(Stage stage) {
    this.stage=stage;
    this.stage.setScene(createContent());   
    this.stage.show();
}

这是在JSON加载器类中:

ProgressLoader pl=new ProgressLoader();         
pl.start(VisualAppFactory.getStage());

1 个答案:

答案 0 :(得分:1)

我不知道你想要实现什么,以及“面纱”是什么意思,但你的问题肯定来自调用 stage.hide()没有开启FX-Thread 。查看方法的文档或使用try块

包围调用
try {
    stage.hide();
    } catch (Exception e) {
        e.printStackTrace();
    }

看效果。

使用Platform.runLater在FX-Thread上执行调用:

Platform.runLater(()-> stage.hide());

使用task.setOnSucceeded(...),您会在任务完成时收到通知,以便将旧视图设置为舞台或其他内容。