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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    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 confirmé
    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
    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 éclairé Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    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 éclairé Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    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 confirmé
    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
    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 éclairé Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    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 :

+ 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