Utilisation d'un menu

     

alt : l'applet n'est pas visible par votre navigateur (dans le menu Outils, Modules complémentaires, activer le plugin Java(TM) Platform SE 6 U32 6.0.320.5 s'il est désactivé)

L'application de notre exemple correspond à l'applet vu ici ; pour que les raccourcis clavier fonctionnent, il faut quelquefois d'abord passer avec la souris sur l'applet (problème de focus). Le menu possède un sous-menu ; les items du sous-menu sont des boutons-radios. Un mnémonique (raccourci clavier) est associé à certains items de menus, ce qui signifie qu'on peut faire le choix à l'aide des touches correspondantes.

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Color;
import java.awt.BorderLayout;
import java.awt.event.ActionListener;
import java.awt.event.ItemListener;
import java.awt.event.ActionEvent;
import java.awt.event.ItemEvent;
import java.awt.event.KeyEvent;
import java.awt.event.InputEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.ButtonGroup;
import javax.swing.KeyStroke;


class Ardoise extends JPanel {
Ardoise() {
setPreferredSize(new Dimension(200, 200));
setBackground(Color.BLUE);
setForeground(Color.YELLOW);
}

public void paintComponent(Graphics g) {
int largeur = getWidth();
int hauteur = getHeight();

super.paintComponent(g);
g.fillOval(largeur/2 - 50, largeur/2 - 50, 100, 100);
}
}

// pour le menu déroulant
class MenuCouleur extends JMenu implements ActionListener, ItemListener {
Ardoise ardoise;
JMenuItem itemRouge = new JMenuItem("rouge");
JMenuItem itemJaune = new JMenuItem("jaune");
JMenuItem itemVert = new JMenuItem("vert", KeyEvent.VK_V);
JRadioButtonMenuItem fondBleu = new JRadioButtonMenuItem("fond bleu", true);
JRadioButtonMenuItem fondNoir = new JRadioButtonMenuItem("fond noir", false);

MenuCouleur(final Ardoise ardoise) {
setText("couleur");
this.ardoise = ardoise;
setMnemonic(KeyEvent.VK_C);
itemRouge.setMnemonic(KeyEvent.VK_R);
itemRouge.addActionListener(this);
add(itemRouge);

itemJaune.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_J, InputEvent.CTRL_DOWN_MASK));
itemJaune.addActionListener(this);
add(itemJaune);

itemVert.addActionListener(this);
add(itemVert);

addSeparator();
JMenu sousMenu = new JMenu("fond");

ButtonGroup groupe = new ButtonGroup();

groupe.add(fondBleu);
fondBleu.addItemListener(this);
sousMenu.add(fondBleu);

groupe.add(fondNoir);
fondNoir.addItemListener(this);
sousMenu.add(fondNoir);

add(sousMenu);
}

public void actionPerformed(ActionEvent evt) {
Object source = evt.getSource();
if (source == itemRouge) ardoise.setForeground(Color.RED);
else if (source == itemJaune) ardoise.setForeground(Color.YELLOW);
else if (source == itemVert) ardoise.setForeground(Color.GREEN);
}

public void itemStateChanged(ItemEvent evt) {
Object source = evt.getSource();
if (source == fondBleu) ardoise.setBackground(Color.BLUE);
else if (source == fondNoir) ardoise.setBackground(Color.BLACK);
}
}

class BarreMenu extends JMenuBar {
BarreMenu(Ardoise ardoise) {
add(new MenuCouleur(ardoise));
}
}
public class AvecMenu extends JFrame {
AvecMenu() {
Ardoise ardoise = new Ardoise();
JMenuBar barreMenu = new BarreMenu(ardoise);

setJMenuBar(barreMenu);
add(ardoise, BorderLayout.CENTER);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocation(100, 100);
pack();
setVisible(true);
}
}

class EssaiAvecMenu extends JFrame {
public static void main(String[] arg) {
new AvecMenu();
}
}

Vous pouvez voir :

  • le code de l'applet
  • le code de l'application décrite ici
    JMenuBar : la classe javax.swing.JMenuBar modélise une barre de menu.
    JMenu : la classe javax.swing.JMenu représente un menu déroulant.
    JMenuItem itemRouge = new JMenuItem("rouge"); : la classe javax.swing.JMenuItem modélise un item d'un menu déroulant. On construit un item pour un menu, qui aura pour nom "rouge".
    JRadioButtonMenuItem fondBleu = new JRadioButtonMenuItem("fond bleu", true); : la classe javax.swing.JRadioButtonMenuItem modélise un item d'un menu déroulant qui est un bouton-radio. Ici, le bouton fondBleu aura pour nom "fond bleu" et sera au départ sélectionné.
    setJMenuBar(barreMenu); : on ajoute la barre de menu "barreMenu" à la fenêtre.
    add(new MenuCouleur(ardoise)); : on ajoute le menu déroulant à la barre de menu.
    setMnemonic(KeyEvent.VK_C); : on associe au menu déroulant le mnémonique 'c' ; plus précisément, quand on puie sur la touche "Alt" en même temps que sur la lettre 'c' du clavier, le menu déroulant se déroule.
    itemRouge.setMnemonic(KeyEvent.VK_R); : on associe à l'itemRougele mnémonique 'r'. Précisément, si le menu déroulant est déroulé et que l'on appuie sur la touche 'r' du clavier, cela fera comme si on avait sélectionné l'item "rouge" dans le menu.
    JMenuItem itemVert = new JMenuItem("vert", KeyEvent.VK_V); : on construit itemVert en lui associant le mnémonique 'v'. Précisément, si le menu déroulant est déroulé et que l'on appuie sur la touche 'v' du clavier, cela fera comme si on avait sélectionné l'item "vert" dans le menu.
    itemJaune.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_J, InputEvent.CTRL_DOWN_MASK)); : cette instruction donne la possibilité, que le menu soit déroulé ou non, de sélectionner l'itemJaune en appuyant sur la touche contrôle en association avec la touche 'b'.
    addSeparator(); : une ligne de séparation est ajoutée à la fin du menuCouleuraprès les items "rouge", "jaune" et "vert" et avant le sous-menu "fond".

    ©Irène Charon, Télécom ParisTech 2011