C.
RECANATI
IHM Java
Swing
TP n¡ 5
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. La première méthode consiste à 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.
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émenter 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é).
Exercice 2: (cf programme du polycopié de cours pp
270-71).
On va
créer une application qui affiche une fenêtre comportant une barre
de menus et, en dessous, une zone de texte pouvant être scrollée
(mettre un JTextArea dans un JScroolPane). La zone de texte ne sera pas
éditable et servira dans le prochain TP à afficher les
événements se produisant sur les menus. La barre de menus
comporte trois menus : Fichier,
Elements et Aide.
1) Le
menu Fichier présente d’abord trois items
affichant respectivement un texte (par ex. Ouvrir), un texte et une icône (par ex. Sauver), et enfin une icône seule.
Viennent ensuite un séparateur et un dernier item (par exemple
Enregistrer).
F Pour créer un objet Icon, on peut utiliser ImageIcon(String filename)
où filename est le nom d’un fichier au format gif
ou jpeg. ImageIcon est une sous-classe de Icon et se
trouve dans javax.swing.
2) Le menu Elements présente d’abord quatre items de type
boutons radio intitulés Ligne, Rectangle, Cercle et Courbe. Vient ensuite un séparateur, puis un
sous-menu Couleurs qui comporte trois cases à cocher
intitulées Rouge, Vert et Bleu.
F Faites en sorte que l’on ne puisse
sélectionner qu’un seul bouton radio à la fois
(cf. ButtonGroup).
3) Le
menu Aide doit se trouver complètement
à droite sur la barre de menu (utiliser un composant Glue).
4) Ajoutez des
mnémoniques aux menus de la barre de menu. Ajoutez des
accélérateurs aux items du menu Fichier.
On pourra aussi ajouter des mnémoniques aux cases à cocher
et aux boutons radio du menu Elements.
Exercice
3:
1) Rajouter une barre
d’outils (JToolBar) avec trois icônes (des JButton). Pour que la barre d’outils ne puisse pas
être déplacée avec la souris, utiliser setFloatable.
2) Mettre des bulles de
commentaires sur les boutons de la ToolBar (utiliser setToolTipText).
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
…
}
}