2017-11-08 11 views
0

私はこの問題を解決する方法を朝から思います。私はログインアプリケーションを持っています。ユーザーがログインを待っているときに私はprocessindicatorを使いたい。私は2番目のスレッドを使用するが、それは fxmlのJavaFXとProgressIndicator

メインローダ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); 
    } 

LoginForm

を動作しません:

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

    ...} 

クラスTest

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

ProgressIndic atorはログイン後に次のウィンドウにのみ表示されます。どうやってするの ?

答えて

1

JavaFXレンダリングはメインスレッドのみで行われます。 ProgressIndicatorを追加してからThread.sleep()を使用すると、JavaFXはThread.sleep()が完了するまでインジケータをレンダリングしません。また、ログイン要求がハングアップすると、JavaFXはレンダリング前にログイン要求が完了するまで待機します。

あなたがしなければならないことは、決してメインスレッドを中断/ハングしないようにすることです。 Thread.sleepを削除し、ログインリクエストを子スレッドに移動します。要求が完了したら、ProgressIndicatorを削除できるようにメインスレッドに通知します。

+0

ご提案いただきありがとうございます。私は新しいスレッドにログインを移動し、私はスリープを削除します。これは、コードがメソッド "Zaloguj"で実行された後にスレッドが開始されるため、問題です。正しいログイン後にウィンドウをロードするコードはどこに置くのですか? – Light

+0

ok完了!メソッドの中の : .runningProperty()。addListener(イベント - > { FXMLLoader ....) – Light

関連する問題