带有fxml的JavaFX和ProgressIndicator

带有fxml的JavaFX和ProgressIndicator,java,javafx,Java,Javafx,我从早上就在想如何解决这个问题。我有登录申请。当用户等待登录时,我希望使用processindicator。我使用了第二个线程,但它不工作 主加载器fxml 主控制器 @FXML public StackPane MainStackPane; public void initialize(URL arg0, ResourceBundle arg1) { FXMLLoader loader = new FXMLLoader(this.getClass().getResource

我从早上就在想如何解决这个问题。我有登录申请。当用户等待登录时,我希望使用processindicator。我使用了第二个线程,但它不工作

主加载器fxml

主控制器

@FXML public StackPane MainStackPane;

    public void initialize(URL arg0, ResourceBundle arg1) {

    FXMLLoader loader = new FXMLLoader(this.getClass().getResource("/LoginForm/Login.fxml"));
    Pane pane = null;

    try {
        pane = loader.load();
    } catch (IOException e) {System.out.println(e.getMessage());}

    LoginController login = loader.getController();
    login.setMainController(this);

    setScreen(pane, true);
}

public void setScreen(Pane pane, boolean clean){

    MainStackPane.getChildren().addAll(pane);
    }
登录信息:

private MainController mainController;
private void Zaloguj() throws IOException {
    String cryptUser = null, cryptPass = null;

    Test test = new Test(this.mainController);
    test.start();

    try {
        Thread.sleep(5000);
    } catch (InterruptedException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

    LoginSQL sql = new LoginSQL();`
    Byte LoginResult = sql.SQLselect(cryptUser, cryptPass);

    ...}
课堂测试

public class test extends Service<Void>{

private MainController mainController;

public test(MainController mainController) {
    this.mainController = mainController;
}

protected Task<Void> createTask() {
    return new Task<Void>() {
        @Override
        protected Void call() throws Exception {
            System.out.println("Service: START");

            ProgressIndicator p = new ProgressIndicator(); 

                     Platform.runLater(new Runnable() {
                         @Override public void run() {

                    mainController.MainStackPane.getChildren().addAll(p);
                     }});

                if (isCancelled()) {
                    mainController.MainStackPane.getChildren().remove(p);
                }
                return null;
            };};}}  

ProgressIndicator仅在登录后的下一个窗口中显示。如何做?

JavaFX渲染仅在主线程中进行。如果添加ProgressIndicator,然后使用Thread.sleep,JavaFX在Thread.sleep完成之前不会呈现该指示器。此外,如果登录请求挂起,JavaFX还将等待登录请求完成后再呈现


你要做的是确保永远不要中断/挂起主线程。删除Thread.sleep,并将登录请求移动到子线程。请求完成后,通知主线程,以便它可以删除ProgressIndicator。

非常感谢您的建议。我将登录名移动到一个新线程,并删除了睡眠。这是一个问题,因为线程是在方法Zaloguj中执行整个代码之后启动的。在正确登录后,我应该将加载窗口的代码放在哪里?确定,完成了!:在方法Zaloguj中:.runningProperty.addListenerevent->{FXMLLoader。。。。