ABCSITE

INFORMATIQUE

 
 
 

 
 

 Java 

Création d'une barre de menu

Nous allons au cours de ce chapitre étudier la mise en oeuvre de barre de menu avec l'AWT. Comme vous allez le voir, les choses sont très simple : le principal tient dans trois classes du package java.awt. Ces classes sont MenuBar, Menu et MenuItem qui permettent respectivement de définir une barre de menu, un menu déroulant et enfin un élément de menu déroulant.

Il faut aussi savoir une petite chose : avec l'AWT, on ne place pas une barre de menu n'importe où. Seul une fenêtre (objet de la classe Frame) peut recevoir une barre de menu et l'utiliser. Il est donc inutile de chercher à positionner une barre de menu sur une applet : attention, dans les exemples suivants (pour que vous puissiez directement tester les choses), je vous fournit une applet chargée de créer une nouvelle fenêtre. C'est cette dernière fenêtre qui contiendra la barre de menu (pas directement l'applet). De même, ne cherchez pas à placer une barre de menu dans une boîte de dialogue : cela n'est pas prévu.

Anatomie d'une barre de menu simple

Pour créer une barre de menu simple, il vous faut donc définir des objets sur au moins trois classes : MenuBar, Menu et MenuItem. Comment ces objets sont ils liés les uns aux autres ?

Mise en place de la barre de menu

Pour créer une barre de menu, il faut vous faut donc créer un objet de classe MenuBar. L'unique constructeur de cette classe ne requière pas de paramètre. Cet objet de barre de menu devra être passé en paramètre à la méthode setMenuBar définit sur le classe Frame : ainsi, vous liez votre barre à la fenêtre. Mais à ce stade, il doit être clair que votre menu est vide. Il faut donc définir les futures menus déroulants qui vont constituer cette barre.

Création d'un menu déroulant

Pour créer une menu déroulant, il vous faut créer un objet de la classe Menu. Un menu déroulant correspond à une zone de texte présent dans la barre de menu qui, lorsque l'on cliquera dessus permettra de dérouler un ensemble de choix (les objets de classe MenuItem). Lors de la construction de tel objet, on vous demande de passer une chaîne de caractères : elle correspond au texte qui apparaîtra dans la barre de menu pour cet élément.

Une fois le menu créer, il vous faut l'ajouter à la barre en utilisant la méthode add. Cette méthode requière en unique paramètre l'objet de menu déroulant. Attention : les menus déroulants apparaîtront dans la barre dans l'ordre ou vous les y ajouterez. L'exemple de code suivant ajoute quelques menus déroulants à une barre de menu. Cette barre est associée à une fenêtre graphique.

 

import java.awt.*;
import java.awt.event.*;
import java.applet.*;
public class Menu1 extends Applet {
Image startImage = null;
Frame f = null;
public void init() {
try {
MediaTracker mt = new MediaTracker(this);
startImage = this.getImage(this.getCodeBase(),"start.gif");
mt.addImage(startImage,0);
this.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
showWindow();
}
});

mt.waitForAll();
} catch(Exception e) {}
}
public void stop() {
if (f != null && f.isVisible()) 
f.setVisible(false);
}
public void paint(Graphics gc) {
gc.drawImage(startImage,0,0,null);
}
public void showWindow() {
f = new Frame("Ma fenetre");
f.setLayout(new FlowLayout(FlowLayout.CENTER));

f.add(new Button("Un bouton"));
// Mise en place du menu 
MenuBar maBarre = new MenuBar();
Menu file = new Menu("File");
maBarre.add(file);
Menu edit = new Menu("Edit");
maBarre.add(edit);
Menu help = new Menu("Help");
maBarre.add(help);
f.setMenuBar(maBarre);
// Fin de mise en place du menu
f.setSize(100,100);
f.setVisible(true);
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent event) {
f.setVisible(false); 
}
});
}
}


"Menu1.class": sorry, WinHelp cannot show this applet...

En testant le programme vous avez du remarquer que la barre de menu apparaît bien. Par contre si l'on clique sur un quelconque menu, rien ne se passe. C'est normal, vous n'avez pas ajouté d'éléments de menu dans chaque menu déroulant. Corrigeons rapidement de manque ! 

Ajouter des éléments de menu

Pour ajouter un élément de menu, il faut créer un objet de classe MenuItem. Le constructeur de cette classe requière un paramètre de type chaîne de caractères : ce paramètre correspond au libellé de l'élément de menu. Une fois l'objet instancié, il ne vous reste plus qu'à l'ajouter à votre menu déroulant en y invoquant la méthode add.

Notez une chose importante : un objet de classe MenuItem gère les évènements de types ActionEvent. Vous pouvez donc définir des gestionnaires d'évènements appropriés pour pour répondre y répondre. Etudiez de plus près ce nouvel exemple.

import java.awt.*;
import java.awt.event.*;
import java.applet.*;
public class Menu2 extends Applet {
Image startImage = null;
Frame f = null;
TextField myText = new TextField("xxxxx");
public void init() {
try {
MediaTracker mt = new MediaTracker(this);
startImage = this.getImage(this.getCodeBase(),"start.gif");
mt.addImage(startImage,0);
this.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
showWindow();
}
});

mt.waitForAll();
} catch(Exception e) {}
}
public void stop() {
if (f != null && f.isVisible()) 
f.setVisible(false);
}
public void paint(Graphics gc) {
gc.drawImage(startImage,0,0,null);
}
public void showWindow() {
f = new Frame("Ma fenetre");
f.setLayout(new FlowLayout(FlowLayout.CENTER));

f.add(myText);
// Mise en place du menu 
MenuBar maBarre = new MenuBar();
Menu file = new Menu("File");
MenuItem open = new MenuItem("Open");
open.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
myText.setText("Open");
}
});
file.add(open);
MenuItem close = new MenuItem("Close");
close.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
myText.setText("Close");
}
});
file.add(close);
maBarre.add(file);
Menu edit = new Menu("Edit");
edit.add(new MenuItem("Cut"));
edit.add(new MenuItem("Copy"));
edit.add(new MenuItem("Paste"));
maBarre.add(edit);
Menu help = new Menu("Help");
help.add(new MenuItem("About"));
maBarre.add(help);
f.setMenuBar(maBarre);
// Fin de mise en place du menu
f.setSize(100,100);
f.setVisible(true);
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent event) {
f.setVisible(false); 
}
});
}
}


"Menu2.class": sorry, WinHelp cannot show this applet...

Quelques autres aspects

Ajouter un séparateur à un menu

Il est clair, que plus vos menu déroulants vont devenir riche, plus vous allez avoir besoin de classer les choses. Dans ce cas, le création d'un nouveau menu déroulant peut être une bonne solution. Mais ce n'est pas la seule façon de faire. Vous pouvez aussi introduire des séparateurs pour y faciliter la lisibilité.

Pour ajouter un séparateur; il vous suffit d'invoquer la méthode addSeparator sur un objet de classe Menu. L'exemple qui suit introduit un séparateur dans le menu "File" afin de séparer les choix "Open" et "Close" du choix "Exit". Noter que ce dernier choix réalise la fermeture de la fenêtre.

import java.awt.*;
import java.awt.event.*;
import java.applet.*;
public class Menu3 extends Applet {
Image startImage = null;
Frame f = null;
TextField myText = new TextField("xxxxx");
public void init() {
try {
MediaTracker mt = new MediaTracker(this);
startImage = this.getImage(this.getCodeBase(),"start.gif");
mt.addImage(startImage,0);
this.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
showWindow();
}
});

mt.waitForAll();
} catch(Exception e) {}
}
public void stop() {
if (f != null && f.isVisible()) 
f.setVisible(false);
}
public void paint(Graphics gc) {
gc.drawImage(startImage,0,0,null);
}
public void showWindow() {
f = new Frame("Ma fenetre");
f.setLayout(new FlowLayout(FlowLayout.CENTER));

f.add(myText);
// Mise en place du menu 
MenuBar maBarre = new MenuBar();
Menu file = new Menu("File");
MenuItem open = new MenuItem("Open");
open.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
myText.setText("Open");
}
});
file.add(open);
MenuItem close = new MenuItem("Close");
close.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
myText.setText("Close");
}
});
file.add(close);
file.addSeparator();
MenuItem exit = new MenuItem("Close");
exit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
f.setVisible(false);
}
});
file.add(exit);
maBarre.add(file);
Menu edit = new Menu("Edit");
edit.add(new MenuItem("Cut"));
edit.add(new MenuItem("Copy"));
edit.add(new MenuItem("Paste"));
maBarre.add(edit);
Menu help = new Menu("Help");
help.add(new MenuItem("About"));
maBarre.add(help);
f.setMenuBar(maBarre);
// Fin de mise en place du menu
f.setSize(100,100);
f.setVisible(true);
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent event) {
f.setVisible(false); 
}
});
}
}

"Menu3.class": sorry, WinHelp cannot show this applet...

 
 

ABCSITE © copyright 2002