IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

Chercher à coder proprement


Sujet :

AWT/Swing Java

  1. #1
    Membre du Club
    Inscrit en
    Novembre 2009
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 68
    Points : 56
    Points
    56
    Par défaut Chercher à coder proprement
    salut tout le monde,

    j'ai une interface graphique qui contient deux JTextField et un JcomboBox,et en fonction du contenu du JcomboBox, j'afficherai un autre JPanel qui contient un ensemble de composants.

    alors j'ai procédé comme suit(ça a marché) mais je veux bien savoir si j'ai codé proprement.

    j'ai créé un classe qui remplie une HashMap(String, JPanel)....le string est le contenu de ma JComboBox

    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
    public class MapGui {
     
    	/**
             * Create the panel.
             */
    	HashMap<String, JPanel> map;
     
    	public MapGui() {
    		map.put("1", new location());
    		map.put("2", new vente());
    		.......
    	}
     
    	public JPanel getPanel(String s) {
    		return map.get(s);
     
    	}
     
    }
    et à chaque fois je fais appel à la méthode:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public JPanel getPanel(String s) {
    return map.get(s);
     
    }
    et new location() et new vente() et.....sont des classes qui héritent de JPanel et qui contiennent l'ensemble de composants.

    Merci d'avance

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Plutôt que d'utiliser une HashMap de JPanel et supprimer/remplacer le JPanel présent pour un autre (donc modifier régulièrement l'arbre de composant), tu peux utiliser un CardLayout. Il s'agit d'u n LayoutManager qui permet de choisir parmi un certain nombre de composants (des JPanel par exemple), l'unique composant qui sera affiché. On repère chaque composant par une clef, à la façon d'une Map, donc c'est très similaire, mais beaucoup moins impactant sur l'arbre de composant, et plus simple du point de vue gestion de l'interface (Layouting/Repainting).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre du Club
    Inscrit en
    Novembre 2009
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 68
    Points : 56
    Points
    56
    Par défaut
    je l'ai utilisé et ça a fonctionné parfaitement, il utilise presque le même principe qu'une HashMap.

    la méthode:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    show (Container parent, String name)
    permet d'afficher le composant ou le sous-container associé à la chaîne de caractères name.


    MAIS est il possible de récupérer le container associé à une chaine "name"?

  4. #4
    Membre du Club
    Inscrit en
    Novembre 2009
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 68
    Points : 56
    Points
    56
    Par défaut
    parce que en fait, j'ai une interface graphique java qui contient deux textField et un JComboBox et un bouton, lorsque je clique sur le bouton, j'affiche un JPanel(qui contient un ensemble de JtextField) en fonction du contenu de ComboBox, pour cela j'ai utilisé le layout CardLayout et voici le code de mon bouton:

    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
    public void actionPerformed(ActionEvent arg0) {
    				String 
    				nom=textField.getText(),
    				prenom=textField_1.getText(),
    				acte=((String)comboBox.getSelectedItem()).trim();
    				String catégorie=ConnectionManager.getCategorie(((String)comboBox.getSelectedItem()).trim());
    				CardLayout cl = (CardLayout)(panel_1.getLayout());
    				location = new Location(nom,prenom,acte);
    				vente = new Vente(nom,prenom,acte);
    				......
    				obj20=new Objet20(nom,prenom,acte);
    				panel_1.add(location, "1");
    				panel_1.add(vente, "2");
    				.........
    				panel_1.add(obj20, "20");
    		        cl.show(panel_1, catégorie);
    			}
    ça marche parfaitement mais ce qui me dérange est que à chaque clique sur le bouton je recréé mes 20 objets et je les ajoutes a panel_1

    Y a t'il un moyen pour pallier à ce problème?

    Merci d'avace

  5. #5
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par mouned Voir le message
    MAIS est il possible de récupérer le container associé à une chaine "name"?
    Non. Il te faut avoir une HashMap, à part, pour ça. Mais tu ne devrais pas avoir à le faire : normalement, tu devrais préparer ton modèle et ton contrôleur au début, au moment de créer l'interfacs. Lors de la connexion entre les éléments du MVC, tu as besoin des références, mais ensuite tu ne devrais plus en avoir besoin : le contrôleur doit tout avoir à portée. Même si, éventuellement, la création des panels du cardlayout est dynamique (la connexion va se faire en partie au moment de la sélection), par contre, il pourra être nécessaire d'avoir un flag pour savoir que le panel n'a pas encore été créé.


    Citation Envoyé par mouned Voir le message
    parce que en fait, j'ai une interface graphique java qui contient deux textField et un JComboBox et un bouton, lorsque je clique sur le bouton, j'affiche un JPanel(qui contient un ensemble de JtextField) en fonction du contenu de ComboBox, pour cela j'ai utilisé le layout CardLayout et voici le code de mon bouton:

    [CODE]
    ça marche parfaitement mais ce qui me dérange est que à chaque clique sur le bouton je recréé mes 20 objets et je les ajoutes a panel_1

    Y a t'il un moyen pour pallier à ce problème?

    Merci d'avance
    Oui, il ne faut pas les créer à chaque fois. Tu les crées tous d'avance, et tu utilises ton modèle pour les remplir (et non pas le constructeur, qui ne doit avoir aucun argument). Ou, si tu veux faire plus simple : tu stockes chacun des panels que tu mets dans le cardlayout dans une variable de classe (ce que tu fais d'ailleurs semble-t-il. Tu n'es même pas obligé de les créer d'avance, mais c'est peut-être plus simple pour toi). Tu les remplis par contre par un setter et non par le constructeur (d'ailleurs c'est par un setter équivalent que le modèle les mettraist à jour).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  6. #6
    Membre du Club
    Inscrit en
    Novembre 2009
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 68
    Points : 56
    Points
    56
    Par défaut
    si j'utilise les setters et les getters, ça au revient au même et peut etre pire parce que, dans le code de mon bouton, je vais appeler 3 setters pour chaque objets...3*20=60 lignes de codes.

    En plus, j'ai pas compris cette notion de modéle...est ce que vous pouvez m'eclaircir avec un exemple svp.

  7. #7
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par mouned Voir le message
    si j'utilise les setters et les getters, ça au revient au même et peut etre pire parce que, dans le code de mon bouton, je vais appeler 3 setters pour chaque objets...3*20=60 lignes de codes.
    A un moment donné, si tu as soixante champs et soixante informations à mettre dedans, il faudra bien faire ces soixante affectations (ou soixante bindings, peu importe). D'ailleurs tu le fais bien dans ton constructeur, quelque part. Mais sur des composants, tu peux faire des setters multi-valeurs, avec les mêmes paramètres pour le setter que pour le constructeur : ça reste des composants d'affichage, donc ce n'est pas choquant.


    Citation Envoyé par mouned Voir le message
    En plus, j'ai pas compris cette notion de modéle...est ce que vous pouvez m'eclaircir avec un exemple svp.
    L'implémentation du pattern MVC consiste à séparer l'UI en trois parties :
    • le modèle, qui contient les données à traiter
    • la vue, qui affiche les données, et les composants d'interaction (boutons, combos, etc...)
    • Le contrôleur, qui gère la communication entre modèle et vue, et le reste (actions)


    Plus en détail :
    • Le modèle contient les données, mais est capable de lancer des évènements qui disent qu'une donnée à changer (On peut utiliser SwingPPropertyChangeSupport pour faire ça, ou utiliser ses propres classes, ou un mixte des deux).
    • La vue a des composants graphiques : des champs, des boutons, des listes, etc.
    • Le contrôleur communique avec les 2.
      • Lorsque les données sont simples et que chaque vue est un JPanel permet de les visualiser en une seule fois, on peut faire un contrôleur interne à la vue (ce qui est préférable, le contrôleur étant très spécifique - éventuellement toute la partie liée au modèle peut être dans une abstraction, pour être réutilisable pour plusieurs contrôleur/vue), ou externe : le contrôleur s'enregistre comme écouteur du modèle et est chargé de mettre à jour les bons composants
      • Lorsqu'il faut plusieurs sous-vues (comme dans ton cas), on peut faire pareil pour chaque sous-vues, plus un contrôleur unique qui écoute le modèle et redistribue les évenements à chaque sous-vue, mais sait également comment passer d'une sous-vue à l'autre (c'est lui qui va appeler cardlayout.show().).


    Exemple dans le tutoriel MVC.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  8. #8
    Membre du Club
    Inscrit en
    Novembre 2009
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 68
    Points : 56
    Points
    56
    Par défaut
    j'ai compris ce que tu veux dire et j'ai déja lu sur le net sur le MVC, mais j'ai pas su l'appliquer sur mon cas.

    En tous cas merci pour le temps que vous m'avez accordé pour me répondre.

  9. #9
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Si tu ne peux pas réaliser le MVC d'après l'exemple du tutoriel que je t'avais indiqué, tu peux au moins faire :


    1. Tu modifies tes classe :

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      public class Location {
       
         private JTextField fieldNom; // où je ne sais ce que tu as dans ton composant
         ...
       
         public Location(String nom, String prenom, String acte) {
       
             fieldNom = new JTextField( nom ); // où je ne sais ce que tu as dans ton composant
             ...
       
         }
       
      }
      en

      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
      public class Location {
       
         private JTextField fieldNom;
         ...
       
         public Location() {
       
             fieldNom = new JTextField(); // où je ne sais ce que tu as dans ton composant
             ...
       
         }
       
         public void setValues(String nom, String prenom, String acte) {
       
             fieldNom.setText( nom ); 
       
         }
       
      }
    2. Là où tu construis panel_1 :

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
       
      panel_1 = new ...
       
      ...
       
      location = new Location();
      panel_1.add(location, "1");
      vente = new Vente();
      panel_1.add(vente, "2");
      ...
      obj20 = new ...
      panel_1.add(obj20, "20");
    3. Dans ton actionPerformed :

      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
      public void actionPerformed(ActionEvent arg0) {
         String  nom=textField.getText(),
         String  prenom=textField_1.getText(),
         String  acte=((String)comboBox.getSelectedItem()).trim();
         String catégorie=ConnectionManager.getCategorie(((String)comboBox.getSelectedItem()).trim());
       
         CardLayout cl = (CardLayout)(panel_1.getLayout());
       
         location.setValues(nom,prenom,acte);
         vente.setValues(nom,prenom,acte);
         ...
         obj20.setValues(nom,prenom,acte);
       
         cl.show(panel_1, catégorie);
       
      }


    Et si jamais tu ne voulais pas avoir tes fiches vides au début (tant qu'on a pas fait la première sélection, tu utilises un booléen premiereFois initialisé à true :

    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
    public void actionPerformed(ActionEvent arg0) {
       String  nom=textField.getText(),
       String  prenom=textField_1.getText(),
       String  acte=((String)comboBox.getSelectedItem()).trim();
       String catégorie=ConnectionManager.getCategorie(((String)comboBox.getSelectedItem()).trim());
     
       CardLayout cl = (CardLayout)(panel_1.getLayout());
     
       if ( premiereFois ) {
            premiereFois = false;
            location = new Location();
            panel_1.add(location, "1");
            vente = new Vente();
            panel_1.add(vente, "2");
            ...
            obj20 = new ...
            panel_1.add(obj20, "20");
       }
     
       location.setValues(nom,prenom,acte);
       vente.setValues(nom,prenom,acte);
       ...
       obj20.setValues(nom,prenom,acte);
     
       cl.show(panel_1, catégorie);
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

Discussions similaires

  1. Critique de l'ouvrage "Coder proprement" de Robert C. Martin
    Par sjrd dans le forum Langages de programmation
    Réponses: 15
    Dernier message: 27/11/2012, 11h31
  2. Coder proprement un fichier de config
    Par dedis dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 30/04/2010, 15h11
  3. Coder proprement en général
    Par eldran64 dans le forum Langages de programmation
    Réponses: 88
    Dernier message: 28/06/2009, 09h27
  4. Coder proprement et standarment
    Par ploop dans le forum Général Python
    Réponses: 2
    Dernier message: 26/04/2007, 08h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo