我是java编程的新手,我遇到了一个问题,我遇到了问题。
我目前使用的代码(有效)正在加载进度条...但我希望加载窗口在进度条完成时关闭[与独立程序类似的效果]
我的舞台名称叫做welcome 进度条称为加载
这是我的代码:
final SimpleDoubleProperty prop = new SimpleDoubleProperty(0);
load.progressProperty().bind(prop);
load.prefWidthProperty().bind(start.widthProperty());
new Thread(){
@Override
public void run(){
try {
for(double i=0; i<=1; i+=0.01){
prop.set(i);
Thread.sleep(100);
}
} catch (InterruptedException ex) {
System.err.println("Error on Thread Sleep");
}
}
}开始();
我尝试在代码块的许多区域中包含for循环块和try-catch块之后的welcome.hide()或welcome.close()。
任何帮助将不胜感激
谢谢!
答案 0 :(得分:0)
一个快速解决方案是使用Platform.runLater
:
方式1(不推荐):
new Thread(){
@Override
public void run(){
try {
for(double i=0; i<=1; i+=0.01){
Platform.runLater( ()-> prop.set(i) );
Thread.sleep(100);
}
Platform.runLater( ()-> window.close() );
} catch (InterruptedException ex) {
System.err.println("Error on Thread Sleep");
}
}
为什么会这样?
因为您正在从外部线程和JavaFX修改SceneGraph 不允许这样做。
方式2)在JavaFX中正确的方式
我能做到的最好方法是什么?
最好的方法是使用Service
+ Task
(+),这样就可以绑定ProgressBar
progressProperty
Service
} progressProperty
。只要Service
结束或达到您想要的进度,您就可以关闭Stage
。这里的选择是无限的,这是在JavaFX
中执行此操作的正确方法。
此外,您必须使用
Platform.runLater
修改SceneGraph
Service
的示例骨架:
public class CustomService extends Service<Void> {
public CustomService(){
}
@Override
public void start(){
super.start();
//your code..
}
@Override
public void stop(){
super.stop();
//your code...
}
@Override
protected Task<Void> createTask() {
return new Task<Void>() {
@Override
protected Void call() throws Exception {
}
return null;
}
}
}