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 :

Souci avec JPopupMenu et son fonctionnement


Sujet :

avec Java

  1. #1
    Membre régulier Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Points : 123
    Points
    123
    Par défaut Souci avec JPopupMenu et son fonctionnement
    Bonsoir,

    Je ne vais pas faire un dessin pour expliqué ce qui suit, l'image parlera d'elle même.

    J'ai une fenêtre dans lequel j'affiche des onglets, puis je fais apparitre une popup menu sur clic droit, sauf que:

    1) Si je clique ailleurs la popup reste (gros souci la dessus)
    2) Si je place la fenêtre au centre même en prenant sur le getX() et le getY() de l'evenement, je me retrouvé avec mes popup en haut à gauche

    Voici le bout de 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
    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
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
     
     
    import java.awt.event.MouseEvent;
    import javax.swing.JPopupMenu;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
    import javax.swing.SwingUtilities;
     
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
     
    /*
     * MainForm.java
     *
     * Created on 12 nov. 2010, 22:20:25
     */
     
    /**
     *
     * @author alexandre
     */
    public class MainForm extends javax.swing.JFrame {
     
        /** Creates new form MainForm */
        public MainForm() {
            initComponents();
            mouseListener();
        }
     
        /**
         * Ecouteur logiciel des évenements de la souris sur les composants
         */
        private void mouseListener() {
     
            //Enregistrement de l'écouteur
            jTabbedPane1.addMouseListener(
     
                //Classe écoureur
                new java.awt.event.MouseAdapter() {
     
                    //Si c'est le JTabbedPane qui est à l'origine de l'appel
                    @Override
     
                    //public void mouseClicked(MouseEvent evtM) {
                    public void mouseReleased(MouseEvent evtM) {
                        //On regarde si c'est le clic droit
                        if(SwingUtilities.isRightMouseButton(evtM)) {
     
                            String numTab = Integer.toString(jTabbedPane1.getSelectedIndex());
     
                            JPopupMenu popMenu = new JPopupMenu();
                                popMenu.add("fermer l'onglet " + numTab);
                                popMenu.show(null, evtM.getX(), evtM.getY());
                        }
                    }
                }
            );
        }
     
        /** 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.
         */
        @SuppressWarnings("unchecked")
        // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
        private void initComponents() {
     
            jTabbedPane1 = new javax.swing.JTabbedPane();
            jMenuBar1 = new javax.swing.JMenuBar();
            jMenu1 = new javax.swing.JMenu();
            jMenuItem3 = new javax.swing.JMenuItem();
            jMenuItem1 = new javax.swing.JMenuItem();
            jMenu2 = new javax.swing.JMenu();
            jMenuItem2 = new javax.swing.JMenuItem();
            jMenu3 = new javax.swing.JMenu();
     
            setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
     
            jMenu1.setText("File");
     
            jMenuItem3.setText("Open");
            jMenuItem3.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    jMenuItem3ActionPerformed(evt);
                }
            });
            jMenu1.add(jMenuItem3);
     
            jMenuItem1.setText("Save as");
            jMenuItem1.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    jMenuItem1ActionPerformed(evt);
                }
            });
            jMenu1.add(jMenuItem1);
     
            jMenuBar1.add(jMenu1);
     
            jMenu2.setText("Edit");
     
            jMenuItem2.setText("New report");
            jMenuItem2.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    jMenuItem2ActionPerformed(evt);
                }
            });
            jMenu2.add(jMenuItem2);
     
            jMenuBar1.add(jMenu2);
     
            jMenu3.setText("Option");
            jMenuBar1.add(jMenu3);
     
            setJMenuBar(jMenuBar1);
     
            javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
            getContentPane().setLayout(layout);
            layout.setHorizontalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addComponent(jTabbedPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 621, Short.MAX_VALUE)
            );
            layout.setVerticalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addComponent(jTabbedPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 277, Short.MAX_VALUE)
            );
     
            pack();
        }// </editor-fold>                        
     
        /**
         * Si on appuie sur le bouton créer un onglet
         * @param evt
         */
        private void jMenuItem2ActionPerformed(java.awt.event.ActionEvent evt) {                                           
            JTextArea text = new JTextArea();
            JScrollPane scroll = new JScrollPane(text);
     
            jTabbedPane1.addTab("Nouveau rapport", scroll);
        }                                          
     
        /**
         * Si on appuie sur le bouton enregistrer sous
         * @param evt
         */
        private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {                                           
            // TODO add your handling code here:
        }                                          
     
        /**
         * Si on appuie sur le bouton ouvrit un document
         * @param evt
         */
        private void jMenuItem3ActionPerformed(java.awt.event.ActionEvent evt) {                                           
            // TODO add your handling code here:
        }                                          
     
        /**
        * @param args the command line arguments
        */
        public static void main(String args[]) {
            java.awt.EventQueue.invokeLater(new Runnable() {
                public void run() {
                    new MainForm().setVisible(true);
                }
            });
        }
     
        // Variables declaration - do not modify                     
        private javax.swing.JMenu jMenu1;
        private javax.swing.JMenu jMenu2;
        private javax.swing.JMenu jMenu3;
        private javax.swing.JMenuBar jMenuBar1;
        private javax.swing.JMenuItem jMenuItem1;
        private javax.swing.JMenuItem jMenuItem2;
        private javax.swing.JMenuItem jMenuItem3;
        private javax.swing.JTabbedPane jTabbedPane1;
        // End of variables declaration                   
     
    }
    et ce qui se passe à l'écran


    J'ai beau regardé les docs et exemples, je ne voie pas trop ou est-ce que j'aurais pu faire une bêtise.

    Merci de votre aide.

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 35
    Points : 48
    Points
    48
    Par défaut
    A l'appel du show du menu il est nécessaire de donner l'"invoker"

    invoker the component in whose space the popup menu is to appear
    d'où

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    JPopupMenu popMenu = new JPopupMenu();
    popMenu.add("fermer l'onglet " + numTab);
    popMenu.show(jTabbedPane1, evtM.getX(), evtM.getY());
    et non
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    JPopupMenu popMenu = new JPopupMenu();
    popMenu.add("fermer l'onglet " + numTab);
    popMenu.show(null, evtM.getX(), evtM.getY());

  3. #3
    Membre régulier Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Points : 123
    Points
    123
    Par défaut
    Effectivement, je viens de comprendre.

    J'ai résolue les deux bugs avec
    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
     
    /**
         * Ecouteur logiciel des évenements de la souris sur les composants
         */
        private void mouseListener() {
     
     
            //Enregistrement de l'écouteur
            jTabbedPane1.addMouseListener(
     
                //Classe écoureur
                new java.awt.event.MouseAdapter() {
     
                    //Si c'est le JTabbedPane qui est à l'origine de l'appel
                    @Override
     
                    //public void mouseClicked(MouseEvent evtM) {
                    public void mousePressed(MouseEvent evtM) {
                        //On regarde si c'est le clic droit
                        if(evtM.isPopupTrigger()) {
                            String numTab = Integer.toString(jTabbedPane1.getSelectedIndex());
     
                            JPopupMenu popMenu = new JPopupMenu();
                                popMenu.add("fermer l'onglet " + numTab);
                                popMenu.show(evtM.getComponent(), evtM.getX(), evtM.getY());
                        }
                    }
                }
            );
        }
    Effectivement, un this aurais pu faire l'affaire mais il est considéré à la place du null comme une variable
    Alors qu'un evtM.getConponent() non.

    Tout fonctionne dorénavant

    Merci pour l'aide et bien sûr ça peut-être utile de le mettre dans la faq (surtout celle de netbeans car je crois que sur éclipse le this fonctionne)

    Merci

  4. #4
    Membre régulier Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Points : 123
    Points
    123
    Par défaut
    Re bonsoir,

    Je reviens à la charge n'ayant pas trouvé de réponses satisfaisante à un nouveau problème ayant attrait à la suite de ce qui a été résolu ci-dessus.

    J'arrive maintenant à afficher une popup menu avec un bouton qui permet de fermer un tab. Mon souci maintenant est que je n'arrive pas à capturer l'action sur le bouton générer par le code afin de faire un simple println("hello world");

    Le but est simple, si j'ai mon bouton dans ma popup, c'est pour m'en servir. Afin de valider que j'ai bien appuyer sur ce bouton, j'affiche un println. Il me restera alors à regardé quel est l'index et le fermer.

    Comment implémenter une actionPerformed sur un bouton dans une popup menu qui elle même est généré par le code ?

    Merci pour vos réponses

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 35
    Points : 48
    Points
    48
    Par défaut
    Je crérais une classe interne de ce genre personnellement
    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
        /**
         * Ecouteur logiciel des évenements de la souris sur les composants
         */
        private void mouseListener() {
     
            //Enregistrement de l'écouteur
            jTabbedPane1.addMouseListener(
     
                //Classe écoureur
                new java.awt.event.MouseAdapter() {
     
                    //Si c'est le JTabbedPane qui est à l'origine de l'appel
                    @Override
     
                    //public void mouseClicked(MouseEvent evtM) {
                    public void mouseReleased(MouseEvent evtM) {
                        //On regarde si c'est le clic droit
                        if(SwingUtilities.isRightMouseButton(evtM)) {
                                int numTab = jTabbedPane1.getSelectedIndex();
                                if (numTab != -1) {
                                    JPopupMenu popMenu = new JPopupMenu();
                                    popMenu.add(new MyAction(numTab));
                                    popMenu.show(evtM.getComponent(), evtM.getX(), evtM.getY());
                                }
     
                        }
                    }
                }
            );
        }
        private class MyAction extends AbstractAction {
            private int index;
     
            private MyAction( int index) {
                super("fermer l'onglet "+index);
                this.index = index;
            }
     
            public void actionPerformed(ActionEvent e) {
                //traitement
                System.out.println("WOUHOU FERMETURE DE L'ONGLET " + index);
            }
        }

  6. #6
    Membre régulier Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Points : 123
    Points
    123
    Par défaut
    Effectivement ça fonctionne

    A un détail prêt !

    J'ai remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public void mouseReleased(MouseEvent evtM) {
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public void mousePressed(MouseEvent evtM) {
    Maintenant je n'ai plus qu'à cherché la suite.

    P.S pourrait-on me donné quelques commentaires (que je comprenne qui fait quoi).

    Merci :

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 35
    Points : 48
    Points
    48
    Par défaut
    il me semble qu'il vaut mieux utiliser mouseEvent.isPopupTrigger() pour tester si c'est bien un menu contextuel (clic droit). et d'après la javadoc, pour etre cross plateforme faut appeler le code dans mousePressed et mouseReleased, après je ne saurais pas expliquer exactement quand ces méthodes sont appelées suivant les plateformes

    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
    /**
         * Returns whether or not this mouse event is the popup menu
         * trigger event for the platform.
         * <p><b>Note</b>: Popup menus are triggered differently
         * on different systems. Therefore, <code>isPopupTrigger</code>
         * should be checked in both <code>mousePressed</code>
         * and <code>mouseReleased</code>
         * for proper cross-platform functionality.
         *
         * @return boolean, true if this event is the popup menu trigger
         *         for this platform
         */    
        public boolean isPopupTrigger() {
            ...
        }

  8. #8
    Membre régulier Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Points : 123
    Points
    123
    Par défaut
    Je viens de tester et effectivement ça fonctionne pas trop mal

    Comme j'ai dit plus haut, il ne me reste que la compréhension du code et aussi la fermeture du tab, je vais voir comment ça se gère réelement.

    Merci

  9. #9
    Membre régulier Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Points : 123
    Points
    123
    Par défaut
    Bonjour,

    Je reprends mes investigations ce matin

    J'ai essayer d'ajouter un séparateur et un bouton de pls à mon popup menu, mais j'ai bien peur de devoir faire une classe à chaque bouton

    E-ce la bonne méthode ou alors on peut rectifier pour que la l'on ai une seule classe qui gère ça ?

    Voici mon code de départ:
    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
     
    /**
         * Ecouteur logiciel des évenements de la souris sur les composants
         */
        private void mouseListener() {
     
     
            //Enregistrement de l'écouteur
            jTabbedPane1.addMouseListener(
     
                //Classe écouteur
                new java.awt.event.MouseAdapter() {
     
                    //Si c'est le JTabbedPane qui est à l'origine de l'appel
                    @Override
     
                    public void mousePressed(MouseEvent evtM) {
                    //public void mouseReleased(MouseEvent evtM) {
     
                        //On regarde si c'est le clic droit
                        if(SwingUtilities.isRightMouseButton(evtM)) {
     
                            int numTab = jTabbedPane1.getSelectedIndex();
     
                            if (numTab != -1) {
     
                                JPopupMenu popMenu = new JPopupMenu();
     
                                    popMenu.add(new MyAction(numTab));
                                    popMenu.show(evtM.getComponent(), evtM.getX(), evtM.getY());
                            }
     
                            //String numTab = Integer.toString(jTabbedPane1.getSelectedIndex());
     
                            //JPopupMenu popMenu = new JPopupMenu();
                                //popMenu.add("fermer l'onglet " + numTab);
                                //popMenu.show(evtM.getComponent(), evtM.getX(), evtM.getY());
                        }
                    }
                }
            );
        }
     
     
        private class MyAction extends AbstractAction {
     
            private int index;
     
            private MyAction ( int index ) {
                super("Fermer l'onglet" + index);
                this.index = index;
            }
     
            public void actionPerformed(ActionEvent e) {
                System.out.println("Fermeture de l'onglet " + index);
            }
        }
    Sinon je fais un MyAction1, MyAction2... le tout est que je sache si c'est la bonne méthode ou si ça peut se simplifier en un appel vers une classe qui compose le menu et qui traite directement avec un écouteur.

    Dans l'esprit je voyais plus un truc comme ça:
    Init -> Si clic droit -> Popup menu (saute sur la classe PopPerso)

    PopPerso -> Crée le menu et affiche (attends une action de l'utilisateur ActionPerformed + (si choix 1 faire ça, si choix 2 faire ça, ... si choix X faire X))
    J'aimerais un coup de main la dessus afin de rendre mon code plus pratique

    Merci

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

Discussions similaires

  1. Soucis de touche FN+Son (avec casque)
    Par zikyoubi dans le forum Windows
    Réponses: 1
    Dernier message: 05/10/2014, 09h24
  2. Réponses: 0
    Dernier message: 13/05/2009, 12h05
  3. Soucis avec un raid 1 qui fonctionne bizarrement !
    Par satyre dans le forum Matériel
    Réponses: 0
    Dernier message: 05/01/2008, 15h30
  4. Réponses: 2
    Dernier message: 22/09/2006, 17h40
  5. Réponses: 4
    Dernier message: 16/02/2003, 12h16

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