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 :

Classe interne, methode static et ajout de boutons


Sujet :

AWT/Swing Java

  1. #1
    Membre actif
    Inscrit en
    Janvier 2003
    Messages
    604
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 604
    Points : 247
    Points
    247
    Par défaut Classe interne, methode static et ajout de boutons
    Bonjour,
    J'ai envie de séparer un peu mes actionPerformed de ma classe
    principale, et pour ca j'ai lu qu'il était conseillé de passer par
    des classes internes.
    Seulement lorsque je veux lancer des methodes de la classe interne en faisant reference à la classe principale ca marche pas car elles sont
    de type non static, est ce que vous auriez une solution vu mon code ?

    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 class MonGraphique extends JPanel 
    {
    JPanel CePanel;
    MonGraphique()
    {
    JButton MonButton = new JButton("test");
    this.setLayout(new GridLayout(4, 3));  
    this.add(MonButton);
    MonButton.addActionListener(new UnListener() );
    }
     
     
    // classe interne du listener
     
    private class UnListener implements ActionListener
    {
          public  void actionPerformed(ActionEvent e) {
            MonGraphique.AfficheDesBoutons();
            MonGraphique.repaint();
          }
    protected void AfficheDesBoutons()
    {
    JButton MonButton = new JButton("cliqué");
    MonGraphique.add(MonButton);
    }
    }
    D'avance merci de vos réponses

  2. #2
    Membre actif Avatar de schneidb
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 236
    Points : 240
    Points
    240
    Par défaut
    Salut,

    par convention les noms de variables en java commencent tous par une minuscule

    Si tu veux accèder au bouton à partir de ton écouteur il faut déclarer
    JButton MonButton en attribut comme ton panel CePanel

    Créer une classe interne comme écouteur ce n'est pas forcément ce qu'il y a de mieux, cela dépend des besoins. Avoir deux classes distinctes c'est bien aussi.

  3. #3
    Membre actif
    Inscrit en
    Janvier 2003
    Messages
    604
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 604
    Points : 247
    Points
    247
    Par défaut
    J'ai fait la modif en passant le JPanel en attribut au constructeur, mais j'ai un NullPointerException sur leGraphique.add(monButton);
    Mon JPanel etant bien instancié je ne vois pas l'erreur que je commets.

    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
     
    private class UnListener implements ActionListener
    {
    JPanel leGraphique;
    UnListener(JPanel cePanel)
    {
    leGraphique=cePanel;
    }
     
     
    public  void actionPerformed(ActionEvent e) {
            AfficheDesBoutons();
             }
     protected void AfficheDesBoutons()
            {
          System.out.println("======================test1");
          JButton monButton = new JButton("cliqué");
           leGraphique.add(monButton);
           }
    }

  4. #4
    Membre actif Avatar de schneidb
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 236
    Points : 240
    Points
    240
    Par défaut
    Quand on utilise un object il faut le déclarer et l'instancier par un new JPanel par exemple ici.

    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
    public class MonGraphique extends JPanel
    {
    JButton monButton;
    public MonGraphique()
    {
    monButton = new JButton("test");
    this.setLayout(new GridLayout(4, 3)); 
    this.add(MonButton);
    monButton.addActionListener(new UnListener() );
    }
     
    // classe interne du listener
     
    private class UnListener implements ActionListener
    {
          public  void actionPerformed(ActionEvent e)
          {
            monButton.setText("clique!");
            // ou pour faire un écouteur qui modifie le text de n'importe quel boutton:
            Object o = e.getSource ();
            ((JButton)o).setText("clique!");
          }
    }

  5. #5
    Membre actif
    Inscrit en
    Janvier 2003
    Messages
    604
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 604
    Points : 247
    Points
    247
    Par défaut
    Merci de ta réponse mais, ca ne fait pas ce que je souhaite, car je voulais créer un nouveau JButton à chaque fois que je clique sur le bouton de ma classe MonGraphique. Cela marche tres bien si j'instancie mon bouton de cette maniére là depuis ma classe MonGraphique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    MonButton.addActionListener(new ActionListener() {
              public  void actionPerformed(ActionEvent e) {
                  JButton MonButton = new JButton("cliqué");
                this.add(MonButton);
    })
    Mais sans vouloir "enculer les mouches", je souhaitais déporter mon ActionListener pour avoir quelque chose de plus lisible.
    Mais ce n'est peut être pas possible....
    (NB mon JPanel lui est instancié par une classe JFrame au préalable)

  6. #6
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Pour ton code, si tu veux déplacer le listener dans une classe interne, tu peux remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.add(monButton);
    Par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaClasseExterne.this.add(monButton);
    Par exemple :
    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
    public class MonPanel extends JPanel {
     
      int nbButton;
      MonActionListener monActionListener;
     
      public MonPanel() {
        super(new FlowLayout());
        monActionListener = new MonActionListener();
     
        nbButton = 1;
        JButton b = new JButton("bouton " + nbButton++);
        b.addActionListener(monActionListener);
        add(b);
      }
     
      private class MonActionListener implements ActionListener {
     
        public void actionPerformed(ActionEvent e) {
          JButton b = new JButton("bouton " + nbButton++);
          b.addActionListener(this);
          MonPanel.this.add(b);
        }
      }
    }
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  7. #7
    Membre actif
    Inscrit en
    Janvier 2003
    Messages
    604
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 604
    Points : 247
    Points
    247
    Par défaut
    Merci ca marche bien. J'ai appri un truc. J'aurais pas pensé au
    ClasseExterne.this.... pour appeler depuis la classe Interne
    Bonne continuation

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

Discussions similaires

  1. Ajouter des boutons dans une classe ?
    Par djmahdouch dans le forum Composants graphiques
    Réponses: 2
    Dernier message: 28/01/2013, 18h14
  2. Intérêt du static dans une classe interne
    Par omar001 dans le forum Général Java
    Réponses: 5
    Dernier message: 22/02/2012, 14h52
  3. Classe abstraite et methode static de factory
    Par Troopers dans le forum Débuter
    Réponses: 11
    Dernier message: 28/07/2011, 09h40
  4. Réponses: 21
    Dernier message: 22/10/2007, 11h10
  5. Réponses: 13
    Dernier message: 15/11/2005, 16h47

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