Exemple 2 d'utilisation d'une interface graphique

Par rapport à l'exemple précédent, l'objet graphique est décomposé en sous-objets issus de leur classes correspondantes (= hiérarchie d'objets).

/*

 * Main.java
 *
 * Created on March 31, 2008, 1:04 PM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package graphisme2;

// NE PAS OUBLIER LES IMPORTS ...
import javax.swing.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.awt.*;

/**

 *
 * @author gmonard
 */
public class Main
{

    /** Creates a new instance of Main */
    public Main()
    {
    }

    /**

     * @param args the command line arguments
     */
    public static void main(String[] args)
    {
        FenetrePrincipale fenetre_principale = new FenetrePrincipale();
    }

}

/**

 * Fenetre principale: la premiere fenetre ouverte par le programme
 * 
 * La fenetre principale herite de la classe JFrame qui est en Java
 *    la classe primaire definissant une fenetre graphique.
 * `<p>`
 * ActionListener permet l'interaction entre la fenetre et la souris (voir plus loin)
 * `</p>`
 */
class FenetrePrincipale extends JFrame implements ActionListener
{
    // attributs de la fenetre principale
    Contenu contenu;    

    public FenetrePrincipale()
    {
        /*

         * super: appel au constructeur de la classe heritee (JFrame)
         *        Le constructeur de JFrame prend 1 argument: le titre de la fenetre
         */
        super("Titre de la fenetre");
        /*

         * Definition de la taille de la fenetre
         * Par defaut, en Java, la fenetre a une taille nulle
         */
        this.setSize(300, 200);
        /*

         * On indique que la fermeture de cette fenetre (CLOSE)
         * implique la fin du programme (EXIT)
         */
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        /*

         * Gestion de la fenetre:
         *  la fenetre contient un panneau (JPanel) contenant deux boutons (JButton): "Quitter" et "Cancel"
         */

        // creation des objets graphiques
        this.contenu = new Contenu(this);
        //this.quitter = new JButton("Quitter");
        //this.cancel = new JButton("Cancel");

        // placement des objets (hierarchie d'objets)
        this.add(this.contenu);     // le contenu est place dans la fenetre principale
        *this.contenu.add(this.quitter);  * qui contient les boutons quitter
        *this.contenu.add(this.cancel);   * et cancel

        /*

         * gestion des evenements:
         * 'quitter' et 'cancel' sont des boutons qui doivent
         * reagir au clic de la souris
         *
         * addActionListener permet d'indiquer en Java quel objet va
         * gerer les actions de "cliquage"
         *
         * c'est le 'pere' (=la fenetre principale =this) qui va gerer ces actions.
         *
         * En java, cela implique l'ajout d'une methode dans le 'pere': actionPerformed
         */
        //this.quitter.addActionListener(this);
        //this.cancel.addActionListener(this);

        /*

         * La fenetre est visible (par defaut, elle ne l'est pas)
         */
        this.setVisible(true);

    }

    /**

     * Gestion des clics de souris
     * (le nom de la methode 'actionPerformed' est impose par Java
     *  et est du a l'interface 'addActionListener' utilisee ci-dessus)
     * @param evenement le clic ...
     */
    public void actionPerformed(ActionEvent evenement)
    {
        /*

         * On recherche sur quoi a-t'on cliquer
         */
        Object source = evenement.getSource();
        /*

         * Si on a clique sur le bouton "Quitter", on sort du programme (System.exit(0), 0 parce que tout va bien)
         */
        if (source == this.contenu.boutonQuitter)
        {
            System.out.printf("Sortie par le bouton Quitter");
            // quitter le logiciel
            System.exit(0);
        }
        else if (source == this.contenu.boutonCancel)
        {
            System.out.printf("Sortie par le bouton Cancel");
            // quitter le logiciel
            System.exit(0);
        }
        else
        {
            // rien
        }
    }
}

class Contenu extends JPanel
{
    // attributs du JPanel "Contenu"
    FenetrePrincipale pere;   // on garde trace de celui qui cree l'ojet courant

    Bouton boutonQuitter;    // contenu du JPanel: deux boutons Quitter et Cancel
    Bouton boutonCancel;

    public Contenu(FenetrePrincipale pere)
    {
        this.pere = pere;

        boutonQuitter = new Bouton("Quitter");
        boutonCancel  = new Bouton("Cancel");

        this.add(boutonQuitter);
        this.add(boutonCancel);

        boutonQuitter.addActionListener(this.pere); // celui qui écoute est le "pere" = fenetre principale
        boutonCancel.addActionListener(this.pere);
    }
}

class Bouton extends JButton
{
    public Bouton(String titre)
    {
        super(titre);
    }
}