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 :

Accès à des éléments de la Frame principale


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Décembre 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Décembre 2007
    Messages : 40
    Par défaut Accès à des éléments de la Frame principale
    Bonsoir à tous, j'aimerais avoir une réponse à un problème de conception récurent. Voilà.

    On suppose une application avec une frame principale et des composants. Lorsque je clique sur un bouton une classe qui dérive de Thread est exécutée pour un long traitement.

    Qu'elle est la meilleure (bonne) méthode pour accéder, à partir de cette classe, aux éléments de la frame ?

    Est-ce en rendant les éléments de la frame static, en créant aussi des méthodes statiques qui modifient les propriétés de ces éléments, afin d'y accéder par d'autres classes ?

    Ex : une classe qui exécute un long travail, et l'on veut voir la progression sur une barre de la frame principale. J'ai utilisé cette méthode et cela fonctionne mais est-ce propre ?

    J'ai constaté une limite à cette méthode : je veux changer le chemin de la propriété icon d'un JLabel de la frame principale à partir de la classe qui exécute le long très traitement.

    Dans ma frame, si je mets mon JLabel en static, crée une méthode statique pour modifier le chemin de l'icone,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public static void setPathImage(String path) {
        jLabel.setIcon(new ImageIcon(getClass().getResource(path)));
      }
    j'ai un message d'eclipse qui dit pour getClass() :
    Cannot make a static reference to the non-static method getClass() from the type Object

    Si je ne mets pas la méthode static, je n'y accède pas par l'autre classe.

    Quelle est la méthode que je dois utiliser pour que cela fonctionne et que ce soit propre ?

    J'espère avoir réussi à exposer clairement mon problème.

    Merci par avance

    Raphael

  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
    Par défaut
    Euh... beurk ! Faut pas mettre le jLabel en statique ! C'est une très mauvaise idée.

    Ta méthode devrait ressembler à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public static void setPathImage(JLabel label, String path) {
        label.setIcon(new ImageIcon(MaClasse.class.getResource(path)));
    }

  3. #3
    Membre averti
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Décembre 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Décembre 2007
    Messages : 40
    Par défaut Merci
    Merci natha,
    je suis content d'avoir un avis sur le style de la programmation.

    Mais maintenant, j'ai du mal pour appeler méthode dans la deuxième classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MainFrame.setPathImage(jLabel, "/chemin/encours.gif");
    Comment déclarer "jLabel" puisqu'elle n'est pas static, et donc pas visible dans la deuxième classe ?

    Merci par avance

    Raphael

  4. #4
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Voici comment je procède et ma raison de faire ainsi : la classe qui dérive de Thread n'a pas à savoir qu'elle doit mettre à jour un JLabel, ou émettre un son, ou envoyer un mail ou démarrer la cafetière. Elle sait seulement qu'elle doit prévenir quelqu'un, peut importe ce que fait ce quelqu'un de l'info. Il faut simplement qu'elle appelle une méthode d'une classe pour mettre à jour une info.

    Je crée donc une interface (ex: PrevientMoi) qui contient une méthode (ex: nouvelleInfo) transmise au constructeur du Thread. Le Thread appelle la méthode "nouvelleInfo" lorsqu'il doit changer quelque chose. La classe qui contient le JLabel implémente "PrevientMoi".
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  5. #5
    Membre averti
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Décembre 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Décembre 2007
    Messages : 40
    Par défaut Merci
    Merci dinobogan,
    j'ai essayé ta méthode, et j'arrive un peu à la comprendre.
    Mais j'ai quand même un soucis.
    J'explique :

    J'ai donc créé l'interface ShareInfos

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public interface ShareInfos {
     
      public void setJPBValue(int val);
     
    }
    Ma frame principale implémente ShareInfos

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      public class MainFrame extends JFrame implements ShareInfos{
    ...
      public void setJPBValue(int val) {
        jProgressBar.setValue(val);
      }
    }
    J'ai ma classe qui effectue le long traitement ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public class DataMgnt extends Thread {
     
      public void run() {
    ...
      }
    Maintenant comment je peux accéder à setJPBValue dans DataMgnt ?
    J'ai essayé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      ShareInfos sh = new MainFrame();
      sh.setJPBValue(0);
    j'ai pas d'erreur mais cela ne fonctionne pas.
    J'ai du mal comprendre le fonctionnement car dans les tutoriels les classes qui implémentent une interface ne sont pas utilisées sur le même principe.

    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
     
    // une interface 
    public interface Istats{ 
      double moyenne(); 
      double écartType(); 
    }// 
     
    public class notesStats extends notes implements Istats {
    ...
    // méthodes de l'interface Istats 
      public double moyenne(){  
      // rend la moyenne des notes 
      return _moyenne; 
     }//moyenne 
     
      public double écartType(){ 
      // rend l'écart-type 
      return _écartType; 
      }//écartType
    ...
    }
     
    // classe de test 
    public class test{ 
      public static void main(String[] args){ 
      // qqs élèves & notes 
      élève[] ELEVES=new élève[] { new élève("paul",14),new élève("nicole",16), new élève("jacques",18)}; 
      // qu'on enregistre dans un objet notes 
      notes anglais=new notes("anglais",ELEVES); 
      // et qu'on affiche 
      System.out.println(""+anglais); 
      // idem avec moyenne et écart-type 
      anglais=new notesStats("anglais",ELEVES); 
      System.out.println(""+anglais); 
     }//main 
    }//classe
    Exemple de Serge Tahé

    Moi ma MainFrame implémente bien toutes les méthodes de mon interface ShareInfos, mais après comment je fais référence à ces méthode dans ma classe DataMgnt qui a été créée par ma MainFrame ? pfou c'est dur à dire...

    Merci par avance

    Raphael

    (ps : lorsque j'aurai compris, se sera un grand pas en avant pour moi...)

  6. #6
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Ton constructeur de Thread doit prendre en paramètre une interface :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class DataMgnt extends Thread
    {
      private ShareInfo share;
      public DataMgnt( ShareInfo share )
      {
        this.share = share;
      }
    ...
    Et ta classe appelante doit donner une interface à ton thread lors de sa construction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class MainFrame extends JFrame implements ShareInfos
    {
      void maMethodeOuJeConstruitMonThread()
      {
        DataMgnt mgnt = new DataMgnt( this );
        ....
      }
    }
    Ton Thread est donc complètement indépendant de ta classe appelante.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WPF] Problème d'accès à des éléments
    Par TWEESTY dans le forum C#
    Réponses: 2
    Dernier message: 19/12/2012, 07h20
  2. Réponses: 7
    Dernier message: 31/08/2012, 20h08
  3. Pb de rafraichissement des éléments dans un frame
    Par zuzuu dans le forum Tkinter
    Réponses: 4
    Dernier message: 08/08/2011, 15h35
  4. Accès aux éléments de différentes frames
    Par metalpetsFR dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 16/09/2009, 06h36
  5. problème d'accès a des éléments créés dynamiquement
    Par Pymm dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 21/07/2005, 17h13

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