代码之家  ›  专栏  ›  技术社区  ›  charles Lgn

JavaFX:在splashScreen中使用不确定的Progressbar

  •  0
  • charles Lgn  · 技术社区  · 6 年前

    我有一个启动屏幕:

    splash screen 我需要有动画的进度条(不确定),但它不工作。

    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;
        }
      }
    }
    
    1 回复  |  直到 6 年前
        1
  •  5
  •   fabian    6 年前

    代码中有两个问题:

    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;
        }
    }
    

    即使您在单独的线程上执行此任务 Runnable Platfrom.runLater 在JavaFX应用程序线程上执行,并从此可运行线程执行长时间运行的操作将冻结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;
        }
    }
    

    请注意,由于您没有使用 ,您可以简单地实现 使用类而不是从 任务 .