Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX面纱屏幕_Java_Javafx_Javafx 8 - Fatal编程技术网

JavaFX面纱屏幕

JavaFX面纱屏幕,java,javafx,javafx-8,Java,Javafx,Javafx 8,当我尝试从JSON加载一些文件时,我想创建一个进度条,在屏幕上隐藏几秒钟。从JSON加载工作,进度条工作我唯一的问题是面纱 因此,我的应用程序正在运行,当我尝试加载JSON文件时,我尝试使用阶段进度条设置场景。到目前为止,一切都进展顺利(甚至新场景也显示了进度条)。当我看到进度条完成进度(100%)时,问题就出现了,它会显示空白,并且不会显示旧的应用程序场景。我如何解决这个问题 这是我在进度加载器中的代码: public Scene createContent() { fina

当我尝试从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();
}

我不知道你想要达到什么目的,也不知道你所说的“面纱”是什么意思,但你的问题肯定来自调用
stage.hide()
,而不在FX线程上。请查看该方法的文档,或在调用周围加上try块

try {
    stage.hide();
    } catch (Exception e) {
        e.printStackTrace();
    }
看看效果

使用
Platform.runLater
在FX线程上执行调用:

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

使用
task.setOnSucceeded(…)
任务完成时,您会收到通知,这样您就可以将旧视图设置到stage或其他内容中。

是的,在另一个线程上调用stage.hide()(或close),这就是问题所在。谢谢
Platform.runLater(()-> stage.hide());