Bonjour ! Voila je développe une IHM sous Netbeans 6.7. Cette application doit permettre d'effectuer certains tests à des bases de données et des serveurs. J'ai "essayé" autant que possible d'appliquer le pattern MVC.
J'ai grosso modo 2 vues (2 onglets pour être précis) :
- Une vue qui permet de sélectionner différents paramètres du test à effectuer (ping, connexion à la base de données, etc...) et un bouton permettant d'enregistrer le test
- Une autre vue qui affiche la liste des différents tests déjà enregistrés
Pour obtenir ce résultat, j'ai procédé comme suit :
- Création d'un bean "ChoixUtilisateur" que j'ai lié aux différents éléments de ma première vue (binding) et qui permet d'avoir les infos bien synchronisé entre la vue et mon bean.
- La 2e vue s'appuie sur une
qui contient l'ensemble des tests déja validé. C'est cette liste qui est affiché dans une JTable
Code : Sélectionner tout - Visualiser dans une fenêtre à part List<ChoixUtilisateur> tests
Ainsi dès que j'appuie sur le bouton , le test paramétré par l'utilisateur dans la première vue est ajouté à la liste "tests",
puis le contrôleur demande à la 2e vue de se mettre à jour.
Le problème que j'ai :
un premier Test t1 est paramétré et validé par l'utilisateur => il apparait dans la 2e vue.
un deuxième test t2 est paramétré (en modifiant par exemple un champ dans de la première vue), validé l'affichage est mis à jour : => j'ai bien 2 tests dans la 2e vue mais les 2 tests reprennent les paramètres du 1er test. Le 2e tests n'est pas pris en compte.
J'ai effectué quelques tests afin de déterminer d'où pouvait venir le problème :
Dans l'IHM, je paramètre un premier test que j'enregistre : il apparait bien dans la 2e vue. Néanmoins, si je modifie ensuite un champ de la première vue, le test enregistré dans la 2e vue est modifié. Or ce que je souhaiterai, ca serait conserver le binding des éléments de la première vue avec l'objet Test (pour la synchro des informations saisies par l'utilisateur) puis une fois que le test est enregitré, si on modifie un élément de la 1ere vue, cela ne doit pas avoir d'incidence sur les tests précédemment enregistré Voici la partie qui posent problème
Le code qui fait l'ajout dans le controleur
Le code du bouton qui permet d'enregistrer le test (appelle la méthode 'addSociete') Ce code se trouve dnas la classe qui crée l'IHM
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 /** * <p> * Ajoute un test à la liste des tests qui seront effectués * </p> * @param s * @return */ public boolean addSociete(ChoixUtilisateur choix){ boolean ajoutOk = false; /* La condition du if s'appuie sur un Set<Test> afin de ne pas avoir de tests en double dans ma List<Test> */ if(!getSocietesDejaEnregistres().contains(choix)){ ajoutOk = true; getSocietes().add(choix); getSocietesDejaEnregistres().add(choix); /* * On va mettre à jour le tableau récapitulatif des tests * enregistrés * Cette portion de code utilise l'introspection pour retrouver la * valeur des attributs de chaque élément de la liste */ vue.updateAffichageTests(); } vue.getSousMenuExecuterLesTests().setEnabled( getSocietesDejaEnregistres().size() > 0); return ajoutOk; }
enfin le code qui met à jour l'affichage
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 private void btnEnregistrerTestActionPerformed(ActionEvent evt) { if(!controleur.addSociete(getChoixUtilisateur())){ /* getChoixUtilisateur renvoie un objet qui reprend tous les paramètres du test : c'est cet objet qui est lié aux champs de l'ihm */ afficherMessageErreur("Un test identique a été déjà été enregistré"); } }
Il appelle la liste contenu dans le controleur et se met à jour
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 /** * <p> * Met à jour la liste des tests que l'utilisateur souhaite enregistrer * * </p> */ public void updateAffichageTests() { Field[] attributs = ChoixUtilisateur.class.getDeclaredFields(); List<Object> headers = new ArrayList<Object>(attributs.length); List<List<Object>> data = new ArrayList<List<Object>>( getControleur().getSocietes().size()); for (ChoixUtilisateur societe : getControleur().getSocietes()) { List<Object> infos = new ArrayList<Object>(attributs.length); for (Field field : attributs) { try { if (headers.size() < attributs.length) { headers.add(field.getName()); } field.setAccessible(true); infos.add(field.get(societe)); field = null; } catch (Exception ex) { Logger.getLogger(DaConnectorControleur.class.getName()) .log(Level.SEVERE, null, ex); } } data.add(infos); } attributs = null; Object[][] copieData = transformerListEnTableau(data); data = null; TableModel modele = new DefaultTableModel(copieData, headers.toArray()) { @Override public boolean isCellEditable(int l, int c) { return false; } }; getTableauTestsAEnregistrer().setModel(modele); }
Mes tentatives pour résoudre ce pb n'ont donné aucun résultat pour le moment. J'ai oublié de précisé que le binding est en lecture-écriture de sorte que le composant et la propriété liés se mettent à jour si l'un ou l'autre sont modifiés
edit : un modo peut-il déplacer ce message dans la section java svp ? je suis allé si vite que j'ai pas pris le temps de sélectionner le bon forum... merci d'avance
Partager