[英]JavaFX : Use an Indeterminate Progressbar in a splashScreen
我有一個啟動畫面:
可能是由於我的線程在initilize方法中運行。
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();
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
Platfrom.runLater
在JavaFX應用程序線程上執行,並且從該Runnable
執行長時間運行的操作會凍結GUI。
而是在后台線程上執行所有長時間運行的操作,並且僅使用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
繼承。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.