В вашем коде 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;
}
}
Даже если вы выполняете эту задачу в отдельном потоке, Runnable
, переданный Platfrom.runLater
, выполняется в потоке приложения 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
, вы можете просто реализовать Runnable
с вашим классом вместо наследования от Task
.