IHM7
IHM7
IHM7
Chapitre 7 :
Les Menus
SMI - S6
Année universitaire 2018-2019
Prof. M.D. RAHMANI
mrahmani@fsr.ac.ma
Plan
Hiérarchie des composants pour les menus,
Les composants d'un menu:
JMenuBar
JMenu
Eléments d'un menu:
JMenuItem
JRadioButtonMenuItem
JCheckButtonMenuItem
Menu surgissant JPopupMenu
Création d'un menu
Positionnement de menus
Imbrication des composants
Les raccourcis du clavier
Construction d'un menu avec écouteurs
Menu surgissant
Prof M.D. RAHMANI Interface Homme-Machine SMI - S6 Année 2018-2019 2
1
Les menus (1)
Les menus peuvent être crées de 2 manières :
2
Les différentes classes d'un Menu
Les menus sont mis en œuvre avec un ensemble de classes:
JMenuBar: Une barre de menus contenant des composants JMenu,
JMenu: Un menu déroulant ou un sous-menu représenté par une étiquette (titre),
JMenuItem: Un élément (option) d'un menu ou d'un sous-menu,
JRadioButtonMenuItem: Un élément d'un menu sous la forme d'un bouton radio,
JCheckBoxMenuItem: Un élément d'un menu sous la forme d'une case à cocher,
JSeparator, Un élément d'un menu sous la forme d'un séparateur de groupes
d'éléments,
JPopupMenu, Un menu contextuel (surgissant),
Component
Container
JComponent MenuShortcut
JMenuItem
3
Les composants d'un Menu (1)
1- La classe JMenuBar:
La construction de menus commence par la création d'une barre de menu
JMenuBar,
JMenuBar barre = new JMenuBar(); // création de la barre de menu
Pour ajouter des menus dans une barre de menu, on utilise la méthode add(),
barre.add(unMenu); // ajout d'un menu à la barre de menu
4
Les composants d'un Menu (3)
3- Eléments de menu : items (options) d'un menu ou d'un sous menu.
Il y a trois sortes d'éléments de menu :
bg.add(rb1);
bg.add(rb2);
bg.add(rb3);
menu.add(rb1); // ajout de l'item jrb1 à un menu
5
Les composants d'un Menu (5)
4- La classe JPopupMenu
Un menu surgissant se construit comme un menu, mais qui n'est pas rattaché à une barre
de menus mais à un composant.
Pour afficher un menu surgissant, il faut ajouter un écouteur d'événements et utiliser la
méthode show() de la classe JPopupMenu pour l'affichage.
JPopupMenu popup = new JPopupMenu();
JMenuItem item = new JMenuItem("un item surgissant"); // 1er élément
popup.add(item);
6
Création d'un menu (2)
Exemple 1 (1ère version): MenuEditeur1.java
import javax.swing.*;
public class MenuEditeur1 extends JMenuBar {
JMenuItem nouveau, ouvrir, quitter, aPropos;
public MenuEditeur1() {
JMenu menuFichier = new JMenu("Fichier"); // création des éléments du menu
nouveau = new JMenuItem("Nouveau");
ouvrir = new JMenuItem("Ouvrir");
quitter = new JMenuItem("Quitter");
// ajout des éléments JMenuItem dans un JMenu
menuFichier.add(nouveau);
menuFichier.add(ouvrir);
menuFichier.addSeparator(); // pour séparer
menuFichier.add(quitter);
JMenu menuAide = new JMenu("Aide");
aPropos = new JMenuItem("A propos");
menuAide.add(aPropos);
// ajout des objets JMenu dans la barre de menus
add(menuFichier);
add(menuAide);
}
}
Prof M.D. RAHMANI Interface Homme-Machine SMI - S6 Année 2018-2019 13
7
Création d'un menu (4)
Exemple 1 (2ème version): MenuEditeur2.java
public class MenuEditeur2 extends JFrame {
public MenuEditeur2() {
JMenu menuFichier = new JMenu("Fichier"); // création des éléments du menu
JMenuItem nouveau = new JMenuItem("Nouveau");
JMenuItem ouvrir = new JMenuItem("Ouvrir");
JMenuItem quitter = new JMenuItem("Quitter");
menuFichier.add(nouveau); // ajout des éléments JMenuItem dans un JMenu
menuFichier.add(ouvrir);
menuFichier.addSeparator(); // pour séparer
menuFichier.add(quitter);
JMenu menuAide = new JMenu("Aide");
JMenuItem aPropos = new JMenuItem("A propos");
menuAide.add(aPropos);
// création de la barre de menu et ajout des objets JMenu
JMenuBar bar = new JMenuBar();
bar.add(menuFichier);
bar.add(menuAide);
setTitle("Fenêtre avec menu"); setSize(400,200);
setDefaultCloseOperation(3);
setJMenuBar(bar);
setVisible(true);
}
public static void main(String[] args) {
new MenuEditeur2();
}
}
Prof M.D. RAHMANI Interface Homme-Machine SMI - S6 Année 2018-2019 15
8
Positionnement de menus (2)
Exemple 2 (suite): FenetreAvec2Menus.java
import javax.swing.*;
public class FenetreAvec2Menus extends JFrame {
public FenetreAvec2Menus(){
setTitle("Fenêtre avec 2 menus");
setSize(400,200);
add(new MenuEditeur(), BorderLayout.NORTH);
add(new MenuEditeur(), BorderLayout.SOUTH);
setDefaultCloseOperation(3);
setVisible(true);
}
menuFichier.add(nouveau);
menuFichier.add(ouvrir);
menuFichier.addSeparator();
menuFichier.add(quitter);
9
Imbrication de menus (2)
Exemple 3 (suite) : MenuEditeurP.java
JMenu divers = new JMenu("Divers");
JMenu sousMenu1 = new JMenu("Sous menu 1"); // prêt à recevoir des sous menus
divers.add(sousMenu1);
JMenu sousMenu2 = new JMenu("Sous menu 2"); // prêt à recevoir des sous menus
divers.add(sousMenu2);
JMenu sousMenu11 = new JMenu("Sous Menu 11"); // prêt à recevoir des sous menus
sousMenu1.add(sousMenu11);
JMenuItem cas11 = new JMenuItem("Cas 11");
sousMenu11.add(cas11);
add(menuFichier);
add(menuAide);
add(divers);
}
}
10
Imbrication des composants (1)
Exemple 4: ajout d'une barre d'outil à l'éditeur BarreOutils.java
import java.awt.*;
import javax.swing.*;
public class BarreOutils extends JPanel {
public BarreOutils(){
String[] etiquetteCouleurs = {"Bleu", "Rouge", "Jaune", "Vert"};
this.setBackground(Color.lightGray);
JComboBox listeCouleurs = new JComboBox(); // liste déroulante
for (int i=0; i<etiquetteCouleurs.length; i++)
listeCouleurs.addItem(etiquetteCouleurs[i]);
// l'ajout de la barre d'outils
this.add(listeCouleurs);
this.add(new JButton("Sauvegarder"));
this.add(new JButton("Tout effacer"));
this.add(new JButton("Quitter"));
}
}
11
Les raccourcis clavier (1)
Les éléments de menus peuvent être associés à 2 types de raccourcis claviers:
Les mnémoniques : ils apparaissent sous la forme d'une lettre soulignée,
ils sont utilisables en combinaison avec la touche Alt.
Les mnémoniques concernent les menus et les éléments de menus
JMenuItem mi = new JMenuItem();
mi.setMnemonic(KeyEvent.VK_I); // affectation du raccourci alt+I
ou JMenuItem mi = new JMenuItem("Item",'I'); // valable uniquement pour un item
12
Les raccourcis clavier (3)
o Un accélérateur est une combinaison de touches qu'on associe à un
élément de menu (pas à un menu) et qui s'affiche à droite de son nom.
• Même si le menu n'est pas affiché, l'appui sur la combinaison des
touches de l'accélérateur provoque la sélection de l'élément
correspondant.
• Pour associer un accélérateur à un élément de menu, on utilise la
méthode setAccelerator de la classe JMenuItem, à laquelle on
fournit, en argument, la combinaison de touches voulue.
Pour cela, on utilise la méthode getKeyStroke de la classe
KeyStroke (touche du clavier) comme suit:
KeyStroke.getKeyStroke(KeyEvent.VK_I, // touche I
InputEvent.CTRL_MASK); // + touche CTRL
ou KeyStroke.getKeyStroke('I') // touche I, cette forme respecte la casse
Association de la combinaison CTRL+I à un élément item1 :
JMenuItem item1 = new JMenuItem("Item1");
item1.setAcclerator(KeyStroke.getKeyStroke(KeyEvent.VK_I,
InputEvent.CTRL_MASK));
Prof M.D. RAHMANI Interface Homme-Machine SMI - S6 Année 2018-2019 25
13
Les raccourcis clavier (5)
Exemple 5 (suite) : menu avec mnémoniques et accélérateurs,
Remarque: On peut utiliser pour les touches de commande les 2 formes suivantes,
KeyEvent.CTRL_MASK ou InputEvent.CTRL_MASK
14
Les raccourcis clavier (7)
Exemple 5bis : accélérateur avec 2 touches de commande,
public class MenuAvecRaccourcis2 extends JFrame implements ActionListener {
JMenuItem rouge;
public MenuAvecRaccourcis2() {
setTitle("Un menu avec raccourcis");
setSize(350, 100);
JMenuBar barreMenus = new JMenuBar();
setJMenuBar(barreMenus);
JMenu couleur = new JMenu("Couleur"); couleur.setMnemonic('C');
barreMenus.add(couleur);
rouge = new JMenuItem("Rouge"); rouge.setMnemonic('R');
rouge.setAccelerator(
KeyStroke.getKeyStroke(KeyEvent.VK_R, InputEvent.CTRL_MASK +
InputEvent.SHIFT_MASK )); // Ctrl + Maj + R
couleur.add(rouge);
rouge.addActionListener(this);
}
public void actionPerformed(ActionEvent ev) {
if(ev.getSource()==rouge) System.out.println("Action option rouge");
}
public static void main(String[] args) {
MenuAvecRaccourcis2 mr = new MenuAvecRaccourcis2();
mr.setDefaultCloseOperation(3); mr.setVisible(true);
}
}
Prof M.D. RAHMANI Interface Homme-Machine SMI - S6 Année 2018-2019 29
15
Ajout d'une icone (2)
Exemple 6 : Ajout d'icônes,
class MenuAvecIcones extends JFrame{
public MenuAvecIcones() {
setTitle ("Editeur avec icônes"); setSize (300, 150); setVisible(true);
JMenuBar barreMenus = new JMenuBar() ; /* création barre des menus */
setJMenuBar(barreMenus) ;
JMenu edition = new JMenu ("Edition") ;
barreMenus.add(edition) ;
/* création, ajout des items et lien avec écouteurs */
edition.add(new JMenuItem("Copier", new
ImageIcon("copier.gif"))).addActionListener (new ActionListener(){
public void actionPerformed(ActionEvent ev) {
edition.copy();
}
});
edition.add(new JMenuItem("Couper", new
ImageIcon("coller.gif"))).addActionListener (new ActionListener(){
public void actionPerformed(ActionEvent ev) {
edition.paste();
}
});
}
public static void main (String args[]) {
MenuAvecIcones f = new MenuAvecIcones();
f.setVisible(true);
}
}
Prof M.D. RAHMANI Interface Homme-Machine SMI - S6 Année 2018-2019 31
16
Construction d'un menu avec écouteurs (2)
Exemple 7 (suite) :
/* création du menu Formes et ses cases a cocher Rectangle et Ovale */
formes = new JMenu ("Formes") ;
barreMenus.add(formes) ;
rectangle = new JCheckBoxMenuItem ("Rectangle") ;
formes.add(rectangle) ;
rectangle.addActionListener (this) ;
rectangle.addItemListener (this) ;
ovale = new JCheckBoxMenuItem ("Ovale") ;
formes.add(ovale) ;
ovale.addActionListener (this) ;
ovale.addItemListener (this) ;
}
public void actionPerformed (ActionEvent ev ) { // boutons radios
Object source = ev.getSource() ;
if (source == rouge) System.out.println ("** Action option rouge") ;
if (source == vert) System.out.println ("** Action option vert") ;
if (source == rectangle) System.out.println ("** Action option rectangle") ;
if (source == ovale) System.out.println ("** Action option ovale") ;
}
17
Construction d'un menu avec écouteurs (4)
Remarques:
Les menus (JMenu) génèrent des événements de type MenuEvent lors de leur
affichage ou de leur disparition.
L'écouteur associé est ajouté par addMenuListener().
L'interface d'écoute à implémenter MenuListener est contenu dans le paquetage
javax.swing.event contient 3 méthodes (pas d'adaptateurs !):
menuSelected()
menuDeselected()
menuCanceled()
18
Forme condensée de construction d'un menu (2)
Exemple 8 : Ecriture condensée, création, ajout d'un item et d'un écouteur
class MenuAvecEcouteurs2 extends JFrame{
public MenuAvecEcouteurs2() {
setTitle ("Editeur avec ecouteurs"); setSize (300, 150); setVisible(true);
JMenuBar barreMenus = new JMenuBar() ; /* création barre des menus */
setJMenuBar(barreMenus) ;
JMenu fichier = new JMenu ("Fichier") ;
barreMenus.add(fichier) ;
/* création, ajout des items et lien avec écouteurs */
fichier.add("Ouvrir").addActionListener (new ActionListener(){
public void actionPerformed(ActionEvent ev) {
System.out.println("** Iem Ouvrir **");
}
});
fichier.add("Quitter").addActionListener (new ActionListener(){
public void actionPerformed(ActionEvent ev) {
System.out.println("** Iem Quitter **");
}
});
}
public static void main (String args[]) {
MenuAvecEcouteurs2 f = new MenuAvecEcouteurs2();
f.setVisible(true);
}
} Prof M.D. RAHMANI Interface Homme-Machine SMI - S6 Année 2018-2019 37
Exemple :
JPopupMenu menuS = new JPopupMenu(); // création d'un objet menu surgissant
JMenuItem haut = new JMenuItem("Haut"); // création d'un élément Haut
menuS.add(haut); // ajout au menu surgissant
JMenuItem bas = new JMenuItem("Bas"); // création d'un élément Bas
menuS.add(bas); // ajout au menu surgissant
19
Construction d'un menu surgissant (2)
Remarques :
On peut utiliser des cases à cocher ou des boutons radio comme éléments d'un menu
surgissant,
Contrairement à un menu usuel qui est affiché en permanence, un menu surgissant doit
être affiché explicitement par le programme en utilisant la méthode show de la classe
JPopupMenu, avec comme arguments, le composant parent et les coordonnées de la
position du menu.
Exemple : menuS.show(ev.getComponent(), ev.getX(), ev.getY());
Le menu reste affiché jusqu'à ce que l'utilisateur sélectionne un élément ou en cliquant à
côté.
La classe MouseEvent dispose d'une méthode isPopupTrigger qui fournit la
valeur true si le bouton droit de la souris est concerné. Cette méthode est utilisable
dans mouReleased
Exemple :
public void mouseReleased(MouseEvent ev) {
if(ev.isPopupTrigger())
menuS.show(ev.getComponent(), ev.getX(), ev.getY());
}
Prof M.D. RAHMANI Interface Homme-Machine SMI - S6 Année 2018-2019 39
20
Construction d'un menu surgissant (4)
Exemple 10: Ajout de raccourcis
public class MenuSurgissant2 extends JFrame {
public MenuSurgissant2() {
setTitle("Menu Surgissant"); setDefaultCloseOperation(3);
setSize(300,150); setVisible(true);
// créatiion du menu surgissant couleur et ses options rouge et vert
JPopupMenu couleur = new JPopupMenu();
JMenuItem rouge = new JMenuItem("Rouge"); rouge.setMnemonic('R'); // Alt+r
rouge.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R,InputEvent.CTRL_MASK));
couleur.add(rouge);
JMenuItem vert = new JMenuItem("Vert"); vert.setMnemonic('V'); // Alt+v
vert.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V,
KeyEvent.CTRL_MASK + KeyEvent.SHIFT_MASK)); // Ctrl+Maj+v
couleur.add(vert);
addMouseListener(new MouseAdapter() {
public void mouseReleased(MouseEvent ev) {
if (ev.isPopupTrigger())
couleur.show(ev.getComponent(),ev.getX(),ev.getY());
System.out.println("Position x= "+ev.getX()+" y= "+ev.getY());
}
});
}
public static void main(String[] args) {
new MenuSurgissant2();
}
}
Prof M.D. RAHMANI Interface Homme-Machine SMI - S6 Année 2018-2019 41
21
Construction d'un menu surgissant (6)
Exemple 11: Ajout d'écouteurs d'événements
22