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 :

Déclaration d'une méthode dans une méthode


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Par défaut Déclaration d'une méthode dans une méthode
    Bonjour,

    Dans mon constructeur je déclare une méthode pour un ActionListener:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ActionListener actionListener = new ActionListener() {
       public void actionPerformed(ActionEvent actionEvent) {
          ma_fonction();
       }
    };
    bouton.addActionListener(actionListener);
    Mais dans ma_fonction, je souhaite utiliser des variable contenues dans mon constructeur. J'aimerais donc les passer en paramètres dans actionperformed mais je ne sais pas comment m'y prendre. Et impossible d'y accéder autrement.

    Comment faire?
    Merci

  2. #2
    Modérateur

    Avatar de Robin56
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juin 2009
    Messages
    5 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juin 2009
    Messages : 5 297
    Par défaut
    Citation Envoyé par Anduriel Voir le message
    Mais dans ma_fonction, je souhaite utiliser des variable contenues dans mon constructeur. J'aimerais donc les passer en paramètres dans actionperformed mais je ne sais pas comment m'y prendre. Et impossible d'y accéder autrement.

    Comment faire?
    Tu ne changeras pas la signature de 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
    17
    18
    19
    20
    21
    22
    public class Toto {
     
      private String toto;
      private Button bouton;
     
      public Toto(String nom) {
        this.toto = nom;
      }
     
      public void init() {
        ActionListener actionListener = new ActionListener() {
          public void actionPerformed(ActionEvent actionEvent) {
              ma_fonction(toto);
           }
        };
        bouton.addActionListener(actionListener);
      }
     
      private void ma_fonction(String param) {
        // ...
      }
    }
    Du coup, je ne vois pas où est le soucis ?
    Responsable Java de Developpez.com (Twitter et Facebook)
    Besoin d'un article/tutoriel/cours sur Java, consulter la page cours
    N'hésitez pas à consulter la FAQ Java et à poser vos questions sur les forums d'entraide Java
    --------
    Architecte Solution
    LinkedIn : https://www.linkedin.com/in/nicolascaudard/

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    281
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 281
    Par défaut
    Citation Envoyé par Robin56 Voir le message
    Tu ne changeras pas la signature de 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
    17
    18
    19
    20
    21
    22
    public class Toto {
     
      private String toto;
      private Button bouton;
     
      public Toto(String nom) {
        this.toto = nom;
      }
     
      public void init() {
        ActionListener actionListener = new ActionListener() {
          public void actionPerformed(ActionEvent actionEvent) {
              ma_fonction(toto);
           }
        };
        bouton.addActionListener(actionListener);
      }
     
      private void ma_fonction(String param) {
        // ...
      }
    }
    Du coup, je ne vois pas où est le soucis ?
    Sauf si toto est déclaré final, tu ne pourra pas faire cela il me semble.
    Je pense que tu devrais créer un classe implémentant ActionListener et dans le constructeur tu fais passer les arguments que tu veux.

  4. #4
    Modérateur

    Avatar de Robin56
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juin 2009
    Messages
    5 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juin 2009
    Messages : 5 297
    Par défaut
    Citation Envoyé par druzy Voir le message
    Sauf si toto est déclaré final, tu ne pourra pas faire cela il me semble.
    Non, pas dans le cas d'une variable de classe. Si j'avais fais la solution suivante, j'aurais du mettre final :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public void init() {
      final String toto = "toto"; // Ici
      ActionListener actionListener = new ActionListener() {
        public void actionPerformed(ActionEvent actionEvent) {
            ma_fonction(toto);
         }
      };
      bouton.addActionListener(actionListener);
    }
    Citation Envoyé par druzy Voir le message
    Je pense que tu devrais créer un classe implémentant ActionListener et dans le constructeur tu fais passer les arguments que tu veux.
    Cette solution est viable aussi. Quand le listener est peu complexe, ça ne me dérange pas de le déclarer directement comme je l'ai montré. Avec un listener réalisant des opérations plus complexe, la solution de druzy est plus propre.
    Responsable Java de Developpez.com (Twitter et Facebook)
    Besoin d'un article/tutoriel/cours sur Java, consulter la page cours
    N'hésitez pas à consulter la FAQ Java et à poser vos questions sur les forums d'entraide Java
    --------
    Architecte Solution
    LinkedIn : https://www.linkedin.com/in/nicolascaudard/

  5. #5
    Membre éprouvé
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Par défaut
    Je ne peux pas utiliser ActionListener car l'implémente déjà KeyListener (d'après ce que j'ai compris je ne peux en utiliser qu'un...).
    J'ai finalement essayé ta solution Robin56 et ça fonctionne.

    Par contre je ne comprends pas vraiment l'utilisation de final. J'ai lu qu'on indiquait ça lorsque la variable était immuable. Quand je fais

    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 MaClasse() {
     
       public final String toto;
     
       public MaClasse(String toto) {
         ActionListener actionListener = new ActionListener() {
           public void actionPerformed(ActionEvent actionEvent) {
               ma_fonction(toto);
            }
         };
         bouton.addActionListener(actionListener);
       }
    }
    ça plante:

    Cannot refer to a non-final variable console inside an inner class defined in a different method
    Mais si je fais:
    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 MaClasse() {
     
       public final String toto; // ou sans le final
     
       public MaClasse(final String toto) {
         ActionListener actionListener = new ActionListener() {
           public void actionPerformed(ActionEvent actionEvent) {
               ma_fonction(toto);
            }
         };
         bouton.addActionListener(actionListener);
       }
    }
    ça fonctionne!

    Je suis assez perdu... Pouvez vous m'expliquer ou mettre et quand ce final? Merci

  6. #6
    Membre chevronné Avatar de hariman
    Homme Profil pro
    Développeur Java, Android
    Inscrit en
    Janvier 2008
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations professionnelles :
    Activité : Développeur Java, Android
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2008
    Messages : 200
    Par défaut
    Bonjour,
    Citation Envoyé par Anduriel Voir le message
    Par contre je ne comprends pas vraiment l'utilisation de final. J'ai lu qu'on indiquait ça lorsque la variable était immuable. Quand je fais

    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 MaClasse() {
     
       public final String toto;
     
       public MaClasse(String toto) {
         ActionListener actionListener = new ActionListener() {
           public void actionPerformed(ActionEvent actionEvent) {
               ma_fonction(toto);
            }
         };
         bouton.addActionListener(actionListener);
       }
    }
    ça plante:
    Évidemment, ça plante car la variable toto envoyé comme paramètre à ma_fonction() se réfère à l'argument du constructeur MaClasse() et non pas au champ public final String toto. Donc, une autre solution est la suivante :
    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 MaClasse() {
     
       public final String toto;
     
       public MaClasse() {
         ActionListener actionListener = new ActionListener() {
           public void actionPerformed(ActionEvent actionEvent) {
               ma_fonction(toto);
            }
         };
         bouton.addActionListener(actionListener);
       }
    }

  7. #7
    Membre éprouvé
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Par défaut
    Enfin fait ce n'est pas résolu, me voila avec le même problème:

    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
    this.ins = 10; // par ex
    ActionListener tt = new ActionListener() {
       public void actionPerformed(ActionEvent evt) {
          System.out.println(ins);
          current_instruction--;
          int indice = ins - current_instruction;
          if (indice < 0) {
             Timer timer = (Timer)evt.getSource();
             timer.stop();								  
          } else {
             if (!op_annulee.contains(indice) && !op_annulee.contains(indice + 1))
                traitement();
          }
       }
    };
    new Timer(5, tt).start();
    Et la console m'affiche toujours 1 pour ins...

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

Discussions similaires

  1. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est cochée
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2009, 13h35
  2. portée d'une variable dans une fonction dans une méthode
    Par laurentg2003 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/06/2009, 19h05
  3. [POO] dans une classe, appeler une fonction dans une méthode
    Par arnaudperfect dans le forum Langage
    Réponses: 3
    Dernier message: 26/08/2007, 23h04
  4. Envoyer une formulaire dans une page dans une Frame
    Par zooffy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 29/06/2007, 10h13
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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