Hello bonjour à tous,
et un bonjour particulier à Bouye toujours là pour nous aider avec nos soucis de grands débutant !!
bon j'ai plutot pas mal avancé sur mon nouveau projet. en gros c'est un gestionnaire de base de donnée SQLite avec une interface FXML.
j'ai une base de donnée super simple avec des artistes avec lesquels je travaille dans la vraie vie, et dans cette base de donnée les champs renseignés sont le NOM, l'adresse du SITE INTERNET, le EMAIL, et les SAISONS sur lesquels nous avons travaillés avec eux ( hiver 2019, été 2018, etc....)
le but de ce petit desktop programme, c'est de gérer ma base d'artiste, de les ajouter ou de les supprimer des saisons, puis in fine a la fin d'exporter ces infos par mail ou pdf à des fins de communication dans mon entreprise !!
a ma grande surprise, j'ai quasimment réussi à remplir toute ces fonctionnalitées ! bon mon interface est très moche mais ca je vais le traiter après quand tout fonctionnera.
et aujourd'hui, j'en suis au stade du DEBUG, je régle toutes les petites anomalies de fonctionnement.
PAr exemple, j'aimerais déclencher une action à la fermeture d'un stage associée à un FXML controller. tout simplement, je souhaiterais que lorsque je clique la petite croix de mon interface window, la petite croix rouge, et bien j'aimerais déclencher une action.
le problème, c'est que je ne parviens pas à mettre la main sur le STage, car il a été crée à partir du Main de mon application principale.
mais un code vaut mieux que de longs discours, ok, voici donc mon main :
dans ce main qui se nomme App.java, on voit bien qu'il existe une méthode qui se nomme setRoot, et dont je me sers pour apeller par exemple le fichier "primary.fxml" qui a pour controlleur le fichier "PrimaryController.java"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 package com.politi.bibliotheque.bibli; import java.io.IOException; import java.sql.SQLException; import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.stage.Stage; /** * JavaFX App */ public class App extends Application { @Override public void start(Stage stage) throws IOException, SQLException { setRoot("primary",800,500); } static void setRoot(String fxml, int x, int y) throws IOException { Scene scene2 = new Scene(loadFXML(fxml),x,y); Stage stage2 = new Stage(); stage2.setScene(scene2); stage2.setResizable(false); stage2.show(); } private static Parent loadFXML(String fxml) throws IOException { FXMLLoader fxmlLoader = new FXMLLoader(App.class.getResource(fxml + ".fxml")); return fxmlLoader.load(); } public static void main(String[] args) { launch(); } }
pour ne pas surcharger ma question , disons que à partir de "PrimaryController.java", je vais à nouveau invoquer la méthode App.SetRoot pour charger un fichier "addArtist.fxml" qui a pour controlleur le fichier "SecondaryController.java"
voici le code du controlleur ""SecondaryController.java" :
ici , on voit bien que lorsque je valide l'ajout d'un nouvel artiste dans ma base de donnée en cliquant sur un bouton qui va apeller la méthode insertArtistToDatabase, et bien on voit qu'après avoir inscrit cette artiste dans ma BD, je repasse sur ma main window en chargeant a nouveau mon"primary.fxml", et j'en profite pour fermer ma fenetre courante en me servant de Stage stage = (Stage) btnAddArtist.getScene().getWindow(); pour choper mon stage
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73 package com.politi.bibliotheque.bibli; import java.io.IOException; import java.net.URL; import java.sql.Connection; import java.sql.SQLException; import java.util.ResourceBundle; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.control.Button; import javafx.scene.control.TextField; import javafx.stage.Stage; public class SecondaryController implements Initializable { @FXML private TextField textFieldAddName; @FXML private TextField textFieldAddUrl; @FXML private TextField textFieldAddEmail; @FXML private Button btnAddArtist; private DbConnection dc; @FXML public void insertArtistToDatabase(ActionEvent e) { //récupération des infos dans les champs de saisie de texte String NameArtist = textFieldAddName.getText(); String UrlArtist = textFieldAddUrl.getText(); String EmailArtist = textFieldAddEmail.getText(); //ouverture de la conection avec la base de donnée dc = new DbConnection(); Connection connAddArtist = dc.connect(); // insertion nouvel artiste try { System.out.println(NameArtist); int rv = connAddArtist.createStatement() .executeUpdate("INSERT INTO artistes ( artistName, artistUrl, artistEmail ) VALUES ( '" + NameArtist + "','" + UrlArtist + "','"+EmailArtist+"' )"); } catch (SQLException e2) { e2.printStackTrace(); } try { App.setRoot("primary",800,500); } catch (IOException e1) { e1.printStackTrace(); } //fermeture de la secondary window = fenetre actuelle Stage stage = (Stage) btnAddArtist.getScene().getWindow(); stage.close(); } @Override public void initialize(URL location, ResourceBundle resources) { } }
ca, ca marche bien....c'est peut être bizzarre, c'est sans doute pas très élégant comme code mais je suis débutant
par contre, il m'est impossible dans ce Secondarycontroller de choper mon stage au niveau de Initialize , en profitant d'un node comme j'ai pu le faire avec : Stage stage = (Stage) btnAddArtist.getScene().getWindow();
car au moment de initialize, les nodes ne sont pas encore crées, les boutons n'existent pas par exemple, et donc je ne peux pas remonter jusqu'au stage principal...
mince...
Partager