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