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 :

Transferer un evenement


Sujet :

AWT/Swing Java

  1. #1
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 117
    Par défaut Transferer un evenement
    Bonjour,

    J'ai crée une classe A dérivant de JPanel dans lequel j'insere un JRadioButton.
    J'insere ensuite cette classe A dans un autre classe B dérivant aussi de JPanel.
    J'aimerais récupérer l'action du click sur le JRadioButton dans la classe B...

    Merci.

  2. #2
    Membre Expert 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
    Par défaut
    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
    25
    public class A extends JPanel {
      JRadioButton radio;
     
      public A() {
        radio = new JRadioButton();
      }
     
      public JRadioButton getRadio() {
        return radio;  
      }
    }
     
    public class B extends JPanel implements ActionListener {
      A a;
     
      public B() {
        a = new A();
        add(a);
        a.getRadio().addActionListener(this);
      }
     
      public void actionPerformed(ActionEvent e) {
        ...
      }
    }

  3. #3
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 117
    Par défaut
    J'avais envisagé ce genre de réponse mais ce qui m'interesse c'est de pouvoir "propager" le(ou les) evenement(s).
    Soit: le jradio crée un evenement, la classe A l'intercepte et transfert (ou recrée) l'evenement pour que la classe B l'intercepte.

    C'est clair comme la seinoise...

  4. #4
    Membre chevronné Avatar de spekal
    Inscrit en
    Mai 2005
    Messages
    502
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 502
    Par défaut
    Il me semble que la réponse de herve91répond à ton besoin... L'événement irait du bouton vers A et B. Qu'est-ce qui ne te convient pas ? Il faut absolument une propagation de A vers B ? Pourquoi ?

  5. #5
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    J'ai fait un truc similaire (transférer le clic sur un panel qui sert de renderer d'onglet de tabbedpane vers le tabbedpane). Ce qui est important, c'est le dispatch :
    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
    /**
         * Renderer d'onglet fermable.
         * 
         * @author rom1v
         */
        class CloseableTabComponent extends JPanel {
     
            /** Pour la sérialisation. */
            private static final long serialVersionUID = 1L;
     
            /** Label pour le titre. */
            private JLabel label;
     
            /** Bouton de fermeture de l'onglet. */
            private IconButton close;
     
            /**
             * Crée un renderer d'onglet fermable.
             * 
             * @param title
             *            Titre de l'onglet.
             * @param icon
             *            Icône de l'onglet.
             * @param tip
             *            Tip de l'onglet.
             */
            CloseableTabComponent(String title, Icon icon, String tip) {
                super(new BorderLayout());
     
                setOpaque(false);
     
                /* Dispatcher des évènements souris sur le tableau à onglets. */
                MouseListener dispatcher = new MouseListener() {
     
                    public void mouseClicked(MouseEvent e) {
                        dispatch(e);
                    }
     
                    public void mouseEntered(MouseEvent e) {
                        dispatch(e);
                    }
     
                    public void mouseExited(MouseEvent e) {
                        dispatch(e);
                    }
     
                    public void mousePressed(MouseEvent e) {
                        if(!(e.getComponent() instanceof AbstractButton))
                            dispatch(e);
                    }
     
                    public void mouseReleased(MouseEvent e) {
                        dispatch(e);
                    }
                };
     
                label = new JLabel(title, icon, SwingConstants.CENTER);
                label.setToolTipText(tip);
                label.setOpaque(false);
                label.addMouseListener(dispatcher);
                add(label);
     
                JPanel east = new JPanel(new FlowLayout(FlowLayout.CENTER, 0, 0));
                east.add(Box.createHorizontalStrut(3));
                east.setOpaque(false);
                east.addMouseListener(dispatcher);
     
                Icon normalIcon = ImageUtilities.toIcon(ImageManager.getImageManager().getImage("close_off", 12, 12));
                Icon rolloverIcon = ImageUtilities.toIcon(ImageManager.getImageManager().getImage("close_on", 12, 12));
                close = new IconButton(normalIcon, rolloverIcon);
                close.setToolTipText("Ferme l'onglet");
     
                close.addActionListener(new ActionListener() {
     
                    public void actionPerformed(ActionEvent e) {
                        /* Cette méthode est toujours exécutée dans l'EDT, donc pas besoin de synchronisation. */
     
                        /* On récupère l'index du renderer d'onglet dans le tableau à onglets. */
                        int index = indexOfTabComponent(CloseableTabComponent.this);
                        assert index >= 0 && index < getTabCount() : "L'index doit être cohérent.";
     
                        /* On signale aux écouteurs que l'onglet va être fermé. */
                        fireTabClosing(index);
     
                        /* On supprime l'onglet à cet index. */
                        removeTab(index);
     
                        // /* On signale aux écouteurs que l'onglet a été fermé. */
                        // fireTabClosed(index);
                    }
                });
                close.addMouseListener(dispatcher);
     
                east.add(close);
     
                add(east, BorderLayout.EAST);
     
                addMouseListener(dispatcher);
            }
        }
     
        /**
         * Dispatche les évènements souris sur le tableau à onglets.
         * 
         * @param e
         *            Évènement souris déclenché.
         */
        private void dispatch(MouseEvent e) {
            MouseEvent event = SwingUtilities.convertMouseEvent(e.getComponent(), e, ExtendedTabbedPane.this);
            ExtendedTabbedPane.this.dispatchEvent(event);
        }

  6. #6
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 117
    Par défaut
    Merci pour vos réponses.


    spekal: Car je veux juste savoir qu'une action s'est produite.
    Imagine qu'il y ait plusieurs JRadio et que chacun alimente la meme variable à sa façon.
    Le but est donc de savoir qu'il y ait eu une action et de récuperer la variable.

    ®om: j'avais deja vu ton post, j'ai tésté ca fonctionne pas pour un ActionListener... j'ai peut être fais une mauvaise manip je vais retenter et laisser mon code si ca foire.

  7. #7
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par jeffciara
    Merci pour vos réponses.


    spekal: Car je veux juste savoir qu'une action s'est produite.
    Imagine qu'il y ait plusieurs JRadio et que chacun alimente la meme variable à sa façon.
    Le but est donc de savoir qu'il y ait eu une action et de récuperer la variable.

    ®om: j'avais deja vu ton post, j'ai tésté ca fonctionne pas pour un ActionListener... j'ai peut être fais une mauvaise manip je vais retenter et laisser mon code si ca foire.
    Ah j'avais pas vu que c'était pour ActionListener, dans ce cas la réponse de herve91 est très bien...
    De toute façon, il faut soit que tu reçoives l'évènement sur A et sur B, soit sur un des deux mais avec un moyen de communication entre A et B (=méthode)...

  8. #8
    Membre chevronné Avatar de spekal
    Inscrit en
    Mai 2005
    Messages
    502
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 502
    Par défaut
    Citation Envoyé par jeffciara
    spekal: Car je veux juste savoir qu'une action s'est produite.
    Imagine qu'il y ait plusieurs JRadio et que chacun alimente la meme variable à sa façon.
    Le but est donc de savoir qu'il y ait eu une action et de récuperer la variable.
    ? Je ne vois pas pourquoi j'imaginerais une chose pareille ? C'est toi qui écrit le code : tu peux écrire différents listeners de JRadio qui alimentent toutes les variables qu'ils veulent comme ils le veulent. Rien ne t'oblige à ce que le Listener utilisé par A soit le même que celui utilisé par B, même s'ils pourront être tous les deux enregistrés sur le même bouton.

  9. #9
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 117
    Par défaut
    Citation Envoyé par spekal
    Rien ne t'oblige à ce que le Listener utilisé par A soit le même que celui utilisé par B, même s'ils pourront être tous les deux enregistrés sur le même bouton.
    On est d'accord la dessus mais je vais mettre mon code pour être plus clair...

    Ma Classe A
    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
    public class ClasseA extends javax.swing.JPanel implements ActionListener{ 
        public Date dateInitial,dateFinal;
        JRadioButton jrbSemPrec,jrbPeriode;
        ButtonGroup buttonGroup1;
     
        public ClasseA() {
     
            buttonGroup1.add(jrbSemPrec);
            buttonGroup1.add(jrbPeriode);
     
            jrbSemPrec.addActionListener(this);
            jrbPeriode.addActionListener(this);
     
        }
        public void actionPerformed(ActionEvent e) {
     
     
            if (e.getSource() == jrbSemPrec)
            {
                dateInitial = uneDate;
                dateFinal = uneAutreDate;
            }                
     
            if (e.getSource() == jrbPeriode)
            {
                dateInitial = uneDate;
                dateFinal = uneAutreDate;
             }
    }
    Ma Classe B

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public class ClasseB extends javax.swing.JPanel implements ActionListener{
        public visualiserCommande() {
     
        }
     
        // ici j'aimerais récuperer l'action de la classe A
        public void actionPerformed(ActionEvent e) {
            // et la je recupere mes valeurs dateInitiale et date finale
     
        }

    Ce n'est evidement pas un code operationnel j'y ai inséré uniquement les grandes lignes...

  10. #10
    Membre éprouvé
    Inscrit en
    Juillet 2003
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Juillet 2003
    Messages : 79
    Par défaut
    ben et si tu mets ta classe B en actionListener de ta classe A ca ne marcherait pas?

  11. #11
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Il faut que A et B se connaissent, la manière simple de faire est de rendre A écoutable...
    (regarde dans la FAQ comment faire tes propres écouteurs)
    Comme ça tu fais maClasseA.addDateChangeListener(...)...
    Et quand tu changes la date dans la classe A, tu avertis les écouteurs...

  12. #12
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 117
    Par défaut
    ®om : oui je pense que c'est pas mal ça. Reste à capter l'exemple de la FAQ que j t'avouerais avoir vu mais pas trop capté justement


    ben et si tu mets ta classe B en actionListener de ta classe A ca ne marcherait pas?
    linkchaser : C'est bien logique mais malheuresement non cela ne marche pas...

  13. #13
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 117
    Par défaut
    Impec mec!

    Je viens de capter la FAQ, ca marche nickel !( c'est encore un peu les spaghetis dans ma tête)

    La reponse était dans la doc de l'API EventListenerList.

    Merci encore ®om a+...

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

Discussions similaires

  1. [VB6] Interception des évènement Copier/Couper/Coller
    Par youtch dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 18/10/2002, 17h09
  2. [VB6] Evenement validate
    Par grosjej dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 05/09/2002, 15h46
  3. Evenement Change
    Par PierDIDI dans le forum Composants VCL
    Réponses: 3
    Dernier message: 28/08/2002, 10h08
  4. develloppement avec ORBit: service d'evenement
    Par belmontv dans le forum CORBA
    Réponses: 3
    Dernier message: 06/06/2002, 22h56
  5. Generation d'evenements a une date precise
    Par pascalzzz dans le forum MFC
    Réponses: 2
    Dernier message: 04/06/2002, 15h21

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