C. RECANATI

IHM Java Swing

DESS EID 2004/2005

 

 

 

 

 

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)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).

 

S’il vous reste du temps …

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

     }

}

 

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

         

     }

}