我尝试了很多事情,但似乎找不到答案。我是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);
}
}
}
}