Java: Exemples Swing

 

Affichage d'une fenêtre

Une fenêtre vide

On cree une "frame" et on l'affiche.
On ajoute un "listener" à la "frame" pour traiter l'évènement de sortie.
Ca permet de sortir proprement (quand on tue la fenetre par exemple).
 
On remarque que le "listener" est une instance de classe anonyme,
crée par instanciation directe de l'interface "WindowAdapter".
 
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
 
public class FrameDemo {
    public static void main(String s[]) {
       // Creation d'une fenetre vide
       JFrame frame = new JFrame("FrameDemo");
       // On lui ajoute un "listener" (pour traiter les evenements)
       // notamment pour sortir proprement
       frame.addWindowListener(new WindowAdapter() {
          public void windowClosing(WindowEvent e) {
          System.exit(0);
       }
     });
        // affichage de la fenetre
        frame.pack();
        frame.setVisible(true);
    }
}
 

Une fenêtre avec un texte

Dans une fenetre, on place des objets boutons, des listes, des tables des dessins, ...
Soit des objets dits atomiques (voir la doc Oracle).
Pratiquement, pour intégrer ces éléments, il faut utiliser des composants intermédiaires, les "panels".
 
Voici le même code que précédemment mais ce coup ci avec un panel simple contenant un texte.
 
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
 
public class PanelDemo {
    public static void main(String s[]) {
        JFrame frame = new JFrame("FrameDemo");
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
               System.exit(0);
            }
        });
 
        // Le texte est dans le label
        JLabel label = new JLabel("coucou yoyo popo");
        // le label dans un panel
        JPanel aPanel = new JPanel();
        aPanel.add(label);
 
        // et on place le panel dans la frame
        Container contentPane = frame.getContentPane();
        contentPane.add(aPanel);
 
        frame.pack();
        frame.setVisible(true);
    }
}

Placement des composants dans un panel

Pour placer les objets dans un panel on peut considérer plusieurs stratégies : en ligne, en colonne, par rapport aux bords, avec des coordonnées relatives, absolues, par dichotomie de l'espace .... Pour cela on utilise un "Layout Manager".
Chaque classe de "Layout Manager" met en oeuvre une stratégie particulière pour le placement des objets (voir la doc sun)
 

Placement par defaut

Si on reprend l'exemple précédent en ajoutant un autre composant, on s'aperçoit qu'il se place à coté, à droite. Le "Layout Manager" par defaut place donc les objets en ligne, c'est un FlowLayout.
 
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
 
public class PanelDemo2 {
    public static void main(String s[]) {
        JFrame frame = new JFrame("FrameDemo");
 
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
 
        JLabel label = new JLabel("coucou yoyo popo");
        JTextField textField = new JTextField(20); // creation 'un champ de saisie
        JPanel aPanel = new JPanel();
        aPanel.add(label);
        aPanel.add(textField); // on ajoute le champ de saisie
 
        Container contentPane = frame.getContentPane();
        contentPane.add(aPanel);
 
        frame.pack();
        frame.setVisible(true);
    }
}

Changer la gestion de l'espace dans un panel

On peut bien sur changer de "Layout Manager". On dispose de plusieurs classes pour la gestion du placement. Les plus courantes sont :
  • FlowLayout les widgets sont en ligne, de gauche a droite
  • BorderLayout Utilisation de points cardinaux, NORTH, SOUTH,WEST et EAST
  • GrigLayout Grille elastique organisée en cellules de même taille
  • CardLayout Un seul widget est visible à la fois et il occupe toute la surface de son conteneur
  • GridBagLayout permet de spécifier des contraintes spatiales complexes à partir d'une grille élastique. Les widgets contenues peuvent être de taille différentes (elles occupent plusieurs cellules)
 
Il y en a d'autres, toutes peuvent être utiles. Regardez la documentation de Oracle.

Mettre en oeuvre des onglets

Pour beaucoup d'applications de type TP de java en IUP par exemple, il suffit de programmer des fenêtres simples, chacune avec un un panel à onglets et éventuellement pour faire joli un menu.
Une fenêtre à onglets toute simple
Voici le code d'une fenêtre avec deux onglets. Le premier contient un label, le deuxieme un champ de saisie.
Les onglets se programment avec la classe JTabbedPane. C'est donc un panel particulier destiné à contenir d'autres panels. En effet, on ajoute un panel par onglet avec la methode addTab par exemple.
 
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JFrame;
 
import java.awt.*;
import java.awt.event.*;
 
public class OngletDemo1 {
    static public void main(String args[]) {
        JFrame frame = new JFrame("OngletDemo1");
        frame.addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent e) {System.exit(0);}});
 
        // On cree un panel à onglets
        JTabbedPane onglets = new JTabbedPane();
 
        // un premier onglet
        JPanel onglet1 = new JPanel();
        JLabel label = new JLabel("coucou yoyo popo");
        onglet1.add(label);
        onglets.addTab("Label", null, onglet1, "youyou!!, je suis le premier onglet avec un label!");
 
        // un deuxieme onglet
        JPanel onglet2 = new JPanel();
        JTextField textField = new JTextField(20);
        onglet2.add(textField);
        onglets.addTab("Champ de saisie", null, onglet2, "Je suis le deuxieme onglet avec un champ de saisie.");
 
        // et voila, il faut en plus  ajouter le panel à onglet dans le panel principal
        Container contentPane = frame.getContentPane();
        contentPane.add(onglets);
 
        frame.pack();
        frame.setVisible(true);
    }
}

La gestion des évènements

On arrive à construire une fenetre avec des composants atomiques : des boutons, des listes, des champs de saisie, des textes ... (les widgets quoi). C'est joli mais ce ne bouge pas beaucoup. Il faut que ca fasse quelque chose. Pour ca, il faut gérer les évenements.
 
Tout évènement (provenant du clavier, de la souris ...) constitue un stimuli envoye au systeme. Ce dernier peut réagir en executant le code spécifié dans un gestionaire d'evenement associe à l'objet stimulé.
 
Dans swing, un gestionaire d'evènement est un "Listener". Il existe plusieurs classes "Listener" :
 
Objet Graphique Evènement Listener
Champ de saisie, Liste   click de souris, touche "Return", choix d'une ligne ActionListener
fenêtre principale fermeture WindowListener
tout composant click de souris sur le composant MouseListener
tout composant déplacement de la souris sur le composant MouseMotionListener
tout composant le composant devient visible ComponentListener
tout composant le composant prend le focus FocusListener
liste, table changement de la sélection ListSelectionListener

Programmation d'un listener

Regardez la documentation sur le site d'Oracle, il y a plein d'exemples ...