Rechercher
 

Swing - Mise en oeuvre d'un menu contextuel

Mise en oeuvre d'une barre d'outils Utilisation d'actions pour vos éléments de menu



Accès rapide :
La vidéo
Mise en oeuvre d'un popup menu
L'exemple de code complet

La vidéo

Cette vidéo vous apprend à construire une barre d'outils pour votre application Swing.


Mise en oeuvre d'un menu contextuel

Mise en oeuvre d'un popup menu

Un popup menu (une instance de la classe javax.swing.JPopupMenu), aussi appelé menu contextuel, se comporte comme un JMenu. On utilise donc exactement les mêmes mécanismes pour construire ces éléments : on va notamment y ajouter des instances de JMenuItem. Voici un petit extrait de code permettant d'ajouter un élément de menu dans le menu contextuel.

 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
JPopupMenu popupMenu = new JPopupMenu();

JMenuItem mnuUndo = new JMenuItem( "Undo" );
mnuUndo.setIcon( new ImageIcon( "icons/undo.png" ) );
mnuUndo.setMnemonic( 'U' );
mnuUndo.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_Z, KeyEvent.CTRL_DOWN_MASK) );
mnuUndo.addActionListener( this::mnuUndoListener );
popupMenu.add(mnuUndo);
Constitution d'un popup menu

La ou réside la différence, c'est dans la manière d'afficher le menu. Dans le cas de la barre de menu, la chose est automatique : le simple fait de cliquer sur le label du menu produira son affichage. Par contre, pour un menu contextuel, il nous faudra rajouter quelques lignes de code pour détecter un clic avec le bouton droit de la souris sur un élément graphique de l'interface et lancer l'affichage du menu contextuel. Dans le cas de l'exemple proposé ci-dessous, le menu contextuel s'activera suite à un clic bouton-droit sur une instance de type javax.swing.JTextArea. Ce menu contextuel proposera des actions relatives à une édition de texte, bien entendu. Voici un exemple de code permettant d'afficher un menu contextuel.

 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
textArea.addMouseListener( new MouseAdapter() {
    @Override public void mousePressed( MouseEvent event ) {
        if ( event.isPopupTrigger() ) {
            System.out.println( "Show popup" );
            popupMenu.show( event.getComponent(), event.getX(), event.getY() );
        }
    }
} );
Affichage d'un popup menu

Et voici le résultat qui sera produit par l'exemple proposé ci-dessous.

Un menu contextuel (popup menu).

L'exemple de code complet

 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 
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextArea;
import javax.swing.JTree;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.plaf.nimbus.NimbusLookAndFeel;


public class PopupMenuSample extends JFrame {
    
    
    /* Construction de l'interface graphique */
    public PopupMenuSample() {
        super( "JPopupMenu sample" );
        this.setSize(600,400);
        this.setLocationRelativeTo( null );
        this.setDefaultCloseOperation( DISPOSE_ON_CLOSE );
        
        JPanel contentPane = (JPanel) getContentPane();
        
        // The content of the window
        JScrollPane leftScrollPane = new JScrollPane( new JTree() );
        leftScrollPane.setPreferredSize( new Dimension( 200, 0 ) );
        
        JTextArea textArea = new JTextArea();
        JScrollPane rightScrollPane = new JScrollPane( textArea );
        
        JSplitPane splitPane = new JSplitPane(
                JSplitPane.HORIZONTAL_SPLIT, leftScrollPane, rightScrollPane );
        contentPane.add( splitPane /*, BorderLayout.CENTER */ );        

        // Association d'un popup menu sur la zone d'édition de texte
        
        // Attention avant Java SE 8.0, il faut un final au début de la déclaration !!!
        JPopupMenu popupMenu = this.createPopupMenu();      
        textArea.addMouseListener( new MouseAdapter() {
            @Override public void mousePressed( MouseEvent event ) {
                if ( event.isPopupTrigger() ) {
                    System.out.println( "Show popup" );
                    popupMenu.show( event.getComponent(), event.getX(), event.getY() );
                }
            }
        } );
    }
    

    /* Methode de construction du menu contextuel */
    private JPopupMenu createPopupMenu() {
        JPopupMenu popupMenu = new JPopupMenu();
        
        JMenuItem mnuUndo = new JMenuItem( "Undo" );
        mnuUndo.setIcon( new ImageIcon( "icons/undo.png" ) );
        mnuUndo.setMnemonic( 'U' );
        mnuUndo.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_Z, KeyEvent.CTRL_DOWN_MASK) );
        mnuUndo.addActionListener( this::mnuUndoListener );
        popupMenu.add(mnuUndo);
        
        JMenuItem mnuRedo = new JMenuItem( "Redo" );
        mnuRedo.setIcon( new ImageIcon( "icons/redo.png" ) );
        mnuRedo.setMnemonic( 'R' );
        mnuRedo.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_U, KeyEvent.CTRL_DOWN_MASK) );
        popupMenu.add(mnuRedo);
        
        popupMenu.addSeparator();
        
        JMenuItem mnuCopy = new JMenuItem( "Copy" );
        mnuCopy.setIcon( new ImageIcon( "icons/copy.png" ) );
        mnuCopy.setMnemonic( 'C' );
        mnuCopy.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_C, KeyEvent.CTRL_DOWN_MASK) );
        popupMenu.add(mnuCopy);
        
        JMenuItem mnuCut = new JMenuItem( "Cut" );
        mnuCut.setIcon( new ImageIcon( "icons/cut.png" ) );
        mnuCut.setMnemonic( 't' );
        mnuCut.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_X, KeyEvent.CTRL_DOWN_MASK) );
        popupMenu.add(mnuCut);
        
        JMenuItem mnuPaste = new JMenuItem( "Paste" );
        mnuPaste.setIcon( new ImageIcon( "icons/paste.png" ) );
        mnuPaste.setMnemonic( 'P' );
        mnuPaste.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_V, KeyEvent.CTRL_DOWN_MASK) );
        popupMenu.add(mnuPaste);


        return popupMenu;
    }

    public void mnuUndoListener( ActionEvent event ) {
        JOptionPane.showMessageDialog( this, "Undo!" );
    }
   
    public static void main(String[] args) throws Exception {
        UIManager.setLookAndFeel( new NimbusLookAndFeel() );
        PopupMenuSample frame = new PopupMenuSample();
        frame.setVisible(true);
    }
}
Exemple de mise en oeuvre d'un menu contextuel (popup menu)


Mise en oeuvre d'une barre d'outils Utilisation d'actions pour vos éléments de menu