2017-05-10 21 views
0

外部スレッド(主スレッドからではありません)からjavafxで新しいウィンドウ(ステージ)を開きたいとします。私のコードはうまくいきません、助けてください。Javafxの外部スレッドから新しいウィンドウを開く

これは私のJavaコードです:

public void login(ActionEvent event) 
{  
    Task task = new javafx.concurrent.Task<Void>() 
    { 
      @Override 
      protected Void call() throws Exception 
      { 
       loader.setVisible(true); 
       if(Compte.login(username.getText(), password.getText())) 
       { 
        Parent root = FXMLLoader.load(getClass().getResource("/views/PrincipalFram.fxml")); 
        Scene scene = new Scene(root); 
        Stage stage = new Stage(); 
        stage.setScene(scene); 
        stage.setTitle("My Title"); 
        stage.show(); 
       } 
       else 
       { 
        //TODO 
       } 
       return null; 
      } 

      @Override 
      protected void succeeded() 
      { 
       loader.setVisible(false); 
      } 

      @Override 
      protected void failed() 
      { 
       loader.setVisible(false); 
      } 
    }; 
    Thread thread = new Thread(task); 
    thread.setDaemon(true); 
    thread.start(); 
} 
+0

なぜあなたはここでバックグラウンドスレッドを使用していますか?実行するには時間がかかります。 JavaFX [here](http://stackoverflow.com/questions/30249493/using-threads-to-make-database-requests)のマルチスレッドに関する一般的なコメントが役立つかどうかを確認してください。 –

+0

私はサーバー上の私のデータベースに要求を送るログインボタンを持っています。スレッド内で実行する方がよいでしょう。 –

+0

OKですが、* only *はバックグラウンドスレッド内で行う必要があります。 UI作業は、FXアプリケーションスレッドで行う必要があります。 –

答えて

0

は、バックグラウンドスレッドでのみ時間のかかる作業を実行します。すべてのUI作業はFXアプリケーションスレッドで行う必要があります。 (。documentation for Stageは、明示的に「ステージのオブジェクトはFXのアプリケーションスレッド上に構築し、修正しなければならない」と述べている)だから、実行する必要があります。

public void login(ActionEvent event) { 

    Task<Boolean> loginTask = new Task<Boolean>() { 
     @Override 
     protected Boolean call() throws Exception { 
      return Compte.login(username.getText(), password.getText()); 
     } 
    }; 

    loginTask.setOnSucceeded(e -> { 

     if (loginTask.getValue()) { 
      Parent root = FXMLLoader.load(getClass().getResource("/views/PrincipalFram.fxml")); 
      Scene scene = new Scene(root); 
      Stage stage = new Stage(); 
      stage.setScene(scene); 
      stage.setTitle("My Title"); 
      stage.show(); 
     } else { 
      //TODO 
     } 
     loader.setVisible(false); 
    }); 

    loginTask.setOnFailed(e -> { 
     loader.setVisible(false); 
    }); 

    Thread thread = new Thread(task); 
    thread.setDaemon(true); 
    loader.setVisible(true); 
    thread.start(); 
} 
+0

ありがとう、それはperferctly –

関連する問題