我尝试了很多东西,但似乎无法找到答案 . 我是javafx的新手,所以你的帮助会很棒 . 我不知道为什么但是出于某种原因,当我点击子阶段中的验证或取消按钮时,父阶段也在关闭,尽管这样做只是为了关闭子阶段 . 主舞台的代码是:

public class MainClass extends Application {
    private Stage stagePrincipal;
    private BorderPane conteneurPrincipal;
    DAO<Personne> personneDao = new PersonneDAO(SdzConnection.getInstance());
    private ObservableList<Personne> listDePersonne; 

    public MainClass() {
        try {
            listDePersonne =   FXCollections.observableArrayList(personneDao.getPersonList());
        }catch(SQLException e)
        {
            e.printStackTrace();
        }

    }

    public ObservableList<Personne> getListDePersonne(){return listDePersonne;}

    @Override
    public void start(Stage primaryStage) {
        this.stagePrincipal = primaryStage;
        //Ca ne vous rappelle pas une JFrame ?
        this.stagePrincipal.setTitle("Application de gestion de personnes");

        //Nous allons utiliser nos fichier FXML dans ces deux méthodes
        initialisationConteneurPrincipal();
        initialisationContenu();
    }

    private void initialisationConteneurPrincipal() {
        //On créé un chargeur de FXML
        FXMLLoader loader = new FXMLLoader();
        //On lui spécifie le chemin relatif à notre classe
        //du fichier FXML a charger : dans le sous-dossier view
        loader.setLocation(MainClass.class.getResource("ConteneurPrincipal.fxml"));
        try {
            //Le chargement nous donne notre conteneur
            conteneurPrincipal = (BorderPane) loader.load();
            //On définit une scène principale avec notre conteneur
            Scene scene = new Scene(conteneurPrincipal);
            //Que nous affectons à notre Stage
            stagePrincipal.setScene(scene);

            //Initialisation de notre contrôleur
            PersonneMenuMapping controleur = loader.getController();
            //On spécifie la classe principale afin de pour récupérer le Stage
            //Et ainsi fermer l'application
            controleur.setMainApp(this);
            //Pour l'afficher
            stagePrincipal.show();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void initialisationContenu() {
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(MainClass.class.getResource("MyreportView.fxml"));
        try {
            //Nous récupérons notre conteneur qui contiendra les données
            //Pour rappel, c'est un AnchorPane...
            AnchorPane conteneurPersonne = (AnchorPane) loader.load();
            //Qui nous ajoutons à notre conteneur principal
            //Au centre, puisque'il s'agit d'un BorderPane
            conteneurPrincipal.setCenter(conteneurPersonne);
            //Nous récupérons notre mappeur via l'objet FXMLLoader
            PersonneMapping controleur = loader.getController();
            //Nous lui passons notre instance de classe
            //pour qu'il puisse récupérer notre liste observable
            controleur.setMainApp(this);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //Méthode qui va va afficher la popup d'édition
    //ou de création d'une personne et initialiser son contrôleur
    public void affichePersonneDialogue(Personne personne, String titre) {
        try {
            FXMLLoader loader = new FXMLLoader();
            loader.setLocation(MainClass.class.getResource("PersonneDialogue.fxml"));
            AnchorPane page = (AnchorPane) loader.load();

            // Création d'un nouveau Stage qui sera dépendant du Stage principal
            Stage stageDialogue = new Stage();
            stageDialogue.setTitle(titre);
            stageDialogue.initModality(Modality.WINDOW_MODAL);

            //Avec cette instruction, notre fenêtre modifiée sera modale
            //par rapport à notre stage principal
            stageDialogue.initOwner(stagePrincipal);
            Scene scene = new Scene(page);
            stageDialogue.setScene(scene);

            // initialisation du contrôleur
            PersonneDialogueMapping controller = loader.getController();
            //On passe la personne avec laquelle nous souhaitons travailler
            //une existante ou une nouvelle
            controller.setPersonne(personne);
            controller.setMainClass(this);

            String css = getClass().getResource("mycss.css").toExternalForm();
            scene.getStylesheets().addAll(css);

            // Show the dialog and wait until the user closes it
            stageDialogue.showAndWait();
            //return controller.isOkClicked();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    public Stage getStage() {
        return this.stagePrincipal;
    }

    public static void main(String[] args) {    
        launch(args);
    }
}

并且子阶段的代码是:

public class PersonneDialogueMapping {

    private Stage stageDialogue;
    @FXML
    private TextField nameTextValue;
    @FXML
    private TextField lastTextValue;
    @FXML
    private DatePicker dobpickerValue;
    @FXML
    private ComboBox<Sexe> comboValue;

    DAO<Personne> personneDao = new PersonneDAO(SdzConnection.getInstance());

    private MainClass main; 
    private Personne personne;

    public void setMainClass(MainClass m) {
        main = m;
        stageDialogue = main.getStage();
    }

    //On initialise ici les valeurs de la liste déroulante
    //avant de sélectionner la valeur de la personne
    public void initialize() {
        comboValue.getItems().setAll(Sexe.values());
    }

    //Afin de récupérer le stage de la popup
    //et pouvoir la clore
    public void setStage(Stage s) {stageDialogue = s;}

    public void setPersonne(Personne p) {
        personne = p;
        nameTextValue.setText(personne.getNom());
        lastTextValue.setText(personne.getPrenom());
        dobpickerValue.setValue(personne.getDateDeNaissance());
        comboValue.getSelectionModel().select(personne.getSexe());
    }

    //Méthode de contrôle de la validité des données saisies
    private boolean controlerFormulaire() {
        boolean isOk = true;
        List<String> messageErreur = new ArrayList<>();
        if (nameTextValue.getText() == null || nameTextValue.getText().isEmpty()) {
            isOk = false;
            messageErreur.add("Le champ \"Nom\" est obligatoire");
        }
        if (lastTextValue.getText() == null || lastTextValue.getText().isEmpty()) {
            isOk = false;
            messageErreur.add("Le champ \"Prénom\" est obligatoire");
        }   
        if (dobpickerValue.getValue() == null || dobpickerValue.getValue().toString().isEmpty()) {
            isOk = false;
            messageErreur.add("Le champ \"Date\" est obligatoire");
        }

        if(!isOk) {
            Alert erreur = new Alert(AlertType.ERROR);
            erreur.setTitle("Erreur ! ");
            StringBuilder sb = new StringBuilder();
            messageErreur.stream().forEach((x) -> sb.append("\n" + x));
            erreur.setHeaderText(sb.toString());
            erreur.showAndWait();
        }       
        return isOk;
    }

    @FXML
    public void annuler() {
        //On ferme la boîte de dialogue
        stageDialogue.close();
    }

    //sauvegarde de la personne, que ce soit une édition ou une création
    public void sauvegarder() {
        if(controlerFormulaire()) {
            String name = nameTextValue.getText();
            personne.setNom(name);

            String last = lastTextValue.getText();
            personne.setPrenom(last);

            //Afin de pouvoir gérer la modification de date à la souris
            //ou en modifiant le texte du composant directement
            //On récupère la date au format texte pour la réinjecter 
            //dans le composant
            dobpickerValue.setValue(
                    dobpickerValue  .getConverter()
                                    .fromString(
                                            //Date du composant au format texte
                                            dobpickerValue.getEditor().getText()
                                    )
                                );
            LocalDate dob = dobpickerValue.getValue();
            personne.setDateDeNaissance(dob);

            Sexe sex = comboValue.getValue();
            personne.setSexe(sex);

            //S'il s'agit d'une création, on ajoute la personne dans le tableau
            if(stageDialogue.getTitle().startsWith("Création")) {
                main.getListDePersonne().add(personne);
                personneDao.create(personne);
            }

        }
    }
}