Bonjour la communauté,

Je vais vous exposer mon problème.

Sur un projet perso, je possède 1 classe java qui me sert de vue; un controller qui y est associé; et 1 classe de type 'launcher' qui me permet d'ouvrir la vue via un clic sur bouton.

J'utilise comme SGBD Postgre SQL et son dernier dernier driver à jour.

Mon problème :

Lorsque je lance ma nouvelle vue via mon launcher avec un myView view = new myView(), j'arrive sur l'interface de ma deuxième vue; jusque-là, aucun soucis.

Lorsque j'intéragi avec cette vue, par exemple que je créé un nouveau fichier .xml, que je parse ses infos et que je les rentre en base, tout marche bien encore. Ca ce complique quand je veux refaire la même manipulation, ou toute autre manipulation pour écrire en base de données. En effet, mon action est réalisée 2 fois. Puis si je refais une manip d'écriture en base, ça bouclera 3 fois. Et ainsi de suite. Voici un résultat :
Nom : image.png
Affichages : 145
Taille : 28,3 Ko

Dans mon controller, certaines requêtes sont en prepared statement, d'autre non. Mais peu importe, le soucis continue que je mette l'un ou l'autre.

J'ai une classe BD_Access qui me retourne une connexion. Avec un systemoutprint(), je me rend compte que lors de l'appel de cette classe, le sysoutprint passe bel et bien une seule fois, donc je pense que je peux exclure le BD_Access de ce soucis.

Voici un bout de mon controller :

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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
public class ControllerAdmin extends Component implements ActionListener {
 
    private Vue_administrateur vue_admin;
    private Reservation vue_resa;
 
    public ControllerAdmin(Vue_administrateur vue_admin) {
        this.vue_admin = vue_admin;
    }
 
    public ControllerAdmin(Reservation vue_resa) {
        this.vue_resa = vue_resa;
    }
 
    /**
     * @param event administrateur controller
     *              différents events quand on avance de page en page lors de la création d'un film, d'une salle ou de l'affichage de la iste des users inscrits
     */
    public void actionPerformed(ActionEvent event) {
        Object source = event.getSource();
        // Controller pour la création d'une salle en XML
        if (source == vue_admin.ajout_salle) {
            String salle = vue_admin.salle.getText();
            Integer row = (Integer) vue_admin.row.getValue();
            Integer col = (Integer) vue_admin.col.getValue();
            Integer handi = (Integer) vue_admin.handi.getValue();
            Integer totalPlaces;
            // calcul nb total de places
            totalPlaces = row * col;
            try {
                int i;
                i = Integer.decode(salle);
            } catch (NumberFormatException e) {
 
                JOptionPane.showMessageDialog(this, "Le numéro de salle doit être un chiffre compris entre 1 et 3", "Attention", JOptionPane.INFORMATION_MESSAGE);
            }
            // On caste le jtextfield en integer pour vérifier SI ce n'est pas compris entre 1 et 3, SINON on exécute le parse xml
            int salleInt = Integer.parseInt(salle);
 
            if (salleInt > 3) {
                JOptionPane.showMessageDialog(this, "Il n'y a que 3 salles dans ce cinéma. Si vous voulez reconstruire une salle, choisissez 1, 2 ou 3 et nos architectes se mettront au boulot !", "Attention", JOptionPane.INFORMATION_MESSAGE);
            } else if (salleInt < 1) {
                JOptionPane.showMessageDialog(this, "Il n'y a que 3 salles dans ce cinéma. Si vous voulez reconstruire une salle, choisissez 1, 2 ou 3 et nos architectes se mettront au boulot !", "Attention", JOptionPane.INFORMATION_MESSAGE);
            } else {
                final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
 
                try {
                    DocumentBuilder builder = factory.newDocumentBuilder();
                    Document xml = builder.newDocument();
 
                    Element root = xml.createElement("salle");
                    Element trunk1 = xml.createElement("numSalle");
                    Element trunk2 = xml.createElement("nbCol");
                    Element trunk3 = xml.createElement("nbRow");
                    Element trunk4 = xml.createElement("nbHandi");
 
                    root.appendChild(trunk1);
                    root.appendChild(trunk2);
                    root.appendChild(trunk3);
                    root.appendChild(trunk4);
 
                    trunk1.setTextContent(salle);
                    trunk2.setTextContent(String.valueOf(col));
                    trunk3.setTextContent(String.valueOf(row));
                    trunk4.setTextContent(String.valueOf(handi));
 
                    // On crée un fichier xml correspondant au résultat
                    // construire la transformation inactive
                    Transformer t = TransformerFactory.newInstance().newTransformer();
                    t.setOutputProperty(OutputKeys.INDENT, "yes");
                    String resultFile = "salles/Salle " + salle + ".xml";
                    StreamResult XML = new StreamResult(resultFile);
 
                    t.transform(new DOMSource(root), XML);
                    System.out.println("Le fichier " + resultFile + ".xml a été créé.");
 
 
                    String salle_nom = "Salle " + salle;
                    String querySalle = "UPDATE salle SET nb_place = '" + totalPlaces + "' WHERE salle_nom = '" + salle_nom + "'";
                    String querySalleHandi = "UPDATE salle SET nb_place_handi = '" + handi + "' WHERE salle_nom = '" + salle_nom + "'";
                    try {
                        PreparedStatement state = BD_Access.getInstance().prepareStatement(querySalle);
//                        java.sql.Statement state = BD_Access.getInstance().createStatement();
                        state.executeUpdate();
                        state.close();
 
                        PreparedStatement stateBis = BD_Access.getInstance().prepareStatement(querySalleHandi);
//                        java.sql.Statement stateBis = BD_Access.getInstance().createStatement();
                        stateBis.executeUpdate();
                        stateBis.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
 
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            vue_admin.setEnd("Votre salle a bien été ajoutée.");
            vue_admin.endingCreate();
        }
        if (source == vue_admin.ajout_film) {
 
            String film = vue_admin.textFilm.getText();
 
            if (film == null || film.length() == 0) {
                JOptionPane.showMessageDialog(null,
                        "Vous devez rentrer un titre de film", "Champs vide",
                        JOptionPane.ERROR_MESSAGE);
            } else {
                String apiKey = "c5f1c364694d8b4dcee999aee55a";
                film = (film.replace(' ', '+'));
                System.out.println("film choisi : " + film);
                String url = "https://api.themoviedb.org/3/search/movie?api_key=" + apiKey + "&language=fr&&region=FR&query=" + film;
 
            /* On rempli le json à l'aide d'input stream*/
                InputStream input = null;
                OutputStream output = null;
                try {
                    input = new URL(url).openStream();
                    output = new FileOutputStream("salles/films.json");
                    byte[] buffer = new byte[1024];
                    for (int length; (length = input.read(buffer)) > 0; ) {
                        output.write(buffer, 0, length);
                    }
                    System.out.println("Fichier rempli : output.json");
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    if (output != null)
                        try {
                            output.close();
                        } catch (IOException logOrIgnore) {
                        }
                    if (input != null)
                        try {
                            input.close();
                        } catch (IOException logOrIgnore) {
                        }
                }
                try {
                    JSONParser parser = new JSONParser();
                    Object object = parser.parse("salles/films.json");
 
                    // convert Object to JSONObject
                    JSONObject jsonObject = (JSONObject) object;
 
                    // Reading the array
                    JSONArray results = (JSONArray) jsonObject.get("results");
 
                    // on affiche la nouvelle page
                    vue_admin.choseFilm(results);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }

Ma vue, classique qui appelle son controller, composée de plusieurs fonctions qui fonctionne comme le AddSalle() et qui plante del a même manière.

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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
public class Vue_administrateur extends JFrame implements ActionListener {
 
    /* ControllerLogin */
    private ControllerAdmin getcontrol = new ControllerAdmin(this);
 
    /**
     * Constructeur
     */
    public Vue_administrateur() {
 
//        this.text.setEditable(false);
        setSize(800, 500);
        setTitle("Panneau d'administration - CinéGo");
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
 
        initToolbar();
        initContent();
    }
 
    /**
     * @param event actionListener sur la banière en top
     *              A externaliser vers controller
     */
    public void actionPerformed(ActionEvent event) {
        Object source = event.getSource();
 
        if (source == fermer_fen) {
            this.fermer_fen();
        } else if (source == add_film) {
            /* ajout d'un film */
            System.out.println("Ajouter un film");
            addFilm();
            setEntete("Vous pouvez ici ajouter un film. Procédure: Choisir le titre du film que vous voulez programmer; lui ajouter un créneau et une salle.");
        } else if (source == add_salle) {
        /* Ajout d'une salle*/
            System.out.println("Ajouter une salle");
            addSalle();
            setEntete("Vous pouvez ici ajouter une salle. Procédure: Ajoutez son numéro, puis son nombre de place handicapées, de colonnes et de rangées");
        }
    }
 
    /**
     * ajouter une salle vers fichier .xml
     *
     */
    public void addSalle() {
        result.removeAll();
        result.repaint();
        result.setLayout(new GridBagLayout());
 
        GridBagConstraints c = new GridBagConstraints();
        c.insets = new Insets(0, 5, 5, 0);
 
        salle.setPreferredSize(new Dimension(40, 25));
        row.setPreferredSize(new Dimension(40, 25));
        col.setPreferredSize(new Dimension(40, 25));
        handi.setPreferredSize(new Dimension(40, 25));
 
        c.gridheight = 1;
        c.gridwidth = 1;
        c.gridx = c.gridy = 0;
        result.add(newSalle, c);
 
        // nom de la salle
        c.gridy = 1;
        result.add(salleLab, c);
        c.gridx = 1;
        result.add(salle, c);
 
        // colonnes
        c.gridx = 0;
        c.gridy = 2;
        result.add(colLab, c);
        c.gridx = 1;
        result.add(col, c);
 
        // rangées
        c.gridx = 0;
        c.gridy = 3;
        result.add(rowLab, c);
        c.gridx = 1;
        result.add(row, c);
 
        c.gridx = 0;
        c.gridy = 4;
        result.add(handiLab, c);
        c.gridx = 1;
        result.add(handi, c);
 
        // bouton
        c.gridx = 0;
        c.gridy = 5;
        c.fill = GridBagConstraints.REMAINDER;
        result.add(ajout_salle, c);
 
        ajout_salle.addActionListener(getcontrol);
 
        result.revalidate();
    }
Voilà,

J'ai essayé d'être au plus clair.

En espérant que quelqu'un ait une idée pour me débloquer de ce facheux problème.

Je dois passer à côté d'un truc simple dont je n'ai peut être pas connaissance.

Merci à qui prendra le temps de lire ça !

Ichoui