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

avec Java Discussion :

Débuter avec les EventListener


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 157
    Par défaut Débuter avec les EventListener
    Bonsoir,

    Je bataille quelque peu sur les interfaces graphiques sous NetBeans 6.

    Mon souhait est de mieux maitriser tout ce qui touche aux évènements, aussi j'ai pris en main sans trop de difficulté les évènements liés à l'action d'un utilisateur sur l'interface (ActionEvent) étant donné que NetBeans se charge de presque tout générer.

    Par contre j'ai plus de difficultés à maitriser les évènements de émis par une classe et écoutés par l'interface. Je me suis donc référé à ce tutoriel, mais je ne parviens à faire fonctionner cela correctement sur mon exemple.

    Mon exemple se compose de deux classes, dont la structure est généré par NetBeans lorsque l'on créée une classe d'interface. En somme je dispose d'une classe principale et d'une UI.
    L'UI dispose de 2 boutons et de 1 label.
    Si on clic sur le premier bouton, j'affiche un message en ligne de commande.
    Si on clic sur le second bouton, je souhaite lancer des évènements qui vont modifier le texte du label.

    Voici donc ma classe principale qui va se charger d'afficher l'interface.
    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
    45
     
    /*
     * Essais_GUIApp.java
     */
     
    package essais_gui;
     
    import org.jdesktop.application.Application;
    import org.jdesktop.application.SingleFrameApplication;
     
    /**
     * The main class of the application.
     */
    public class Essais_GUIApp extends SingleFrameApplication {
     
        /**
         * At startup create and show the main frame of the application.
         */
        @Override protected void startup() {
            show(new Essais_GUIView(this));
        }
     
        /**
         * This method is to initialize the specified window by injecting resources.
         * Windows shown in our application come fully initialized from the GUI
         * builder, so this additional configuration is not needed.
         */
        @Override protected void configureWindow(java.awt.Window root) {
        }
     
        /**
         * A convenient static getter for the application instance.
         * @return the instance of Essais_GUIApp
         */
        public static Essais_GUIApp getApplication() {
            return Application.getInstance(Essais_GUIApp.class);
        }
     
        /**
         * Main method launching the application.
         */
        public static void main(String[] args) {
            launch(Essais_GUIApp.class, args);
        }
    }
    Et voici maintenant ma classe d'interface :
    (J'ai omis du code généré par NetBeans : initialisation de composants, etc.)
    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
     
    /*
     * Essais_GUIView.java
     */
     
    package essais_gui;
     
    import org.jdesktop.application.SingleFrameApplication;
    import org.jdesktop.application.FrameView;
     
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
    import java.util.EventListener;
    import javax.swing.event.EventListenerList;
     
    /**
     * The application's main frame.
     */
    public class Essais_GUIView extends FrameView 
    {
     
        public Essais_GUIView(SingleFrameApplication app) 
        {
            super(app);
            initComponents();
        }
     
        /** This method is called from within the constructor to
         * initialize the form.
         * WARNING: Do NOT modify this code. The content of this method is
         * always regenerated by the Form Editor.
         */
        private void initComponents() 
        {
            [...]
     
            bouton_1 = new javax.swing.JButton();
            bouton_1.setText(resourceMap.getString("bouton_1.text"));
            bouton_1.setName("bouton_1"); // NOI18N
            bouton_1.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    bouton_1_ActionPerformed(evt);
                }
            });
     
            bouton_2 = new javax.swing.JButton();
            bouton_2.setText(resourceMap.getString("bouton_2.text"));
            bouton_2.setName("bouton_2"); // NOI18N
            bouton_2.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    bouton_2_ActionPerformed(evt);
                }
            });
     
            mon_label = new javax.swing.JLabel();
            mon_label.setText(resourceMap.getString("mon_label.text"));
            mon_label.setName("mon_label"); 
     
            [...]
        }
     
        private void bouton_1_ActionPerformed(java.awt.event.ActionEvent evt) 
        {
            System.out.println("bouton cliqué");
        }
     
        // Un seul objet pour tous les types d'écouteurs
        private final EventListenerList listeners = new EventListenerList();
     
        public interface IndiceListener extends EventListener 
        {
            void IndiceChanged(int nouvelIndice);
        }
     
        public void addIndiceListener(IndiceListener listener) 
        {
            listeners.add(IndiceListener.class, listener);
        }
     
        public void removeIndiceListener(IndiceListener listener) 
        {
            listeners.remove(IndiceListener.class, listener);
        }
     
        public IndiceListener[] getIndiceListeners() {
            return listeners.getListeners(IndiceListener.class);
        }
     
        protected void fireIndiceChanged(int nouvelIndice) 
        {
            for(IndiceListener listener : getIndiceListeners()) 
            {
                listener.IndiceChanged(nouvelIndice);
            }
        }
     
        private void bouton_2_ActionPerformed(java.awt.event.ActionEvent evt) 
        {
            for(int i=1; i<=10; i++)
            {
               System.out.println("---> " + i);
               fireIndiceChanged(i);
     
               /*
               try 
               {
                   Thread.currentThread().sleep(1000);
               }
               catch (InterruptedException e) 
               {
                   e.printStackTrace();
               }
                */          
            }
    }
     
     
        // Variables declaration - do not modify
        [...]
    }
    Normalement un clic sur le second bouton déclenche ici une série de 10 évènements successifs. (J'ai bien mes println).

    Pourriez-vous, s'il vous plait, m'aider à ajuster ma gestion d'évènements pour que chaque émission de IndiceChanged écrive la nouvelle valeur de l'indice dans le label ? (private javax.swing.JLabel mon_label

    Dans le même ordre d'idée, le tutoriel recommande d'utiliser une classe abstraite appelée "adapter", qui implémente le listener et qui définit toutes ses méthodes avec un corps vide. Cela permettrait de lever des événements sans redéfinir toutes les méthodes, si une seule nous intéresse... Mais une fois encore je bloque un peu. Cela fonctionnera probablement mieux lorsque je maitriserai correctement mes Listeners

    Enfin, une fois que je maitriserai mieux cela je m'intéresserai aux problème de freeze de l'interface (ici ca freeze si je fais par exemple 10000 tours de boucle avec une pause de 1s. à chaque tour).

  2. #2
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Il faut juste que ton mon_label soit accessible depuis tes listeners.

    Soit tes listeners sont des sortes de classes internes à ton Essais_GUIView, et ils accèdent simplement en les désignant, soit il faut que tu passes la référence de ton Essais_GUIView, et que tu ouvres un accés, par exemple getMonLabel().

    Hum. Suis-je clair ? Suis-je compréhensible ?...

  3. #3
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 157
    Par défaut
    Bonsoir et merci pour cette réponse,

    "mon_label" est accessible à toute la classe, je l'ai déclaré en private.
    Mes événements semblent bien être émis lorsque je fais : "fireIndiceChanged(i);".

    En somme ce qu'il me manque c'est :
    - que "mon_label" écoute l'événement "IndiceChanged"
    - que, à réception de cet événement, le texte du label soit modifié

    J'ai du mal sur ce point là...

  4. #4
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Citation Envoyé par Nyphel Voir le message
    En somme ce qu'il me manque c'est :
    - que "mon_label" écoute l'événement "IndiceChanged"
    Il faut que tu crées une classe qui hérite de JLabel - mon_label est bien un JLabel ? - et dans la classe héritière tu remplies le contrat du listener :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class MonLabel extends JLabel implements IndiceListener
    {
     void IndiceChanged(int nouvelIndice)
     {
      ....
     }
    }
    ... et que tu enregistres cet écouteur auprès de ton gestionnaire d'indice.
    Citation Envoyé par Nyphel Voir le message
    - que, à réception de cet événement, le texte du label soit modifié
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     void IndiceChanged(int nouvelIndice)
     {
      setText("Le nouvel indice est " + nouvelIndice);
     }

  5. #5
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 157
    Par défaut
    D'accord, maintenant je comprends mieux.

    Merci beaucoup pour ces conseils !

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

Discussions similaires

  1. [Delphi 7] Questions pour débuter avec les bases de données
    Par DamKre dans le forum Bases de données
    Réponses: 6
    Dernier message: 25/09/2007, 16h06
  2. Débuter avec les sessions
    Par Leena666 dans le forum Langage
    Réponses: 3
    Dernier message: 24/04/2007, 10h40
  3. [BCB6] Débuter avec les sockets
    Par randa1 dans le forum C++Builder
    Réponses: 1
    Dernier message: 08/02/2007, 11h23
  4. [VB .Net][MDI]Débuter avec les MDI
    Par toto4650 dans le forum Windows Forms
    Réponses: 15
    Dernier message: 19/01/2006, 11h27

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