• Aucun résultat trouvé

Deux versions d'une même IHM

Soit l'IHM suivante composée d'une fiche de classe Frame, d'un bouton Button1 de classe Bouton dérivée de la classe Button , et d'un panneau Panel1 de classe Panel.

L'IHM réagit uniquement au click de souris :

 Le Button1 de classe Bouton réagit au simple click et il fait alternativement changer de couleur le fond de la fiche sur laquelle il est déposé.

 Le Panel1 de classe Panel réagit au simple click et au double click, chaque réaction click ou double-click fait changer sa couleur de fond.

 La fiche de classe Frame est sensible au click de souris pour sa fermeture, au click de souris sur son fond et au double click sur son fond (chaque réaction click ou double-click fait changer sa couleur de fond).

Si nous choisissons d'utiliser un écouteur de classe héritant des WindowAdapter.

Nous pouvons instancier pour chaque objet (fenêtre, panneau et bouton) un écouteur qui doit redéfinir la méthode mouseClicked

Nous pouvons aussi instancier un écouteur général (centralisé) qui écoutera les 3 objets. Button1

/*

Une Fenêtre où l'on intercepte les événements de click de souris en utilisant un écouteur d'événements WindowAdapter pour la fenêtre et un écouteur d'événements MouseAdapter pour: fenêtre, panneau et bouton. */

import java.awt.*; import java.awt.event.*; class AppliUneFrameClick2

{

//-- classe interne écouteur centralisé de souris MouseAdapter :

class SourisAdapter extends MouseAdapter

{

//écoute les événements de click de souris de la fenêtre, du panneau et du bouton !

public void mouseClicked(MouseEvent e) { if(e.getSource( ) instanceof Fenetre) {

Fenetre FicheaEcouter = (Fenetre)(e.getSource( )); if(e.getClickCount( )==1) FicheaEcouter.GestionMouseClicked(e); else FicheaEcouter.GestionMouseDblClicked(e); } else {

if(e.getSource( ) instanceof Panneau) {

Panneau PanneauaEcouter = (Panneau)(e.getSource( ) ); if(e.getClickCount( )==1) PanneauaEcouter.GestionMouseClicked(e); else PanneauaEcouter.GestionMouseDblClicked(e); } else {

if(e.getSource( ) instanceof Bouton) {

Bouton ButtonaEcouter = (Bouton)(e.getSource( ));

ButtonaEcouter.GestionMouseClicked(e); } } } } }

//-- classe interne écouteur de fenêtre WindowAdapter :

class FenetreAdapter extends WindowAdapter

{

Fenetre FicheaEcouter ;

FenetreAdapter(Fenetre x) {

FicheaEcouter = x; }

public void windowClosing(WindowEvent e) {

FicheaEcouter.GestionWindowClosing(e); }

}

//-- classe interne un Panneau dans la fenêtre :

class Panneau extends Panel

{

public Panneau(Frame AOwner) {

Si l'émetteur du MouseEvent est du type Fenetre. Si l'émetteur du MouseEvent est du type Panneau. Si l'émetteur du MouseEvent est du type Bouton.

La fenêtre possède deux écouteurs :

L'un pour sa fermeture ( WindowAdapter)

L'autre centralisé pour les click sur son fond ( MouseAdapter)

this.setBackground(Color.lightGray); }

void GestionMouseClicked(MouseEvent e) { this.setBackground(Color.magenta);

}

void GestionMouseDblClicked(MouseEvent e) { this.setBackground(Color.orange);

} }

//-- classe interne un Button dans la fenêtre :

class Bouton extends Button

{

public Bouton(Frame AOwner) {

AOwner.add(this);

this.setBounds(10,40,150,30); this.setLabel("Changer la couleur"); this.setBackground(Color.orange); }

void GestionMouseClicked(MouseEvent e) { if (this.getBackground()==Color.yellow) {

this.setBackground(Color.cyan);

this.getParent( ).setBackground(Color.green); }

else {

this.setBackground(Color.yellow);

this.getParent( ).setBackground(Color.red); }

} }

//-- classe interne une fenêtre dans l'application :

class Fenetre extends Frame

{

SourisAdapter UnEcouteurSourisEvent = new SourisAdapter( );

FenetreAdapter UnEcouteurFenetreEvent = new FenetreAdapter(this);

Panneau panel1 = new Panneau(this);

Bouton Button1 = new Bouton(this); public Fenetre( ) {

this.setLayout(null);

this.setSize(new Dimension(400, 300));

this.setTitle("MouseAdapter dans la fenêtre,le panneau et le bouton"); this.setVisible(true);

Button1.addMouseListener(UnEcouteurSourisEvent);

panel1.addMouseListener(UnEcouteurSourisEvent); this.addMouseListener(UnEcouteurSourisEvent); this.addWindowListener(UnEcouteurFenetreEvent); }

void GestionWindowClosing(WindowEvent e) {

System.exit(0); }

void GestionMouseClicked(MouseEvent e) { this.setBackground(Color.blue);

}

void GestionMouseDblClicked(MouseEvent e) { this.setBackground(Color.pink);

}

this.getParent( )renvoie une référence sur le parent de l'objet Bouton : dans l'exercice le parent est la fiche

La fiche héritant de Frame avec ses composants déposés.

L'écouteur centralisé est recensé auprès des 3 objets.

La fiche thisrecense son écouteur pour WindowClosing

}

//---> constructeur de l'application :

AppliUneFrameClick2( ) {

Fenetre Fiche2 = new Fenetre( ); }

public static void main(String[ ] args) { new AppliUneFrameClick2( );

} }

Pour la classe Bouton, on peut aussi déclarer un champ privé du type Frame (private Frame fenLoc) qui stocke la référence de la fiche contenant le Bouton. C'est le constructeur de Bouton qui passe alors la référence effective de la fenêtre.

Nous remarquons dans le code ci-dessous à droite que le fait de disposer de la référence (private Frame fenLoc) sur la fiche qui contient le bouton offre plus de possibilités que le code de gauche où il a fallu faire appel au parent par la méthode getParent pour accéder à la fiche :

Accès à la fiche comme parent Accès à la fiche par une référence

//-- classe interne un Button dans la fenêtre :

class Bouton extends Button

{

public Bouton(Frame AOwner) {

AOwner.add(this);

this.setBounds(10,40,150,30); this.setLabel("Changer la couleur"); this.setBackground(Color.orange); }

void GestionMouseClicked(MouseEvent e) { if (this.getBackground()==Color.yellow) {

this.setBackground(Color.cyan);

this.getParent( ).setBackground(Color.green); }

else {

this.setBackground(Color.yellow);

this.getParent( ).setBackground(Color.red); }

} }

//-- classe interne un Button dans la fenêtre :

class Bouton extends Button

{

private Frame FenLoc;

public Bouton(Frame AOwner) {

AOwner.add(this); FenLoc = Aowner ;

this.setBounds(10,40,150,30); this.setLabel("Changer la couleur"); this.setBackground(Color.orange); }

void GestionMouseClicked(MouseEvent e) { if (this.getBackground( )==Color.yellow) {

this.setBackground(Color.cyan);

FenLoc.setBackground(Color.green); }

else {

this.setBackground(Color.yellow);

FenLoc.setBackground(Color.red); }

} }

Voici maintenant la deuxième version de codage proposée pour l'IHM précédente en utilisant pour tous les écouteurs une classe anonyme :

/*

Une Fenêtre où l'on intercepte les événements de click de souris en utilisant un écouteur d ' événements fenêtre et un écouteur d ' événements souris avec des classes anonymes !

*/

import java.awt.*; import java.awt.event.*; class AppliUneFrameClick3

{

//-- classe interne un Panneau dans la fenêtre :

class Panneau extends Panel

{

… code strictement identique à la version précédente ….

}

//-- classe interne un Button dans la fenêtre :

class Bouton extends Button

{

… code strictement identique à la version précédente ….

}

//-- classe interne une fenêtre dans l'application :

class Fenetre extends Frame

{

Panneau panel1 = new Panneau(this);

Bouton Button1 = new Bouton(this); public Fenetre( ) {

this.setLayout(null);

this.setSize( new Dimension(400, 300) );

this.setTitle("Classe anonyme pour la fenêtre,le panneau et le bouton"); this.setVisible(true);

Button1.addMouseListener( new java.awt.event.MouseAdapter( ) {

public void mouseClicked(MouseEvent e) {

Button1.GestionMouseClicked(e); }

} );

panel1.addMouseListener( new java.awt.event.MouseAdapter( ) {

public void mouseClicked(MouseEvent e) { if(e.getClickCount( )==1)

panel1.GestionMouseClicked(e);

Ecoutt 0

Classes anonymes héritant de MouseAdapter

else

panel1.GestionMouseDblClicked(e); }

} );

this.addMouseListener( new java.awt.event.MouseAdapter( ) {

public void mouseClicked(MouseEvent e) { if(e.getClickCount()==1) Fenetre.this.GestionMouseClicked(e); else Fenetre.this.GestionMouseDblClicked(e); } } );

this.addWindowListener( new java.awt.event.WindowAdapter( ) { public void windowClosing(WindowEvent e)

{ Fenetre.this.GestionWindowClosing(e); } } ); }

void GestionWindowClosing(WindowEvent e) {

System.exit(0); }

void GestionMouseClicked(MouseEvent e) { this.setBackground(Color.blue);

}

void GestionMouseDblClicked(MouseEvent e) { this.setBackground(Color.pink);

} }

AppliUneFrameClick3() {

Fenetre Fiche3 = new Fenetre(); }

public static void main(String[ ] args) { new AppliUneFrameClick3( );

} }

Identique au code de la version précédente

IHM - Awt

: Saisie de renseignements

Documents relatifs