java - 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);
}
}
}
}
解决方案
推荐阅读
- django - 索引 ListView 对象
- java - 使用select new时如何返回列表dto
- python-3.x - 将函数应用于数据帧的每个单元格
- java - 如何在 Java 中的单个服务中调用多个 URL?
- javascript - 如何在 vue.js 中按字母和数字对表格进行排序?
- azure - .Net Core Web 应用程序有时会停止正常工作,直到重新部署
- apache-spark - Get last day of previous month without using a udf
- python - 使用 Python 剪切路径图像
- java - 使用泛型和 rxjava 的不兼容类型
- groovy - 在 groovy 中仅接收最后一个目录名称