C.
RECANATI
IHM
Java
Master M1
2005
TP n¡7
Exercice
1:
On veut réaliser une boîte de dialogue présentant des champs de textes étiquetés pour que l’utilisateur entre des données. Il y a plusieurs manières de réaliser l’alignement des étiquettes et des champs. Une première méthode consisterait à utiliser deux GridLayout et un BorderLayout, comme l’illustre la figure ci dessous :

Un GridLayout garantit que ces éléments auront la
même taille, donc les textes et les labels auront des hauteurs uniformes.
Pour faire en sorte que ces hauteurs soient identiques, on utilise un
troisième gestionnaire : un BorderLayout. En ajoutant deux
composants (ici à l’Est et au Centre), il leur donne la même
hauteur, et de cette manière, les labels et les textFields se trouveront
alignés.
Mais une autre façon
de procéder est d’utiliser un GridBagLayout, et d’ajouter un tableau de labels
et un tableau de textFields de même longueur à un conteneur
à l’aide d’une méthode
générique.
void
addLabelTextRows(JLabel[] labels,
JTextField[]
textFields,
GridBagLayout
gridbag,
Container
container)
Implémentez cette
méthode générique, de sorte qu’elle aligne les
étiquettes (du tableau
labels[ ]) et les champs de textes (donnés dans le tableau
textFields[ ]) grâce au GridBagLayout.
F utiliser la constante GridBagConstraints.REMAINDER pour marquer les éléments de fin de
lignes (cf. corrigé plus loin).
Exercice 2 : (reprise de
l’exercice 1 de la feuille de TP n°6)
On va
créer une application qui affiche une fenêtre comportant une barre
de menus et en dessous, une zone de texte (JTextArea) pouvant être scrollée (utilisez un JScroolPane). La zone de texte ne sera pas
éditable mais on s’en servira (dans le prochain TP) pour afficher
des renseignements sur les événements se produisant dans le menu.
La barre de menus comportera 3 menus. (Partez si vous voulez de l’exemple
de Sketcher vu en cours).
1) Le premier
menu s’intitule ‘Fichier’ et présente d’abord 3
items affichant respectivement un simple texte (par ex. Ouvrir), un texte (par
ex. Sauver) et une icône, et enfin une icône seule. Vient ensuite
un séparateur, puis un dernier item (par ex. Enregistrer). On trouvera
des fichiers d’icônes dans le répertoire ~cathy/images :
"left.gif","right.gif" et "middle.gif". (Vous
n’avez qu’à copier ce répertoire dans votre propre
répertoire images). Pour créer un objet Icon (nécessaire au constructeur JMenuItem pour faire
des items comportant une icône), on peut utiliser new ImageIcon(String
filename) où filename est le nom
du fichier relativement au répertoire courant. ImageIcon est une sous-classe de Icon et se
trouve dans javax.swing.
2) Le second menu
s’intitule ‘Elements’ et présente d’abord 4
items de type boutons radio intitulés Ligne, Rectangle, Cercle et
Courbe. Viennent ensuite un séparateur, puis un sous-menu
intitulé Couleurs qui présentera 3 cases à cocher
intitulées Rouge, Vert et Bleu. Faites en sorte que l’on ne puisse
sélectionner qu’un bouton radio à la fois (on les ajoute
tous à un même ButtonGroup).
3) Le dernier
menu s’intitule ‘Aide’ et se trouve situé
complètement à droite sur la barre de menu (utiliser un composant
Glue). Il ne fait rien.
4) Tous les menus
de la barre de menu possèdent une touche mnémonique. On ajoutera
également quelques accélérateurs pour les items
nommés du premier menu. On pourra aussi ajouter des mnémoniques
aux cases à cocher et aux boutons radio du second menu. Veillez à
ce qu’il n’y ait pas de conflits.
Eléments de
Correction
Exercice
1
private void
addLabelTextRows(JLabel[] labels,
JTextField[] textFields,
GridBagLayout gridbag,
Container container) {
/** suppose qu’il y a
le même nb de JTextField que de JLabels
et que le gridbag est le
gestionnaire d’aff. associé au container */
GridBagConstraints c = new
GridBagConstraints();
c.anchor =
GridBagConstraints.EAST;
int nitem = labels.length; // nombre de lignes
for (int i = 0; i < nitem; i++)
{
c.gridwidth =
GridBagConstraints.RELATIVE;
//suit le dernier entré
c.fill =
GridBagConstraints.NONE;
// ne sera pas
redimensionné
c.weightx =
0.0; // les labels ne s’élargiront
pas
gridbag.setConstraints(labels[i],
c);
container.add(labels[i]);
c.gridwidth =
GridBagConstraints.REMAINDER ;
//dernier de ligne
c.fill =
GridBagConstraints.HORIZONTAL;
c.weightx =
1.0; // absorbe tout l’espace
container.add(textFields[i]);
}
}
// fichier Sketcher.java qui
crée
// et
affiche une fenêtre de l’application
import java.awt.*;
public class Sketcher {
static SketcherFrame window; //la fenêtre d’application
public static void main(String[] args) {
window
= new SketcherFrame("Sketcher");
//
pour centrer la fenêtre
Toolkit
leKit = window.getToolkit();
Dimension
wndSize = leKit.getScreenSize();
window.setBounds(wndSize.width/4,
wndSize.height/4,
wndSize.width/2,
wndSize.height/2);
window.setVisible(true);
} // fin du
main
}
//
fichier SketcherFrame.java : la fenêtre
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class SketcherFrame extends JFrame
{
protected JTextArea output;
// la zone de
texte
protected JScrollPane scrollPane; // Le
scroller
private JMenuBar menuBar;
// la barre de
menu
public SketcherFrame(String titre) {
JMenu
menu, submenu; // pour
definir les menus
JMenuItem
menuItem;
JRadioButtonMenuItem
rbMenuItem;
JCheckBoxMenuItem
cbMenuItem;
setTitle(titre);
setDefaultCloseOperation(EXIT_ON_CLOSE);
//Créer la
toolbar.
JToolBar
toolBar = new JToolBar();
// pour qu’elle ne puisse
pas être déplacée
toolBar.setFloatable(false);
// lui ajouter des boutons
(méthode addButtons + loin)
addButtons(toolBar);
// Créer le texte non
éditable
output
= new JTextArea(10, 80);
output.setEditable(false);
scrollPane
= new JScrollPane(output);
//Ajouter
les composants en utilisant le BorderLayout
//
(affichage par défaut du JFrame)
Container
contentPane = getContentPane();
contentPane.add(toolBar,
BorderLayout.NORTH);
contentPane.add(scrollPane,
BorderLayout.CENTER);
//Ajouter une barre de
menu
menuBar
= new JMenuBar();
setJMenuBar(menuBar);
//Construire le premier menu
Fichier
menu
= new JMenu("Fichier");
menu.setMnemonic(KeyEvent.VK_F);
//un
groupe de JMenuItems
menuItem
= new JMenuItem("Ouvrir", KeyEvent.VK_O);
//ou bien menuItem.setMnemonic(KeyEvent.VK_O);
//mais
utiliser plutôt le constructeur précédent
…
menuItem.setAccelerator(KeyStroke.getKeyStroke(
KeyEvent.VK_1,
ActionEvent.ALT_MASK));
menuItem
= new JMenuItem // texte et
icône
("A
la fois texte et icone",
new ImageIcon("images/middle.gif"));
menuItem.setMnemonic(KeyEvent.VK_A);
menu.add(menuItem);
menuItem
= new JMenuItem(new // juste
icône
ImageIcon("images/middle.gif"));
menuItem.setMnemonic(KeyEvent.VK_B);
menu.add(menuItem);
menu.addSeparator(); // le séparateur
menuItem
= new JMenuItem("Enregistrer",// texte et mémo
KeyEvent.VK_E);
menuItem.setAccelerator(KeyStroke.getKeyStroke(
KeyEvent.VK_2,
ActionEvent.ALT_MASK));
menu.add(menuItem);
//
Construire le second menu : Elements
menu
= new JMenu("Elements");
menu.setMnemonic(KeyEvent.VK_E);
menuBar.add(menu);
//un
groupe pour ses boutons radio
ButtonGroup
group = new ButtonGroup();
rbMenuItem
= new JRadioButtonMenuItem("Ligne", true);
rbMenuItem.setMnemonic(KeyEvent.VK_L);
group.add(rbMenuItem);
menu.add(rbMenuItem);
rbMenuItem
= new JRadioButtonMenuItem("Rectangle",
false);
rbMenuItem.setMnemonic(KeyEvent.VK_R);
group.add(rbMenuItem);
menu.add(rbMenuItem);
//
… ibid pour CERCLE, etc.
menu.addSeparator(); //
un séparateur
//
le sous-menu des cases couleurs
submenu
= new JMenu("Couleur");
submenu.setMnemonic(KeyEvent.VK_C);
//
un nouveau groupe (pour les check boxes)
ButtonGroup
group2 = new ButtonGroup();
cbMenuItem
= new JCheckBoxMenuItem("Rouge", true) ;
cbMenuItem.setMnemonic(KeyEvent.VK_R);
group2.add(cbMenuItem);
submenu.add(cbMenuItem);
cbMenuItem
= new JCheckBoxMenuItem("Bleu", false) ;
cbMenuItem.setMnemonic(KeyEvent.VK_B);
group2.add(cbMenuItem);
submenu.add(cbMenuItem);
// … vert,
etc.
//construire
le menu Aide à droite grâce à un Glue
menu
= new JMenu("Aide");
menu.setMnemonic(KeyEvent.VK_A);
menuBar.add(Box.createHorizontalGlue());
menuBar.add(menu);
}
// fin du
constructeur
protected
void addButtons(JToolBar toolBar) {
JButton
button = null;
//
premier bouton
button
= new JButton(new ImageIcon
("images/left.gif"));
button.setToolTipText
("Ceci
est le bouton de gauche");
toolBar.add(button);
//
ibid pour les autres boutons
…
}
}