2016-05-27 9 views
0

私は2つのコントローラを持っています。一方のコントローラは主な機能のほとんどを管理し、もう一方のコントローラはメインコントローラからアクセスされる単純なポップアッププロンプトを制御します。JavaFXコントローラ間で正しいデータを返す

これは迅速にアクセスするために使用されるメインコントローラに保存されている機能です。

public void deletePrompt(){ 
    DeletePromptController controller = new DeletePromptController(); 
    boolean result = controller.showPrompt("/MainWindow//DeletePrompt.fxml"); 
    if(result){ 
     System.out.println("Deleted"); 
    }else{ 
     System.out.println("Canceled"); 
    } 
} 

これは、プロンプトコントローラ

public class DeletePromptController extends ShowWindow { 
    public Label question; 
    public Button delete, cancel; 
    private boolean result = true; 

    boolean showPrompt(String path){ 
     showWindow(path); 
     return result; 
    } 

    public void delete(){ 
     System.out.println("D"); 
     result = true; 
     Stage stage = (Stage) delete.getScene().getWindow(); 
     stage.close(); 
    } 

    public void cancel(){ 
     System.out.println("C"); 
     result = false; 
     Stage stage = (Stage) cancel.getScene().getWindow(); 
     stage.close(); 
    } 
} 

であり、これは、削除プロンプトFXMLファイルをロードし、表示するために使用されるブロックです。

public class ShowWindow { 
    public void showWindow(String path){ 
     try { 
      FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource(path)); 
      Parent root = fxmlLoader.load(); 
      Stage stage = new Stage(); 
      stage.initModality(Modality.APPLICATION_MODAL); 
      stage.setScene(new Scene(root)); 
      stage.showAndWait(); 
     }catch(IOException ex){ 
      ex.printStackTrace(); 
     } 
    } 
} 

1つのこと以外はすべて動作しています。プロンプトコントローラから結果を取得するときのメインコントローラは、正しいブール値を取得していません。

D 
Canceled 

出力のキャンセルが押されたときに:

C 
Canceled 

Dを削除することによって従うべき押される削除

出力。

何かが役に立ちます。 fx:controller属性はFXMLに設けられているので

答えて

1

FXMLLoaderは、新しいコントローラのインスタンスを作成します。

public void showWindow(String path){ 
    try { 
     FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource(path)); 
     fxmlLoader.setController(this); 
     Parent root = fxmlLoader.load(); 

または

  • により作成コントローラを取得します:コントローラ自身をFXMLからfx:controller属性を削除し、指定

    1. あなたは基本的に2つのオプションを持っていますthe FXMLLoader

      public static <T> T showWindow(String path){ 
          try { 
           FXMLLoader fxmlLoader = new FXMLLoader(ShowWindow.class.getResource(path)); 
           Parent root = fxmlLoader.load(); 
           Stage stage = new Stage(); 
           stage.initModality(Modality.APPLICATION_MODAL); 
           stage.setScene(new Scene(root)); 
           stage.showAndWait(); 
           return fxmlLoader.getController(); 
          }catch(IOException ex){ 
           ex.printStackTrace(); 
          } 
          return null; 
      } 
      
      boolean showPrompt(String path) { 
          return ShowWindow.<DeletePromptController>showWindow(path).result; 
      } 
      
  • +0

    @Leon:おっと。もちろん、静的メソッドで変更する必要があります。今修正する必要があります... – fabian

    関連する問題