簡體   English   中英

JavaFX:在啟動畫面中使用不確定的進度欄

[英]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.runLaterRunnable 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM