Accès rapide :
La vidéo
Mise en oeuvre d'un popup menu
L'exemple de code complet
Cette vidéo vous apprend à construire une barre d'outils pour votre application Swing.
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); |
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() ); } } } ); |
Et voici le résultat qui sera produit par l'exemple proposé ci-dessous.
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); } } |
Améliorations / Corrections
Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.
Emplacement :
Description des améliorations :