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

Java Discussion :

acces dynamique aux membres d'une classe


Sujet :

Java

  1. #1
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut acces dynamique aux membres d'une classe
    je cherche un moyen d'acceder dynamiquement aux membres d'une classe a l'execution, c'est a dire retrouver une variable d'apres son nom.
    A savoir : ces variabels sont de type object et plus precisement des composants graphiques. Pas forcement QUE des composants graphiques mais dans un premier temps ca ira comme ca
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  2. #2
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    Il faut faire de l'introspection (ou reflexion).
    Comment ça ? La réponse à ton problème n'est ni dans la faq, ni dans les tutos, ni dans sources ??? Etonnant...
    De la bonne manière de poser une question (et de répondre).
    Je ne fais pas de service par MP. Merci (...de lire les règles...).
    Ma page dvp.com

  3. #3
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    ok c'est tres tres bien tout ca !
    Avec la classe Field on arrive a faire pleins de choses

    Maintenant ce qui me bloque c'est comment convertir une variable en tant que Field ou directement acceder a la version chaine du nom d'une variable.
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  4. #4
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    Tu peux donner un exemple concret de ce que tu veux faire avec du code stp ? J'ai peur de ne pas bien comprendre ce que tu souhaites faire
    Comment ça ? La réponse à ton problème n'est ni dans la faq, ni dans les tutos, ni dans sources ??? Etonnant...
    De la bonne manière de poser une question (et de répondre).
    Je ne fais pas de service par MP. Merci (...de lire les règles...).
    Ma page dvp.com

  5. #5
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    concretement j'ai une proprietee du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    private JLabel label = new JLabel("toto");
    je souhaite pouvoir obtenir la chaine textuelle reprensantant le nom de la variable, c'est a dire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String name = XXX.getname(this.label);
    ce qui est sensé renvoyé la chaine "label".

    De cette maniere, je peux aller chercher des infos dans un fichier depuis une fonction generique ....

    mais a y reflechir je crois que je m'embrouille un peu
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  6. #6
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    Oula, ça me parait bizarre comme utilisation.
    En plus si tu dois faire un "this.label" qui te renvoie "label" autant taper String name = "label"; directement (si je comprends bien).
    Comment ça ? La réponse à ton problème n'est ni dans la faq, ni dans les tutos, ni dans sources ??? Etonnant...
    De la bonne manière de poser une question (et de répondre).
    Je ne fais pas de service par MP. Merci (...de lire les règles...).
    Ma page dvp.com

  7. #7
    Expert éminent
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Points : 7 679
    Points
    7 679
    Par défaut
    Bonjour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Field[] fields = UneClasse.class.getDeclaredFields();
    for (int i = 0; i < fields.length; i++) {
    	Field field = fields[i];
    	if (field.getType() == JLabel.class) {
    		field.setAccessible(true);
    		System.out.println(field.getName());
    	}
    }
    Ceci te permet de récupérer tous les champs de type JLabel et d'afficher leurs noms.

  8. #8
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Oui c'est ce que j'ai vu precedement.
    Mais cela ne marche que pour un seul label. si j'en ai plusieurs ca plantera

    en fait pour les composants, je peux me baser sur la propriete getName mais il me faut la specifiée moi meme.

    Mon but est de creer une sorte de "configurateur" graphique a qui je passe une serie de composants et qui va piocher les valeurs (size, layout, etc ...) dans un fichier texte.

    J'utilise un fichier de proprietees dont les clefs sont indexées par le nom de la variable (label.size.minimum.width = 100, ...)

    J'aimerais donc recuperer une instance d'un composant et parcourir le fichier en recuperant des clefs dont je module le nom en fonction du nom du composant transmis .....

    Bon maintenant, si quelqu'un a une idee pour gerer ca automatiquement (et donc externaliser la configuration d'une IHM) sans passer par des editeurs wysiwyg ca m'arrangerais !

    Merci
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  9. #9
    Expert éminent
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Points : 7 679
    Points
    7 679
    Par défaut
    Euh ... pourquoi ça planterait avec 2 JLabel ? ça marche sans problème chez moi

    Sinon, y'a justement un truc qui correspond peut être à tes besoins: externaliser les trucs de l'IHM vers un fichier CSS ... C'est tkui-css, en cours de développement par azer (un de nos membres) et j'essais de lui aider un peu la dessus ...
    Ca te permet justement de:
    - Créer des feuilles de styles CSS avec pas mal de propriétés: font, border, color, background-color
    - Divers sélecteurs: par type, par identifiant, hover, focus, etc.
    - Et appliquer les styles sur tes IHMs en 3 lignes de code.

  10. #10
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Autant pour moi, j'ai lu de traviolle ton code
    En fait tu parcours toutes les property de la classe et tu cherche ensuite a les initialiser.

    sinon ce que tu me propose a l'air bien mais me semble un peu trop complet pour ce que je veux faire.

    En fait ce qui m'interesse c'est juste d'externaliser les centaines de lignes qui parametres les objets swing les les contraintes du GBC

    Ca deviens vite illisible comme code apres ca

    Je vais peut etre pousser mon code un peu plus loin pour voir si ya pas une astuce qui m'aurait echapée

    Petite question subsidiaire :
    Au niveau perfs, si je cree un classe qui gere l'ensemble des objets swing (du moins lesp lus courrant) il faudra que l'importe toutes les classes utilisé dans mon code. Mais a l'usage, est ce qu'il charge toutes les classes ? j'imagine que c'est optimisé non ? C'est pas parce qu'on a fait un import que la classe est chargée ... mais elle est charge lors de la premiere declaration non ?
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  11. #11
    Expert éminent
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Points : 7 679
    Points
    7 679
    Par défaut
    oui oui, les imports sont optimisés par le compilateur

  12. #12
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    Plutôt que de faire de l'introspection, tu pourrais créer une map de tes composants, avec comme clé la propriété "name".
    Par exemple, dans le fichier de propriétés, les lignes :
    label1.size.minimum.width = 100
    label2.size.minimum.width = 100
    sous-entendent que dans ton code tu as quelque part :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    JLabel label1 = new JLabel();
    label1.setName("label1");
    JLabel label2 = new JLabel();
    label2.setName("label2");
    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
        Map componentMap = new HashMap();
     
        public void registerComponent(Component c) {
            componentMap.put(c.getName(), c);
            if (c instanceof Container) {
                Component[] children = ((Container) c).getComponents();
                for (int i = 0; i < children.length; i++) {
                    registerComponent(children[i]);
                }
            }
        }
     
        public Component getComponentByName(String name) {
            return (Component) componentMap.get(name);
        }
    Tu peux enregistrer tes composants à la volée ou en une seule fois en passant le container de niveau le plus haut dans la hiérarchie, une fois celle-ci construite.

  13. #13
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Sans passer par les map je me dirigeais vers ce genre de technique.
    Mais j'aurais maimé souhaité eviter de passer par la methode setName pour economiser ces lignes de codes.

    Mais bon vu que la structure actuelle de mon appli tends a passer par une liste de composants pour les rescencer et les manipuler plus facilement, l'ajout de ce parametre se fera via un argument supplementaire de la methode registerComponent.....

    Comme ca ca peut le faire.

    Derniere question subsidiaire, plutot acces lecture des données.
    Je suis tres souvent confronté a un probleme : La lecture des données dans le fichier property.
    En fonction de la presence ou non des donnees, et de leurs format, je suis ammené a avoir un traitement d'arreur assez consequent : Resultat nul ou non null, exceptions NumberFormatException suceptibles d'etre lancées, etc ... ce qui conduit a implementer un sacree nombre de lignes rien que pour lire une donnée de type entiere.

    Avez vous une astuce quelconque pour gerer les erreurs de lecture en un minimum de traitements ?

    La gestion des erreurs sous java me perturbe encore pas mal car elle est genereuse en ligne et rends tes vite le code illisible (a mon gout )
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  14. #14
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    Si tu veux économiser les setName() tu peux passer par des méthodes factory :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public JLabel createJLabel(String name) {
      JLabel label = new JLabel();
      label.setName(name);
      return label;
    }
     
    public JButton createJButton(String name) {
      JButton button = new JButton();
      button.setName(name);
      return button;
    }
    ...
    Si tu ajoutes un argument supplémentaire à la méthode registerComponent, tu seras obligé de l'appeler pour chaque composant, alors qu'un seul appel peut suffire si tu l'appliques sur le container de plus haut niveau (puisque la méthode parcourt toute la hiérarchie).

    Concernant la lecture des données dans le fichier Property, j'écrirais autant de méthodes qu'il y a de types de données à lire :
    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
    class GUIProperties extends Properties {
     
      public String getStringProperty(String key) {
        String s = getProperty(key);
        return s;
      }
     
      public int getIntProperty(String key) {
        String s = getProperty(key);
        try {
          return Integer.valueOf(s).intValue();
        } catch (NumbeFormatException nfe) {
           log.error("clé : " + key + ", format d'entier incorrect : " + s, nfe);
           throw nfe;
        }
      }
     
      public boolean getBooleanProperty(String key) {
        String s = getProperty(key);
        return Boolean.valueOf(s).booleanValue();
      }
     
    ...

  15. #15
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    ok merci pour ces infos
    N'etant pas encore tres familier avec la methode de penser java, il m'arrive encore de douter de la pertinence des mes algos
    alors je cherche toujorus a voir si ya pas mieux .....
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  16. #16
    Membre expérimenté
    Avatar de azerr
    Homme Profil pro
    Ingénieur Etude JEE/Eclipse RCP
    Inscrit en
    Avril 2006
    Messages
    942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Etude JEE/Eclipse RCP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 942
    Points : 1 464
    Points
    1 464
    Par défaut
    Bonjour

    suite a la remarque de djo

    Sinon, y'a justement un truc qui correspond peut être à tes besoins: externaliser les trucs de l'IHM vers un fichier CSS ... C'est tkui-css, en cours de développement par azer (un de nos membres) et j'essais de lui aider un peu la dessus ...
    J'ai commence a redige la section moteur CSS TK-UI (avec Swing et SWT). Soyez indulgent (svp), c'est juste une introduction qui permet de montrer ce que l'on peut faire avec les moteurs CSS.

    Aujourd'hui il n'y a pas encore de distribuable mais ca ne saurrait tarde.

    Angelo

  17. #17
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    Pour info, si ça t'intéresse [Source] Configurateur graphique

Discussions similaires

  1. Accès aux membres d'une classe impossible
    Par couicsilver dans le forum C++
    Réponses: 5
    Dernier message: 18/03/2009, 11h21
  2. Réponses: 6
    Dernier message: 02/04/2008, 14h41
  3. Problème d'accés a un membre d'une classe
    Par poulette3000 dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 09/07/2007, 17h04
  4. Réponses: 5
    Dernier message: 01/02/2007, 13h14
  5. Réponses: 1
    Dernier message: 18/08/2006, 10h34

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