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

Langage Java Discussion :

Parcourir les éléments d'une classe


Sujet :

Langage Java

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Parcourir les éléments d'une classe
    Bonjour à tous,
    J'ai un problème dont voici l'énoncé ... Je souhaite parcourir une classe (un JPanel dans mon cas) qui contient des Fields, d'autres JPanel qui contiennent eux même des JTextField, JComboBox, ...

    Le but est simple, comment prendre une photocopie d'une classe à un instant donné, en pouvoir déterminer plus tard si des champs ont étés modifiés.

    J'ai lu quelque chose d'interressant sut ce forum sur l'introspection http://ricky81.developpez.com/tutori...pi/reflection/
    mais l'exemple donne les SubClasses d'un object, hors je voudrais l'inverse, à savoir les classes filles !

    Quelqu'un a-t-il un bout de code qui pourrait me mettre sur la voie ?

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut,
    Je n'ai peut-être pas tout compris mais un listener sur chacun de tes éléments qui assignerait une variable quand ils sont modifiés (le type de listener dépend de ton élément) ne serait pas mieux ?

  3. #3
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    déjà, les composant graphiques présent dans un JPanel, t'as pas besoin d'introspection pour les lister. Ils sont accessible via getComponents(). Ensuite, si tu veux enregistrer tous les champs de classes pour vérifier qu'ils ont été modifié, attends toi à la catastrophe. Au moins je pense la moitié des champs d'un composant graphique java sont modifié régulièrement dans le cadre du fonctionnement de l'application, sans même qu'il y aie "édition"


    Pourrais-tu un peu préciser (avec peut etre un exemple) ce que tu veux exactement?

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par George7 Voir le message
    Salut,
    Je n'ai peut-être pas tout compris mais un listener sur chacun de tes éléments qui assignerait une variable quand ils sont modifiés (le type de listener dépend de ton élément) ne serait pas mieux ?
    Oui bien sur, mais il faut voir ça comme un principe réutilisable sur d'autres classes. De plus, j'en ai qq une avec plus d'une trentaine de champs ... et je ne te parle pas des JComponent ajouté par d'autres membres de l'équipe qui oubliront les listeners ...

    Je voudrait un truc automatique qui me signale les modifications.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    déjà, les composant graphiques présent dans un JPanel, t'as pas besoin d'introspection pour les lister. Ils sont accessible via getComponents(). Ensuite, si tu veux enregistrer tous les champs de classes pour vérifier qu'ils ont été modifié, attends toi à la catastrophe. Au moins je pense la moitié des champs d'un composant graphique java sont modifié régulièrement dans le cadre du fonctionnement de l'application, sans même qu'il y aie "édition"


    Pourrais-tu un peu préciser (avec peut etre un exemple) ce que tu veux exactement?
    Je pense qu'il parlait de la valeur du composant modifiée, genre dans une combobox, mais avec un listener du style ItemListener ou un caretlistener pour un textfield ca devrait le faire...

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    déjà, les composant graphiques présent dans un JPanel, t'as pas besoin d'introspection pour les lister. Ils sont accessible via getComponents(). Ensuite, si tu veux enregistrer tous les champs de classes pour vérifier qu'ils ont été modifié, attends toi à la catastrophe. Au moins je pense la moitié des champs d'un composant graphique java sont modifié régulièrement dans le cadre du fonctionnement de l'application, sans même qu'il y aie "édition"


    Pourrais-tu un peu préciser (avec peut etre un exemple) ce que tu veux exactement?
    getComponents fonctionne effectivement. Par contre, il faut que je puisse suivre les classes filles si mon JComponent est ou hérite d'un JPanel, car celui -ci peut avoir d'autres JComponent, ...

    Je voudrais en fait savoir simplement s'il y a une une modif dans au moins une valeur d'un JComponent ou Field entre 2 instants. Pour être encore plus précis, j'ai un JTabbedPane qui enregistre des informations sur le dernier JPanel, et qui doit intervenir, voir renvoyer sur un JPanel précédent en fonction des modifs et de l'ordre de passage entre les panneaux.

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    c'est assez agressif et bourrin de foncer dans tout pour scanner et brancher des listeners automatiquement. D'autant que tu risque de te rendre compte à la fin que certains composants ne devraient pas être écoutés ou autres détails ^^ (exemple, si quelqu'un ajoute un textarea en readonly pour afficher des infos qui varient en fonction d'uatres infos, ton textarea participera au scan global alors qu'il ne contient qucune donnée utile).

    Généralement, pour le genre de truc que tu veux faire, on passe par une classe controller, à laquelle on file un à un tous les composant à "controller", et c'est elle qui suit les composant qu'on lui a passé. Un développeur de l'équipe oublie de passer un composant? Ben oui, çà arrive, on corrige dans ce cas. Par expérience, t'aura plus de problèmes avec un truc automatique qu'avec les programmeur qui oublient.

  8. #8
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    c'est assez agressif et bourrin de foncer dans tout pour scanner et brancher des listeners automatiquement. D'autant que tu risque de te rendre compte à la fin que certains composants ne devraient pas être écoutés ou autres détails ^^ (exemple, si quelqu'un ajoute un textarea en readonly pour afficher des infos qui varient en fonction d'uatres infos, ton textarea participera au scan global alors qu'il ne contient qucune donnée utile).

    Généralement, pour le genre de truc que tu veux faire, on passe par une classe controller, à laquelle on file un à un tous les composant à "controller", et c'est elle qui suit les composant qu'on lui a passé. Un développeur de l'équipe oublie de passer un composant? Ben oui, çà arrive, on corrige dans ce cas. Par expérience, t'aura plus de problèmes avec un truc automatique qu'avec les programmeur qui oublient.
    Je n'avais aucune intention de mettre des listeners partout !
    Je pensais qu'à partir d'un JPanel il serait relativement facile d'extraire les valeurs de tous les JComponent du JPanel et des JPanel filles.

  9. #9
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    le problème reste le même, tu va être confronté à un nuage de Textfield, radio bouton, boites déroulantes, sans savoir le comment du pourquoi de chacun,

    Sinon, pour scanner, on t'as donné la méthode: getComponents(), après faut jouer avec instanceOf pour savoir quoi en faire.

  10. #10
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    le problème reste le même, tu va être confronté à un nuage de Textfield, radio bouton, boites déroulantes, sans savoir le comment du pourquoi de chacun,

    Sinon, pour scanner, on t'as donné la méthode: getComponents(), après faut jouer avec instanceOf pour savoir quoi en faire.
    Voici en fait un début de code de ce que je voulais faire :
    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
     
        public void instanceOf(JComponent component) {        
            for (int i=0;i<component.getComponentCount();i++) {
                System.out.print(component.getComponent(i).getClass().getName());
     
                if (component.getComponent(i) instanceof javax.swing.text.JTextComponent) { // Tous les champs textes
                    System.out.println(" Valeur="+((javax.swing.text.JTextComponent)component.getComponent(i)).getText());
                    continue;
                }
                if (component.getComponent(i) instanceof JComboBox) {
                    System.out.println(" Valeur="+((JComboBox)component.getComponent(i)).getSelectedIndex());
                    continue;
                }
                if (component.getComponent(i) instanceof JList) {
                    System.out.println(" Valeur="+((JList)component.getComponent(i)).getSelectedIndex());
                    continue;
                }
                if (component.getComponent(i) instanceof JTable) {
                    System.out.println(" Valeur="+((JTable)component.getComponent(i)).getSelectedRow());
                    continue;
                }
                if (component.getComponent(i) instanceof JLabel) {
                    System.out.println(" Valeur="+((JLabel)component.getComponent(i)).getText());
                    continue;
                }
                if (component.getComponent(i) instanceof AbstractButton) { // JButton, JCheckBox et JRadioButton
                    System.out.println(" Valeur="+((AbstractButton)component.getComponent(i)).getText()+"/"+((AbstractButton)component.getComponent(i)).isSelected());
                    continue;
                }
     
                if (component.getComponent(i) instanceof JPanel ||
                    component.getComponent(i) instanceof JTabbedPane ||
                    component.getComponent(i) instanceof Box ||
                    component.getComponent(i) instanceof JViewport ||
                    component.getComponent(i) instanceof JScrollPane) { // Les conteneurs
     
                    System.out.println("");
                    instanceOf((JComponent)component.getComponent(i));
                }
                else {
                    System.out.println(" Valeur="+(component.getComponent(i)));
                }
            }
        }
    Cette méthode balaye tous les composants d'un composant donné (un JPanel par exemple) et affiche la valeur de chaque JComponent.
    J'y trouve trois problèmes :
    Comment reconnaitre les JComponent qui sont des conteneurs (pour ne par avoir des tests JPanel || JScrollPane, ...
    N'y a-t-il pas plus simple de connaitre la valeur d'un JComponent que de tester son type, puis appliquer la bonne méthode ?
    Est-il possible de connaitre le nom de la variable de classe du JComponent ?

  11. #11
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Comment reconnaitre les JComponent qui sont des conteneurs (pour ne par avoir des tests JPanel || JScrollPane, ...

    Tous les JComponent étendent java.awt.Container, et à ce titre, tous sont des conteneurs.

    N'y a-t-il pas plus simple de connaitre la valeur d'un JComponent que de tester son type, puis appliquer la bonne méthode ?

    Pas que je sache, tu veux y aller à la dure, faut endurer ^^

    Est-il possible de connaitre le nom de la variable de classe du JComponent ?

    Qu'entends tu pas le nom de la variable de classe?

Discussions similaires

  1. Parcourir les éléments d'une classe
    Par M.Dolly dans le forum Général Python
    Réponses: 9
    Dernier message: 30/08/2009, 15h41
  2. [VB.NET 2005] Parcourir les propriétes d'une Class
    Par ricil78 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 27/03/2007, 21h47
  3. parcourir les éléments d'une table
    Par Daniel MOREAU dans le forum Access
    Réponses: 1
    Dernier message: 14/01/2007, 17h50
  4. Parcourir les membres d'une classe
    Par oodini dans le forum C++
    Réponses: 4
    Dernier message: 20/10/2006, 22h59
  5. [VB.NET] Parcourir les attributs d'une classe
    Par pasqwal dans le forum Windows Forms
    Réponses: 3
    Dernier message: 15/02/2005, 09h47

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