Académique Documents
Professionnel Documents
Culture Documents
-----
Les interfaces graphiques assurent le dialogue entre les utilisateurs et une application.
Dans un premier temps, Java propose l'API AWT pour créer des interfaces graphiques.
Depuis, Java propose une nouvelle API nommée Swing. Ces deux API peuvent être
utilisées pour développer des applications ou des applets. Les classes du toolkit AWT
(Abstract Windows Toolkit) permettent d'écrire des interfaces graphiques indépendantes
du système d'exploitation sur lesquelles elles vont fonctionner. Cette librairie utilise le
système graphique de la plateforme d'exécution (Windows, MacOS, X-Window) pour
afficher les objets graphiques. Le toolkit contient des classes décrivant les composants
graphiques, les polices, les couleurs et les images.
Les deux classes principales de AWT sont Component et Container. Chaque type d'objet
de l'interface graphique est une classe dérivée de Component. La classe Container, qui
hérite de Component est capable de contenir d'autres objets graphiques (tout objet
dérivant de Component).
Component
Button
Label
Container
Panel
Applet
JApplet
Window
Frame
JFrame
JComponent
JButton
JLabel
JPanel
import java.applet.*;
import java.awt.*;
public class AppletButton extends Applet
{
Button b = new Button("Bouton");
public void init()
{
super.init();
this.add(b);
}
}
Notre premier exemple consiste en une frame munie d’un bouton. Pour cela on va utiliser
les classes Frame et Button de AWT.
import java.awt.*;
public class AWTFrameAvecBouton extends Frame
{
public AWTFrameAvecBouton()
{
//Créer une instance de la classe Button avec "Fermer" comme caption
Button bt = new Button("Fermer");
// ajouter l'instance de Button à l'instance du conteneur Frame
//La méthode add() est héritée de la classe Component
this.add(bt);
//Etablir les dimensions du frame
//La méthode setSize() est héritée de la classe Component
this.setSize(300,150);
// Donner un titre au frame
//La méthode setTitle() est héritée de la classe Frame
this.setTitle("Frame AWT avec un bouton");
// Rendre le Frame visible
// La méthode setVisible() est héritée de la classe Component
this.setVisible(true);
}
public static void main(String args[])
{
// Créer une inatance de la classe Frame
AWTFrameAvecBouton frameAvec Bt = new AWTFrameAvecBouton();
}
}
Remarque :
Si le gestionnaire de mise en forme n’est pas précisé, Java utilise BorderLayout pour les
instances de Frame et FlowLayout pour les instances de Panel. Ainsi, notre exemple
précédent a utilisé par défaut, le gestionnaire de forme BorderLayout.
1.1.1. BorderLayout
BorderLayout dispose les composants suivant l’un des 4 bords du conteneur ou au centre.
On choisit l’emplacement d’un composant en fournissant en argument de la méthode
add() l’une des constantes entières suivantes.
Exemple
this.add(bt, BorderLayout.WEST);
Si aucune valeur n’est precise à la méthode add(), le composant est place au centre.
2.1.2. FlowLayout
Le gestionnaire de mise en forme FlowLayout dispose les composants les uns à la suite
des autres, sur une même ligne. Lorsqu’une ligne ne possède plus suffisamment de place,
l’affichage se poursuit sur la ligne suivante. Contrairement à ce qui se produit avec
BorderLayout, la taille des composants est respectée. Lors de la construction d’un
gestionnaire FlowLayout, on peut spécifier un paramètre d’alignement d’une ligne de
composants par rapport aux bords verticaux de la fenêtre. Pour cela, on utilise l’une des
constantes entières suivantes :
Exemple :
this.setLayout(new FlowLayout(FlowLayout.CENTER)) ;
import java.awt.event.*;
Pour déclarer plusieurs interfaces, il suffit de les séparer par des virgules
Chaque auditeur possède des méthodes différentes qui sont appelées pour traiter
leurs évenéments. Par exemple, l'interface ActionListener envoie des évenements
à une méthode nommée actionPerformed().
Exemple:
public void actionPerformed(ActionEvent evt)
{
//insérer ici le code de la méthode
};
Exemple:
String composant = evt.getActionCommand();
La méthode getSource() peut être utilisé avec tous les évenements utilisateur.
1.3.2. L'interface ActionListener
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class AppletAction extends Applet implements
ActionListener
{
Cette interface permet de réagir à la sélection de cases à cocher et de liste d'options. Pour
qu'un composant génère des évenements, il faut utiliser la méthode addItemListener().
Exemple :
Checkbox cb = new Checkbox(" choix ",true);
cb.addItemListener(this);
Ces évenements sont reçus par la méthode itemStateChanged() qui attend un objet de
type ItemEvent en argument.
Pour déterminer si une case à cocher est sélectionnée ou inactive, utiliser la méthode
getStateChange() avec les constantes ItemEvent.SELECTED ou
ItemEvent.DESELECTED.
Exemple:
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
Pour connaitre l'objet qui a généré l'événement, il faut utiliser la méthode getItem().
Pour déterminer la valeur sélectionnée dans une combobox, il faut utiliser la méthode
getItem() et convertir la valeur en chaîne de caractères.
Exemple:
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
Exemple :
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
Exemple:
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
Cette interface permet de réagir aux clics de souris. Les méthodes de cette interface sont :
Exemple:
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
Une classe qui implémente cette interface doit définir ces 5 méthodes. Si toutes les
méthodes ne doivent pas être utilisées, il est possible de définir une classe qui hérite de
MouseAdapter. Cette classe fournit une implémentation par défaut de l'interface
MouseListener.
Exemple:
class GestionClics extends MouseAdapter
{
Dans le cas d'une classe qui hérite d'une classe Adapter, il suffit de redéfinir la ou les
méthodes qui contiendront du code pour traiter les événements concernés. Par défaut, les
différentes méthodes définies dans l'Adapter ne font rien.
Un objet de cette nouvelle classe ainsi définie doit être passé en paramètre à la méthode
addMouseListener() au lieu de this qui indiquait que la classe répondait elle-même à
l'événement.
windowClosing est appelée lorque l'on clique sur la case système de fermeture de la
fenêtre.
windowClosed est appelé après la fermeture de la fenêtre : cette méthode n'est utile que si
la fermeture de la fenêtre n'entraine pas la fin de l'application.
import java.awt.*;
import java.awt.event.*;
public class AWTFrameAvecBouton1 extends Frame implements WindowListener
{
public AWTFrameAvecBouton1()
{
this.setLayout(new FlowLayout(FlowLayout.CENTER)) ;
//Créer une instance de la classe Button avec "Fermer" comme caption
Button bt = new Button("Fermer");
// ajouter l'instance de Button à l'instance du conteneur Frame
//La méthode add() est héritée de la classe Component
this.add(bt);
//Etablir les dimensions du frame
//La méthode setSize() est héritée de la classe Component
this.setSize(300,150);
// Donner un titre au frame
//La méthode setTitle() est héritée de la classe Frame
this.setTitle("Frame AWT avec un bouton");
// Rendre le Frame visible
// La méthode setVisible() est héritée de la classe Component
this.setVisible(true);
// Enregistrer l’instance de frame comme son propre écouteur
this.addWindowListener(this);
}
import java.awt.*;
import java.awt.event.*;
public class AWTFrameAvecBouton2 extends Frame
{
public AWTFrameAvecBouton2()
{
this.setLayout(new FlowLayout(FlowLayout.CENTER)) ;
//Créer une instance de la classe Button avec "Fermer" comme caption
Button bt = new Button("Fermer");
// ajouter l'instance de Button à l'instance du conteneur Frame
//La méthode add() est héritée de la classe Component
this.add(bt);
//Etablir les dimensions du frame
//La méthode setSize() est héritée de la classe Component
this.setSize(300,150);
// Donner un titre au frame
//La méthode setTitle() est héritée de la classe Frame
this.setTitle("Frame AWT avec un bouton");
// Rendre le Frame visible
// La méthode setVisible() est héritée de la classe Component
this.setVisible(true);
// Créer une instance de la classe « adaptateur » Fermeture
Fermeture gestEvnt = new Fermeture(this) ;
// Enregistrer l’instance gestEvnt comme écouteur
this.addWindowListener(gestEvnt);
}
La troisième manière de gérer les événements est l’utilisation de classe anonyme interne
qu’on définit à l’intérieur d’une autre classe. La classe anonyme n’a pas de nom.
L’utilisation de classe anonyme permet de simplifier le code pour la gestion des
événements surtout dans le cas de WindowEvent.
La structure de définition d’une classe anonyme interne se présente comme ci-après :
new nom_de_la_classe_de_base
{
corps de la classe anonyme interne
}
this.addWindowListener
( // Début de la dénition de la classe anonyme interne
new WindowAdapter() // WindowAdapter est la classe de base
{
public void windowClosing(WindowEvent ev)
{ fermerFenetre();}
}
);
import java.awt.*;
import java.awt.event.*;
public class AWTFrameAvecBouton3 extends Frame
{
public AWTFrameAvecBouton3()
{
this.setLayout(new FlowLayout(FlowLayout.CENTER)) ;
//Créer une instance de la classe Button avec "Fermer" comme caption
Button bt = new Button("Fermer");
// ajouter l'instance de Button à l'instance du conteneur Frame
//La méthode add() est héritée de la classe Component
this.add(bt);
//Etablir les dimensions du frame
//La méthode setSize() est héritée de la classe Component
this.setSize(300,150);
// Donner un titre au frame
//La méthode setTitle() est héritée de la classe Frame
this.setTitle("Frame AWT avec un bouton");
// Rendre le Frame visible
// La méthode setVisible() est héritée de la classe Component
this.setVisible(true);
Nous allons développer une classe qui comportera une Frame avec 3 boutons et 1 zone
de saisie et d’une étiquette. Nous aurons besoin de l’interface ActionListener pour les
boutons mais pour fermer la fenêtre, nous allons utiliser une classe anonyme interne,
donc pas besoin d’implémenter WindowListener.
import java.awt.* ;
import java.awt.event.* ;
public class AWTFrameEtComposants extends Frame implements ActionListener
{
// Variables référence des boutons, de la zone de saisie,
// et de l'étiquetter
Button btAfficher, btEffacer, btFermer ;
TextField tfmsg ;
Label lblmsg;
// Constructeur
public AWTFrameEtComposants()
{
// Créer les boutons et les zones de saisie
btAfficher = new Button(" Afficher") ;
btEffacer = new Button("Effacer");
btFermer = new Button("Fermer");
lblmsg = new Label("Message");
tfmsg = new TextField(15);
// Créer 2 instances de Panel ; A défaut le gestionnaire
//de forme FlowLayout
Panel phaut = new Panel() ;
Panel pbas = new Panel() ;
// Ajout de l’étiquette et de la zone de saisie au panel de haut
phaut.add(lblmsg) ;
phaut.add(tfmsg) ;
// Ajout des boutons au panel de bas
pbas.add(btAfficher) ;
pbas.add(btEffacer) ;
pbas.add(btFermer) ;
// Ajout du panel au frame ; le gestionnaire
//de forme à défaut, BorderLayout
this.add("North",phaut) ;
this.add("South",pbas) ;
// Enregistrer le Frame comme écouteur des boutons
btAfficher.addActionListener(this) ;
btEffacer.addActionListener(this) ;
btFermer.addActionListener(this);
this.setSize(320,150);
this.setTitle("Plusieurs contrôles AWT");
this.setVisible(true) ;
import java.awt.* ;
import javax.swing.* ;
import java.awt.event.* ;
public class SWINGFrameEtComposants extends JFrame implements ActionListener
{
// Variables référence des boutons,de la zone de saisie,
// et de l'étiquette
JButton btAfficher, btEffacer, btFermer ;
JTextField tfmsg ;
JLabel lblmsg;
// Constructeur
public SWINGFrameEtComposants ()
{
// Créer les boutons et les zones de saisie
btAfficher = new JButton("Afficher") ;
btEffacer = new JButton("Effacer");
btFermer = new JButton("Fermer");
lblmsg = new JLabel("Message");
tfmsg = new JTextField(15);
// Créer 2 instances de JPanel ; A défaut le
//gestionnaire de forme FlowLayout
JPanel phaut = new JPanel() ;
JPanel pbas = new JPanel() ;
// Ajout de l’étiquette et de la zone de saisie au panel de haut
phaut.add(lblmsg) ;
phaut.add(tfmsg) ;
// Ajout des boutons au panel de bas
pbas.add(btAfficher) ;
pbas.add(btEffacer) ;
pbas.add(btFermer) ;
// Ajout du panel au frame ; le gestionnaire
//de forme à défaut, BorderLayout
Container c = this.getContentPane() ;
c.add("North",phaut) ;
c.add("South",pbas) ;
// Enregistrer le Frame comme écouteur des boutons
btAfficher.addActionListener(this) ;
btEffacer.addActionListener(this) ;
btFermer.addActionListener(this);
this.setSize(320,150);
this.setTitle("Plusieurs contrôles SWING");
this.setVisible(true) ;
Un menu déroulant SWING est constitué d’instance d’au moins 3 classes : JMenuBar,
JMenu, JMenuItem. Pour ajouter un menu déroulant à un frame, il faut dans un premier
temps créer une instance de JMenuBar, ensuite une instance de JMenu et puis de
JMenuItem. On ajoute les instances de JMenuItem aux instances de JMenu et de JMenu à
JMenuBar .
On peut créer de touche de raccourci pour chaque menu en faisant appel à la méthode
setMnemonic de JMenu
import java.awt.* ;
import javax.swing.* ;
import java.awt.event.* ;
public class MenuSwing extends JFrame implements ActionListener
{
// Constructeur
public MenuSwing()
{
// Créer barre de menu, menu et menu item
JMenuBar barreMn = new JMenuBar();
JMenu mnFichier = new JMenu("Fichier");
JMenu mnAide = new JMenu("Aide");
mnAfficher = new JMenuItem("Afficher");
mnEffacer = new JMenuItem("Effacer");
mnFermer = new JMenuItem("Fermer");
mnFichier.setMnemonic('F');
mnAide.setMnemonic('A');
// ajouter la barre de menu au frame
this.setJMenuBar(barreMn);
// ajouter les menus à la barre de menu
barreMn.add(mnFichier);
barreMn.add(mnAide);
// Ajouter les menus Items aux menus
mnFichier.add(mnAfficher);
mnFichier.add(mnEffacer);
mnFichier.add(mnFermer);
this.setSize(320,150);
// this.setTitle("Plusieurs contrôles SWING");
this.setVisible(true) ;