LES INTERFACES GRAPHIQUES AVEC SWING

Introduction

Au tout début de Java, Swing n'existait pas encore. On utilisait alors AWT pour créer des interfaces graphiques. Swing a été introduit avec la version 1.2 de Java. Cet ensemble de classes complète AWT et facilite la création des interfaces graphiques.

Avec l'apparition de Java 8 en mars 2014, JavaFX, disponible depuis 2008, est devenu l'outil de création d'interface graphique officiel du langage Java. En conséquence, la présentation de Swing proposée dans cet exposé reste succincte.

Toutefois, du fait de l'accueil mitigé de JavaFX par la communauté, Swing devrait rester utilisé pendant quelques années encore.

La fenêtre

Différents types de fenêtres

Il existe plusieurs types de fenêtres dans Swing :

La classe JFrame

Certains programmeurs aiment utiliser de nombreuses classes. D'autres préfèrent utiliser un nombre restreint de fichiers... Pour créer une fenêtre de type JFrame, nous avons plusieurs solutions :

Dans cette deuxième solution, si on nomme "fenetre" l'objet issu de la classe, cela donne :

import javax.swing.JFrame;
public class Test {
  public static void main(String[] args) {
    JFrame fenetre = new JFrame();
  }
}

Diverses méthodes sont associées à la classe JFrame :

Les constituants de la fenêtre

La classe JPanel

Une Jframe se compose de plusieurs parties : La fenêtre, le RootPane, le LayeredPane, la MenuBar, le ContentPane et le GlassPane. Sans rentrer dans les détails, le ContentPane est la partie utile de la fenêtre, dans laquelle sont affichés les composants.

Avec Swing, on distingue :

On insère donc dans le ContentPane un objet JPanel, lequel peut contenir :

Dans l'exemple ci-dessous, on crée un objet JPanel nommé "panneau" :

JPanel panneau = new JPanel();

Diverses méthodes sont associées à la classe JPanel :

Positionner les containers et les composants

Pour positionner les constituants de la fenêtre, il existe plusieurs solutions :

Il existe de nombreux gestionnaires de placement, en voici quelques-uns :

Dans l'exemple ci-dessous, les objets panneau1 et panneau2 sont insérés dans l'objet panneau, auquel on a défini BorderLayout comme gestionnaire de placement.

JPanel panneau = new JPanel();
JPanel panneau1 = new JPanel();
JPanel panneau2 = new JPanel();
panneau.setLayout(new BorderLayout());
panneau.add("North", panneau1);
panneau.add("South", panneau2);

Les composants

Différents types de composants

Swing propose de nombreux composants. Nous en présentons trois :

La classe JButton

Dans l'exemple ci-dessous, le bouton nommé "mon_bouton", sur lequel est inscrit "CLIQUER", est inséré dans l'objet de type JPanel nommé "panneau".

JButton mon_bouton = new JButton("CLIQUER");
panneau.add(mon_bouton);

La classe JLabel

Dans l'exemple ci-dessous, le texte nommé "mon_texte", sur lequel est inscrit "Un texte...", est inséré dans l'objet de type JPanel nommé "panneau".

JLabel mon_texte = new JLabel("Un texte...");
panneau.add(mon_bouton);

La classe JTextField

Dans l'exemple ci-dessous, le champ de saisie nommé "champ", de longueur dix caractères, est inséré dans l'objet de type JPanel nommé "panneau".

JTextField champ = new JTextField(10);
panneau.add(mon_bouton);

Exemple de programme

Le programme :

import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.*;
import javax.swing.*;

public class SwingControlDemo {
    
  private JFrame mainFrame;
  private JLabel headerLabel;
  private JLabel statusLabel;
  private JPanel controlPanel;

  public SwingControlDemo(){ prepareGUI(); }

  public static void main(String[] args){
    SwingControlDemo swingControlDemo = new SwingControlDemo();      
    swingControlDemo.showButtonDemo();
  }

  private void prepareGUI(){
    mainFrame = new JFrame("Exemple d'utilisation de Swing");
    mainFrame.setSize(400,400);
    mainFrame.setLayout(new GridLayout(3, 1));
    mainFrame.addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent windowEvent){
        System.exit(0);
      }        
    });    
    headerLabel = new JLabel("",JLabel.CENTER);        
    statusLabel = new JLabel("",JLabel.CENTER);    

    statusLabel.setSize(350,100);

    controlPanel = new JPanel();
    controlPanel.setLayout(new FlowLayout());

    mainFrame.add(headerLabel);
    mainFrame.add(controlPanel);
    mainFrame.add(statusLabel);
    mainFrame.setVisible(true);  
  }
    
  private static ImageIcon createImageIcon(String path, String description) {
    java.net.URL imgURL = SwingControlDemo.class.getResource(path);
    if (imgURL != null) {
      return new ImageIcon(imgURL, description);
    }
    else {            
      System.err.println("Couldn't find file: " + path);
      return null;
    }
  }   

  private void showButtonDemo(){

    headerLabel.setText("Veuillez cliquer sur un des boutons"); 

    //resources folder should be inside SWING folder.
    ImageIcon icon = createImageIcon("/resources/java_icon.png","Java");

    JButton okButton = new JButton("OK");        
    JButton javaButton = new JButton("Submit", icon);
    JButton cancelButton = new JButton("Cancel", icon);
    cancelButton.setHorizontalTextPosition(SwingConstants.LEFT);

    okButton.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        statusLabel.setText("Vous avez cliqué sur le bouton Ok.");
      }          
    });
    javaButton.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        statusLabel.setText("Vous avez cliqué sur le bouton Submit.");
      }
    });
    cancelButton.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        statusLabel.setText("Vous avez cliqué sur le bouton Cancel.");
      }
    });

    controlPanel.add(okButton);
    controlPanel.add(javaButton);
    controlPanel.add(cancelButton);       

    mainFrame.setVisible(true);  
  }
}

Et le résultat :