Dernière mise à jour :2008-10-15

informatique

Swing constitue une innovation apparue dans JDK1.1 en tant qu'extension de ce dernier et en tant que partie intégrante de Java 2 SDK. Swing est la seconde bibliothèque de classes (la première étant AWT) permettant de créer et gérer des interfaces graphiques. Les méthodes utilisées pour construire une interface Swing sont sensiblement les même que celles de AWT soit :

  • Création d'un cadre ou contenant
  • Placer des composants dans ce contenant
  • Effectuer la mise en page de ces composants dans le contenant
  • gérer les événements et actions posée par l'utilisateur

Swing étant une bibliothèque relativement complexe, cet article ce contentera d'exposer les bases de la fabrication d'interfaces utilisateur (UI (User Interface)).

Différences entre Swing et AWT

Swing présente plus de composants que AWT. Tous les noms des composants Swing commencent par la lettre «J». Aussi, la gestion des évènements est totalement différente. Finalement, du coté utilsateur, l'apparence des composants est distincte. Swing permet la création de programmes Java avec une interface qui emploie le style du système d'exploitation sur laquelle tourne l'application ou encore, un tout nouveau style spécifique à Java qui a été nommé «Metal».

Liste des composants offerts par Swing

  • JButton
  • JCheckBox
  • JComboBox
  • JLabel
  • JList
  • JPasswordField
  • JRadioButton
  • JScrollBar
  • JTextArea
  • JTextField
  • ...

Les contenants

Les contenants sont les objets dans lesquels sont placés les composants de l'intarface. Voici la liste des principaux contenant offerts par Swing :

  • JFrame
    Une fenêtre classique.
  • JDialog
    Une boite de dialogue (du genre fenêtre d'alerte sous Windows) qui apparait au centre de l'écran.
  • JPanel
    Une fenêtre classique
  • JScrollPane
    Ajoute une barre de défilement. On peut par exemple ajouter un JFrame. Ensuite y ajouter un JScrollBar et finalement, un JTextArea, ce qui permettra de disposer de barres de défilement pour ce composant.
  • JTabbedPane
    Un cadre avec des onglets.

Look and feel

Swing dispose d'un gestionnaire d'interfaces utilisateur qui contrôle l'apparence des composants. La classe qui est chargée de cette tâche se nomme «UIManager».

C'est plus précisément la méthode «setLookAndFeel(LookAndFeel)» qui permet de choisir l'apparence du programme.

Pour obtenir un objet de type LookAndFeel, il faut se servir de l'une des deux méthodes énumérées ci-dessous :

  • getCrossPlatformLookAndFeelClassName()
    Retourne un objet LookAndFeel du style «Metal» (multi plate-forme) de Swing.
  • getSystemLookAndFeelClassName()
    Retourne un objet LookAndFeel qui représente l'apparence du système sur lequel tourne l'application.

Note : Si elle ne peut pas s'appliquer à l'apparence désirée, la méthode setLookAndFeel génère l'exception «UnsupportedLookAndFeelException».

Une première application

Nous allons maintenant passer à la pratique et créer une première application utilisant des composants Swing. Cette application présentera à l'utilisateur quatres boutons radio qui, lorsque sélectionnés, changeront la couleur d'une zône rectangulaire située à droite de ces boutons.

L'application présentera aussi un bouton qui permettra à l'utilisateur de quitter l'application.

Le listing ci-dessous présente le code de cette première application

Listing 1.0 Premier programme Swing
 import java.awt.*;
 import java.awt.event.*;
 import javax.swing.*;
 
 public class JRadioButtons extends JFrame
 {
   JLabel jLabel1 = new JLabel("Choisissez une couleur");

   JPanel jPanel1 = new JPanel();
   JButton btnQuit = new JButton("Quitter");

   JRadioButton jRadioButton1 = new JRadioButton("Bleu");
   JRadioButton jRadioButton2 = new JRadioButton("Vert");
   JRadioButton jRadioButton3 = new JRadioButton("Jaune");
   JRadioButton jRadioButton4 = new JRadioButton("Orange");

   ButtonGroup buttonGroup1 = new ButtonGroup();

   public static void main(String[] args)
   {
    JRadioButtons radioButtons1 = new JRadioButtons();
    radioButtons1.setVisible(true);
   }

   public JRadioButtons()
   {
    this.setSize(300,150);
    jLabel1.setBounds(new Rectangle(3, 4, 290, 20));
    this.getContentPane().setLayout(null);
    jRadioButton1.setSelected(true);
    jRadioButton1.setBounds(new Rectangle(5, 20, 100, 20));
    jRadioButton1.addItemListener(new java.awt.event.ItemListener()
     {
      public void itemStateChanged(ItemEvent e)
       {
        radioButtons_itemStateChanged(e);
       }
     });
     jRadioButton2.setBounds(new Rectangle(5, 40, 100, 20));
     jRadioButton2.addItemListener(new java.awt.event.ItemListener()
     {
      public void itemStateChanged(ItemEvent e)
       {
        radioButtons_itemStateChanged(e);
       }
     });
     jRadioButton3.setBounds(new Rectangle(5, 60, 100, 20));
     jRadioButton3.addItemListener(new java.awt.event.ItemListener()
      {
       public void itemStateChanged(ItemEvent e)
       {
        radioButtons_itemStateChanged(e);
       }
      });
     jRadioButton4.setBounds(new Rectangle(5, 80, 100, 20));
     jRadioButton4.addItemListener(new java.awt.event.ItemListener()
      {
       public void itemStateChanged(ItemEvent e)
       {
        radioButtons_itemStateChanged(e);
       }
      });
     jPanel1.setBackground(Color.blue);
     jPanel1.setBounds(new Rectangle(105, 20, 150, 100));
     btnQuit.setBounds(new Rectangle(5, 100, 100, 20));
     btnQuit.addActionListener(new java.awt.event.ActionListener()
      {
       public void actionPerformed(ActionEvent e)
       {
        setVisible(false); dispose();
       }
      });
     this.getContentPane().add(jLabel1, null);
     this.getContentPane().add(jRadioButton1, null);
     this.getContentPane().add(jRadioButton2, null);
     this.getContentPane().add(jRadioButton3, null);
     this.getContentPane().add(jRadioButton4, null);
     this.getContentPane().add(jPanel1, null);
     this.getContentPane().add(btnQuit, null);
 
     this.buttonGroup1.add(this.jRadioButton1);
     this.buttonGroup1.add(this.jRadioButton2);
     this.buttonGroup1.add(this.jRadioButton3);
     this.buttonGroup1.add(this.jRadioButton4);

     this.addWindowListener(new WindowAdapter()
      {
       public void windowClosing(WindowEvent evt)
       {
        dispose();
       }
       public void windowClosed(WindowEvent evt)
       {
        System.exit(0);
       }
      });
   }

   void radioButtons_itemStateChanged(ItemEvent e)
   {
    Object source = e.getSource();
    if (source == jRadioButton1) this.jPanel1.setBackground(Color.blue);
    if (source == jRadioButton2) this.jPanel1.setBackground(Color.green);
    if (source == jRadioButton3) this.jPanel1.setBackground(Color.yellow);
    if (source == jRadioButton4) this.jPanel1.setBackground(new Color(255, 153, 51));
   }
 }

Description du listing

On remarque tout d'abord que la classe JRadioButtons est dérivée de la classe JFrame, qui, tel que mentionné plus haut dans l'article, fait partie de Swing.

Cette classe sert à afficher la ou les fenêtres d'une application. Plusieurs lignes de cette application font références aux diverses fonctions de la classe JFrame et de ses classes parentes. Pour simplifier la description de ces diverses lignes de code, j'ai donc choisis de vous présenter une description de toutes les fonctions de JFrame et de ses classes parentes. La liste d'éléments ci-dessous présente la position de la classe JFrame à l'intérieur de Java.

  • java.lang.Object
    • java.awt.Component
      • java.awt.Container
        • java.awt.Window
          • java.awt.Frame
            • javax.swing.JFrame

Description de JFrame

public JFrame();

Construction de la fenêtre

public JFrame(String titre);

Construction de la fenêtre avec un titre

public Container getContentPane();

Récupère le contenant de la fenêtre c'est à dire, la zone active sans la barre de menu, la barre d'état et la barre de titre

public void setContentPane(Container contenant);

Défini un nouveau contenant

public JMenuBar getJMenuBar();

Récupère la barre de menu de l'application

public void setJMenuBar(JMenuBar barreMenu);

place automatiquement une barre de menu donnée en haut de la fenêtre, en laissant le pavé de contenu libre pour le reste du contenu applicatif.

public void setLayout(java.awt.LayoutManager gestionnaire);

Place un nouveau gestionnaire de disposition des composants graphiques internes à la fenêtre.

Description de Frame

public void setTitle(String titre);

Spécifie un titre à la fenêtre.

public void setCursor(int typeCurseur);

Spécifie un nouveau curseur de souris pour l'application.

public void setIconImage(Image image);

Spécifie une nouvelle icône de bureau pour l'application.

Description de Window

public void show();

Rend la fenêtre visible et la dispose au-dessus des autres fenêtres.

public void toFront();

Place une fenêtre au premier plan.

public void toBack();

Fait passer la fenêtre derrière à l'arrière plan.

public void hide();

Rend la fenêtre invisible (elle existe encore en mémoire).

Description de Container

public void setFont(Font police);

Définie une nouvelle police de caractères.

public Component add(Component composant);

Place un nouveau composant dans le contenant.

Description de Component

public void setBackground(Color couleur);

Spécifie une couleur de fond.

public void setForeground(Color couleur);

Spécifie une couleur du texte.

public Graphics getGraphics();

Récupère la surface de travail du composant pour pouvoir réaliser d'autres tracés.

public int getHeight();

Hauteur du composant.

public void setLocation(int x, int y);

Positionne les coordonnées du composant par rapport au coin supérieur gauche.

public void setSize(int largeur, int hauteur);

Spécifie les dimensions du composant.

public void setVisible(boolean visible);

Rend un composant visible ou non.

public int getWidth();

Trouve la largeur du composant.

public int getX();

Trouve l'abscisse du composant par rapport au coin supérieur gauche.

public int getY();

Trouve l'ordonnée du composant par rapport au coin supérieur gauche.

public void repaint();

Pour redessiner le composant.

public Rectangle bounds();

Récupère toutes les dimensions de la zone rectangulaire du composant.

La gestion des évènement dans le listing

Pour les boutons radio

Pour les JRadioButton, on doit utiliser la méthode «addItemListener», héritée de la classe «AbstractButton». Cette méthode, comme son nom l'indique permet de spécifier qu'il faut ajouter un élément qui sera à l'écoute des évènements reliés à ce bouton radio.

La méthode fait la création d'un nouvel objet de type «ItemListener». La classe de cette objet contient une méthode nommée «itemStateChanged». Celle-ci est déclenchée lorsqu'un élément est sélectionné ou désélectionné. Celle-ci appèle la fonction «radioButtons_itemStateChanged» qui se trouve au bas du listing et dans laquelle le changement de couleur de la zone rectangulaire est effectué.

Pour la fenêtre

Pour la fenêtre, on doit se servir d'un WindowListener (ou écouteur d'évènement de fenêtre). Lorsque la fenêtre se fermera (voir windowClosing), la méthode «dispose()» sera appelée, ce qui permettra de cacher la fenêtre mais aussi de libérer les «listener» (écouteurs) et ainsi, libérer des ressources système.

En terminant, la méthode «System.exit» est appelé pour sortir définitivement du programme.

Auteur : Sylvain Bilodeau

Date de mise en ligne : 2003-02-13

Aucun commentaire pour l'instant.