首页 > 解决方案 > javafx child Stage is closing parent stage

问题描述

I tried many things but I can't seem to find an answer. I am new to javafx so your help will be great. I don't know why but for a reason when I click on validate or cancel button in the child Stage, the parent stage is also closing although doing such is only suppose to close the child stage. The code for the main stage is :

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

and the code for the child stage is :

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

        }
    }
}

标签: javajavafx

解决方案


推荐阅读