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)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]);

     }

}

 

Exercice 2

//  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

         

     }

}