JavaFX:在启动画面中使用不确定的进度条
JavaFX : Use an Indeterminate Progressbar in a splashScreen
我有启动画面:
我需要进度条的动画(不确定),但它不起作用。
这可能是因为我的线程在我的初始化方法中是 运行。
public class splashscreenController implements Initializable {
@Override
public void initialize(URL location, ResourceBundle resources) {
new SplashScreen().run();
}
class SplashScreen extends Task {
@Override
public Object call() {
Platform.runLater(new Runnable() {
@Override
public void run()
Parent root = null;
try {
Thread.sleep(3000);
root = FXMLLoader.load(getClass().getResource("../gui/NewUI.fxml"));
} catch (InterruptedException | IOException e) {
e.printStackTrace();
}
Stage stage = new Stage();
stage.initStyle(StageStyle.UNDECORATED);
assert root != null;
Scene scene = new Scene(root, 1280, 720);
stage.setScene(scene);
stage.show();
MainJavaFx.setPrimaryStage(stage);
((Stage) panParent.getScene().getWindow()).close();
}
});
return null;
}
}
}
您的代码中有 2 个问题:
new SplashScreen().run();
A Task
不在新线程上为 运行 提供功能。 run
在调用线程上执行。
class SplashScreen extends Task {
@Override
public Object call() {
Platform.runLater(new Runnable() {
@Override
public void run() {
// placeholder for parts of your code
longRunningOperation();
guiUpdate();
}
});
return null;
}
}
即使您在单独的线程上执行此任务,传递给 Platfrom.runLater
的 Runnable
也会在 JavaFX 应用程序线程上执行,并且从此可运行对象执行长时间 运行 操作会冻结图形用户界面。
改为在后台线程上执行所有长 运行 操作,并且仅使用 Platfrom.runLater
.
执行短更新
new Thread(new SplashScreen()).start();
class SplashScreen extends Task {
@Override
public Object call() throws IOException, InterruptedException {
Thread.sleep(3000);
final Parent root = FXMLLoader.load(getClass().getResource("../gui/NewUI.fxml"));
Platform.runLater(new Runnable() {
@Override
public void run() {
Stage stage = new Stage();
stage.initStyle(StageStyle.UNDECORATED);
Scene scene = new Scene(root, 1280, 720);
stage.setScene(scene);
stage.show();
MainJavaFx.setPrimaryStage(stage);
((Stage) panParent.getScene().getWindow()).close();
}
});
return null;
}
}
请注意,由于您没有使用 Task
提供的功能,您可以简单地使用 class 实现 Runnable
,而不是从 Task
继承。
我有启动画面:
这可能是因为我的线程在我的初始化方法中是 运行。
public class splashscreenController implements Initializable {
@Override
public void initialize(URL location, ResourceBundle resources) {
new SplashScreen().run();
}
class SplashScreen extends Task {
@Override
public Object call() {
Platform.runLater(new Runnable() {
@Override
public void run()
Parent root = null;
try {
Thread.sleep(3000);
root = FXMLLoader.load(getClass().getResource("../gui/NewUI.fxml"));
} catch (InterruptedException | IOException e) {
e.printStackTrace();
}
Stage stage = new Stage();
stage.initStyle(StageStyle.UNDECORATED);
assert root != null;
Scene scene = new Scene(root, 1280, 720);
stage.setScene(scene);
stage.show();
MainJavaFx.setPrimaryStage(stage);
((Stage) panParent.getScene().getWindow()).close();
}
});
return null;
}
}
}
您的代码中有 2 个问题:
new SplashScreen().run();
A Task
不在新线程上为 运行 提供功能。 run
在调用线程上执行。
class SplashScreen extends Task {
@Override
public Object call() {
Platform.runLater(new Runnable() {
@Override
public void run() {
// placeholder for parts of your code
longRunningOperation();
guiUpdate();
}
});
return null;
}
}
即使您在单独的线程上执行此任务,传递给 Platfrom.runLater
的 Runnable
也会在 JavaFX 应用程序线程上执行,并且从此可运行对象执行长时间 运行 操作会冻结图形用户界面。
改为在后台线程上执行所有长 运行 操作,并且仅使用 Platfrom.runLater
.
new Thread(new SplashScreen()).start();
class SplashScreen extends Task {
@Override
public Object call() throws IOException, InterruptedException {
Thread.sleep(3000);
final Parent root = FXMLLoader.load(getClass().getResource("../gui/NewUI.fxml"));
Platform.runLater(new Runnable() {
@Override
public void run() {
Stage stage = new Stage();
stage.initStyle(StageStyle.UNDECORATED);
Scene scene = new Scene(root, 1280, 720);
stage.setScene(scene);
stage.show();
MainJavaFx.setPrimaryStage(stage);
((Stage) panParent.getScene().getWindow()).close();
}
});
return null;
}
}
请注意,由于您没有使用 Task
提供的功能,您可以简单地使用 class 实现 Runnable
,而不是从 Task
继承。