2017-10-08 7 views
1

Je voudrais créer une méthode générique pour créer une boîte de dialogue spécifique.Créer une méthode de dialogue générique avec Javafx

private void setDialog(String dialog,String title){ 
    try { 
     // Load the fxml file and create a new stage for the popup 
     FXMLLoader loader = new FXMLLoader(Main.class.getResource("/view/" + dialog + ".fxml")); 
     AnchorPane page = (AnchorPane) loader.load(); 
     Stage dialogStage = new Stage(); 
     dialogStage.setTitle(title); 
     dialogStage.initModality(Modality.WINDOW_MODAL); 
     dialogStage.initOwner(Main.getPs()); 
     Scene scene = new Scene(page); 
     dialogStage.setScene(scene); 


    loader.getController().setDialogStage(dialogStage); 

     // Show the dialog and wait until the user closes it 
     dialogStage.showAndWait(); 


     } catch (IOException e) { 
     // Exception gets thrown if the fxml file could not be loaded 
     e.printStackTrace(); 
     } 

} 

Mais je reçois une erreur dans cette ligne

loader.getController().setDialogStage(dialogStage) 

exactement l'erreur est ce

"The method setDialogStage(Stage) is undefined for the type Object" 

comment puis-je résoudre ce problème? Je vous remercie.

Je ne suis pas très expérimenté. qui dit que

Répondre

1

En supposant que vous avez une classe de contrôleur MyController qui définit une méthode setDialogStage(Stage), vous pouvez le faire

loader.<MyController>getController().setDialogStage(dialogStage); 

Ce n'est pas vraiment plus typé qu'un moulage simple; il échouera à l'exécution avec un ClassCastException si le contrôleur n'est pas le bon type.

Si vous avez plusieurs contrôleurs qui peuvent avoir cette méthode, la meilleure option est sans doute de les faire mettre en œuvre une interface qui définit la méthode appropriée:

public interface DialogController { 

    public void setDialogStage(Stage dialogStage); 

} 

Vos contrôleurs ressemblent

public class MyController implements DialogController { 

    // ... 

    @Override 
    public void setDialogStage(Stage dialogStage) { 
     // ... 
    } 

} 

et puis vous venez de traiter le contrôleur comme un général DialogController:

loader.<DialogController>getController().setDialogStage(dialogStage); 
1

Bien que vous ayez de bonnes raisons de créer votre propre mécanisme de dialogue, je tiens à souligner que JavaFX a déjà un standard way pour les dialogues.

Le site code.makery montre quelques exemples de la façon de créer des boîtes de dialogue:

Alert alert = new Alert(AlertType.CONFIRMATION); 
alert.setTitle("Confirmation Dialog"); 
alert.setHeaderText("Look, a Confirmation Dialog"); 
alert.setContentText("Are you ok with this?"); 

Optional<ButtonType> result = alert.showAndWait(); 
if (result.get() == ButtonType.OK){ 
    // ... user chose OK 
} else { 
    // ... user chose CANCEL or closed the dialog 
} 

Confirmation dialog

Vous pouvez également créer des dialogues avec un contenu personnalisé: Exception Dialog