Pour toute suggestion : webmaster@debutantprogjava.com
Comprendre la programmation Graphique à travers des exemples en java

D.12 Evènements liés à la souris, au clavier et à la fenêtre

D.12.1 Evènements liés à la souris.

Nous avons déjà vu comment traiter les évènements liés à la souris. Les méthodes correspondantes font partie de l'interface MouseListener. Ces méthodes sont :

mousseClicked() pour le clic
mousePressed() pour l'appui du bouton de la souris
mouseReleased() pour le relachement d'un bouton de la souris
mouseEntered() pour l'entrée de la souris dans un composant (exemple fenêtre)
mouseExited() pour la sortie de la souris d'un composant

Il existe d'autres évènements liés à la souris traités par 2 méthodes:

la méthode mouseMove() pour le déplacement de la souris sur un composant lorsqu'aucun bouton n'est enfoncé
la méthode mouseDragged() pour le déplacement de la souris sur un composant lorsqu'un bouton reste enfoncé pendant le déplacement

Ces deux méthodes appartiennent à l'interface MouseMotionListener

 EXEMPLE 1 : Rappel interface MouseListener

1.     import javax.swing.*; import java.awt.event.*;
2.     import java.awt.*; 
3.     
4.     class Fenetre extends JFrame implements MouseListener
5.     {
6.          private JLabel etiket; private Container c;
7.          public Fenetre()
08.         {
09.              setTitle("evenement souris");
10.              setSize(400, 200);
11.              
12.              c = getContentPane(); c.setLayout(new FlowLayout() );
13.              etiket = new JLabel(); 
14.              c.add(etiket);  
15.              
16.              addMouseListener(this);
17.              setDefaultCloseOperation(3);
18.         }
19.         
20.         public void mouseClicked(MouseEvent m)
21.         {
22.               etiket.setText("Clic sur le point :" + m.getX() + ", " + m.getY() );
23.         }
24.          
25.         public void mousePressed(MouseEvent m)
26.         {
27.              System.out.println("Appui sur un bouton de la souris");
28.         }
29.         
30.         public void mouseReleased(MouseEvent m)
31.         {
32.              System.out.println("Relachement d'un bouton de la souris");
33.         }
34.         
35.         public void mouseEntered(MouseEvent m)
36.         {
37.              etiket.setText("La souris entre dans la fenêtre");
38.         }
39.         
40.         public void mouseExited(MouseEvent m)
41.         {
42.              etiket.setText("La souris sort de la fenêtre");
43.         }
44.               
45.    }
46.           
47.    public class EvenementSouris
48.    {
49.         public static void main(String [] args)
50.         {
51.              JFrame f = new Fenetre();
52.              f.setVisible(true);
53.         }
54.    }


Compilez puis exécutez ce programme. Il sera affiché :

Une fenêtre vide. En fait, elle contient une étiquette vide. Faîtes entrer la souris dans cette fenêtre, et il sera affiché : La souris entre dans la fenêtre. Faîtes sortir la souris de la fenêtre et il sera affiché : La souris sort de la fenêtre .
Cliquez sur la fenêtre et il sera affiché clic sur le point : x, y x et y étant bien entendu, les coordonnées du point sur lequel on a cliqué.Mais en même temps, sur la fenêtre console, il sera affiché :
Appui sur un bouton de la souris
Relachement d'un bouton de la souris

Explications :

Le clic de la souris est traité par la méthode : mouseClicked() ligne 20 : La méthode setText() permet de donner un texte qui s'affiche sur le label etiket(ligne 22). Ce texte se trouve (Clic sur le point ...)dans les parenthèses de la méthode.
Mais nous avons aussi les méthodes getX() et getY() qui fournissent respectivement l'abscisse et l'ordonnée du point sur lequel on clique.

Un clic est un appui, suivi d'un relachement sans que la souris ait bougé.

L'appui de la souris est traitée par la méthode mousePressed() ligne 25. En ligne 27 : la seule instruction de cette méthode permet d'afficher sur la fenêtre console, la phrase : Appui sur un bouton de la souris

Le relachement de la souris est traitée par la méthode mouseReleased() ligne 30. En ligne 32 : la seule instruction de cette méthode permet d'afficher sur la fenêtre console : Relachement d'un bouton de la souris

L'entrée de la souris dans un composant (ici, la fenêtre) est traitée par la méthode mouseEntered() ligne 35. EN ligne 37 : la seule instruction de cette méthode permet d'afficher en fenêtre graphique, la phrase : La souris entre dans la fenêtre

La sortie de la souris d'un composant est traitée par la méthode mouseExited() ligne 40. En ligne 42 : la seule instruction de cette méthode permet d'afficher en fenêtre graphique, la phrase : La souris sort de la fenêtre



Ce qui est décrit ci-dessu est bien beau. Mais le clic, qu'il vienne du bouton droit ou du bouton gauche, produit le même effet. Même dans le cas d'un troisième bouton de la souris, c'est du pareil au même comme on dit dans le langage populaire. Or nous savons bien que le clic du bouton droit sert surtout à faire apparaître un menu surgissant. Il faut donc savoir identifier le bouton source du clic.

Il y a aussi le double clic. Incontournable dans un logiciel. Comment le déceler ? ...

 EXEMPLE 2 : 

1.     import javax.swing.*; import java.awt.event.*;
2.     import java.awt.*; 
3.     
4.     class Fenetre extends JFrame implements MouseListener
5.     {
6.          private JLabel etiket; private Container c;
7.          public Fenetre()
08.         {
09.              setTitle("evenement souris");
10.              setSize(400, 200);
11.              
12.              c = getContentPane(); c.setLayout(new FlowLayout() );
13.              etiket = new JLabel(); 
14.              c.add(etiket);  
15.              
16.              addMouseListener(this);
17.              setDefaultCloseOperation(3);
18.         }
19.          
20.         public void mouseClicked(MouseEvent m)
21.         {
22.              if( (m.getModifiers() & InputEvent.BUTTON1_MASK) != 0 )
23.              System.out.println("clic avec bouton gauche");
24.              
25.              if( (m.getModifiers() & InputEvent.BUTTON2_MASK) != 0 )
26.              System.out.println("clic avec bouton milieu");
27.              
28.              if( (m.getModifiers() & InputEvent.BUTTON3_MASK) != 0 )
29.              System.out.println("clic avec bouton droit");
30.              
31.              if( m.getClickCount() == 2)
32.              etiket.setText("Double clic"); 
33.         }
34.         
35.         public void mousePressed(MouseEvent m) {}
36.         public void mouseReleased(MouseEvent m) {}
37.         public void mouseEntered(MouseEvent m) {}
38.         public void mouseExited(MouseEvent m) {}
39.         
40.    }
41.        
42.    public class EvenementSouris2
43.    {
44.         public static void main(String [] args)
45.         {
46.              JFrame f = new Fenetre();
47.              f.setVisible(true);
48.         }
49.    }
Compilez puis exécutez ce programme. Il sera affiché :

Une fenêtre vide.

Cliquez sur le bouton gauche, il sera affiché en fenêtre console : clic avec bouton gauche

Cliquez sur le bouton droit, il sera affiché en fenêtre console : clic avec bouton droit

Cliquez sur le bouton du milieu, il sera affiché en fenêtre console : clic avec bouton milieu

Double cliquez avec le bouton gauche. Il sera affiché sur la fenêtre graphique : Double clic.
En même temps, il sera affiché sur la fenêtre console :
clic avec bouton gauche
clic avec bouton gauche

Double cliquez avec le bouton droit. Il sera affiché sur la fenêtre graphique : Double clic.
En même temps, il sera affiché sur la fenêtre console :
clic avec bouton droit
clic avec bouton droit

Explications :

 EXEMPLE 3 : 

1.     import javax.swing.*; import java.awt.event.*;
2.     import java.awt.*; 
3.     
4.     class Fenetre extends JFrame implements MouseMotionListener
5.     {
6.          private JLabel etiket; private Container c;
7.          public Fenetre()
08.         {
09.              setTitle("evenement souris");
10.              setSize(400, 200);
11.              
12.              c = getContentPane(); c.setLayout(new FlowLayout() );
13.              etiket = new JLabel("message"); 
14.              c.add(etiket);  
15.              
16.              addMouseMotionListener(this);
17.              setDefaultCloseOperation(3);
18.         }
19.          
20.         public void mouseMoved(MouseEvent m)
21.         {
22.              etiket.setText("la souris bouge");
23.         }
24.         
25.         public void mouseDragged(MouseEvent m)
26.         {
27.              etiket.setText("glisser-déposer");
28.         }
29.         
30.    }
31.     
32.    public class EvenementSouris2
33.    {
34.         public static void main(String [] args)
35.         {
36.              JFrame f = new Fenetre();
37.              f.setVisible(true);
38.         }
39.    }
Compilez puis exécutez ce programme. Il sera affiché :

Une fenêtre contenant une étiquette avec le mot message dessus.

Faîtes bouger la souris sans clic. Aussitôt, sur l'étiquette, la phrase La souris bouge s'inscrit.

Appuyez sur l'un des boutons, puis faîtes bouger la souris, aussitôt, le message devient, glisser-déposer

Explications :

D.12.2 Evènements liés aux touches du clavier.

Lorsque vous tapez sur les touches du clavier, par exemple pour entrer du texte dans une fenêtre de dialogue, les caractères correspondants apparaissent dans la fenêtre. Parce que cette action est automatique gérée par Java.

Mais si vous voulez par exemple dessiner ou afficher des caractères directement dans une fenêtre, vous devez faire appel à des méthodes spécifiques.

On traite la manipulation des touches du clavier grâce à 3 méthodes qui sont :

1. KeyPressed() --> pour le fait d'appuyer sur une touche.
2. KeyReleased() --> pour le fait de relâcher une touche
3. KeyTyped() --> pour le fait d'avoir tapé sur une touche du clavier.

Bien entendu, vous l'avez certainement compris, tapez sur une touche = appui + relâchement de la touche.

KeyTyped() = KeyPressed() + KeyReleased()

Ces trois méthodes appartiennent à l'interface KeyListener.

Bien entendu, il faudra aussi identifier la touche du clavier qui a été manipulée. Les méthodes getKeyChar() et getKeyCode() de la classe KeyEvent permettent d'atteindre ce but. Dans cette classe, il existe des constantes permettant d'identifier des touches.
Par exemple :

VK_0, VK_1, VK_2, ... VK_9 pour les touches numériques au dessus des touches a, z, e, r, t et y.

VK_NUMPAD0, VK_NUMPAD1, VK_NUMPAD2, ... VK_NUMPAD9 pour les touches numériques situées à droite du clavier.

 EXEMPLE 4 : 

01.     import javax.swing.*; import java.awt.event.*;
02.     import java.awt.*; 
03.     
04.     class Fenetre extends JFrame implements KeyListener
05.     {
06.         private JLabel etiket1, etiket2, etiket3; private Container c;
07.         
08.         public Fenetre()
09.         {
10.              setTitle("evenement clavier");
11.              setSize(400, 200);
12.              c = getContentPane();
13.              
14.              etiket1 = new JLabel("touche apppuyée"); 
15.              c.add(etiket1, "North"); 
16.              
17.              etiket2 = new JLabel("touche relâchée"); 
18.              c.add(etiket2); 
19.               
20.              etiket3 = new JLabel("touche tapée"); 
21.              c.add(etiket3, "South"); 
22.          
23.              addKeyListener(this);
24.              setDefaultCloseOperation(3);
25.         }
26.          
27.         public void keyPressed(KeyEvent k)
28.         {
29.              etiket1.setText("Vous avez appuyé sur la touche " + k.getKeyChar());
30.         }
31.         
32.         public void keyReleased(KeyEvent k)
33.         {
34.              etiket2.setText("Vous avez relaché la touche " + k.getKeyChar());
35.         }
36.          
37.         public void keyTyped(KeyEvent k)
38.         {
39.              etiket3.setText("Vous avez tapé la touche " + k.getKeyChar());
40.         }
41.         
42.    }
43.      
44.    public class EvenementClavier
45.    {
46.         public static void main(String [] args)
47.         {
48.              JFrame f = new Fenetre();
49.              f.setVisible(true);
50.         }
51.    }

Compilez puis exécutez ce programme, il sera affiché :

Une fenêtre contenant 3 labels dont les textes sont respectivements : touche apppuyée - touche relâchée - touche tapée

Ces labels sont situés respectivements au nord, au centre et au sud de la fenêtre.

tapez sur la touche a par exemple. Aussitôt, les textes des labels deviennent respectivement :
Vous avez appuyé sur la touche a
Vous avez relâché la touche a
Vous avez tapé la touche a

Explications :

En dehors de toute précision, le conteneur c (ligne 12) reçoit les composants façon BorderLayout.

Ligne 15 : etiket1 se trouve au nord.
Ligne 18 : etiket2 se trouve au centre. On aurait pu écrire : c.add(etiket2, "Center"); Mais le centre est la position par défaut. Donc, inutile de préciser.
Ligne 21 : etiket3 se trouve au sud.

Maintenant, les méthodes de l'interface keyListener

Ligne 27 : méthode keyPressed() pour traiter l'appui sur une touche du clavier. En appuyant sur la touche a, on obtient sur le le label etiket1, (ligne 29), la phrase Vous avez appuyé sur la touche a La méthode keyGetChar() renvoi le caractère qu'on trouve sur la touche appuyée.

Ligne 32 : méthode keyReleased() pour traiter le relâchement d'une touche du clavier. En relachant la touche a, on obtient sur le le label etiket2, (ligne 34), la phrase Vous avez relâché la touche a La méthode keyGetChar() renvoi le caractère qu'on trouve sur la touche relachée.

Ligne 37 : méthode keyTyped() pour traiter le fait de taper une touche du clavier. En tapant la touche a, on obtient sur le le label etiket3, (ligne 39), la phrase Vous avez tapé la touche a La méthode keyGetChar() renvoi le caractère qu'on trouve sur la touche tapée.

Je rappelle, si besoin est, que appuyer sur une touche + relâcher cette touche = taper la touche.

 EXEMPLE 5 : 

01.     import javax.swing.*; import java.awt.event.*;
02.     import java.awt.*; 
03.     
04.     class Fenetre extends JFrame implements KeyListener
05.     {
06.         private JLabel etiket; private Container c;
07.         
08.         public Fenetre()
09.         {
10.              setTitle("evenement clavier");
11.              setSize(600, 200);
12.              c = getContentPane();
13.              
14.              etiket = new JLabel("Colorez en appuyant sur r = rouge, v = vert, b = bleu"); 
15.              c.add(etiket1, "North"); 
16.              
17.              addKeyListener(this);
18.              setDefaultCloseOperation(3);
19.         }
20.          
21.         public void keyPressed(KeyEvent k)
22.         {
23.              if( k.getKeyChar() == 'r') 
24.              c.setBackground(new Color(255, 0, 0) );
25.              
26.              if( k.getKeyChar() == 'v') 
27.              c.setBackground(new Color(0, 255, 0) );
28.              
29.              if( k.getKeyChar() == 'b') 
30.              c.setBackground(new Color(0, 0, 255) );
31.         }
32.         
33.         public void keyReleased(KeyEvent k) {}
34.         public void keyTyped(KeyEvent k) {}
35.         
36.    }
37.      
38.    public class EvenementClavier2
39.    {
40.         public static void main(String [] args)
41.         {
42.              JFrame f = new Fenetre();
43.              f.setVisible(true);
44.         }
45.    }

Compilez puis exécutez ce programme, il sera affiché :

Une fenêtre avec un label contenant le texte : Colorez en appuyant sur r = rouge, v = vert, b = bleu

appuyez sur la touche r et la fenêtre se colore en rouge.

appuyez sur la touche v et la fenêtre se colore en vert.

appuyez sur la touche b et la fenêtre se colore en bleu.

Explications :

Ici, on a seulement redéfini la méthode keyPressed(), c'est à dire, la méthode traitant l'appui d'une touche.

Ligne 23 : si la touche appuyée est r, alors (ligne 24) : le conteneur c est coloré en rouge.

Ligne 26 : si la touche appuyée est r, alors (ligne 27) : le conteneur c est coloré en rouge.

Ligne 29 : si la touche appuyée est r, alors (ligne 30) : le conteneur c est coloré en rouge.

Bien entendu, les deux autres méthodes de l'interface KeyListener (keyReleased() et keyTyped() ) doivent être redéfiniens à vide.


D.12.3 Evènements liés aux fenêtres

Les actions sur une fenêtre graphique sont traitées par les méthodes suivantes :

windowClosing() --> fenêtre en cours de fermeture.
windowOpened() --> fenêtre ouverte
windowClosed() --> fenêtre fermée
windowIconified() --> réduction de la fenêtre en icone.
windowDeiconified() --> passage de l'état d'icone en état de fenêtre.
windowActivated() --> fenêtre activée
windowDeactivated() --> fenêtre désactivée.

Ces méthodes appartiennent à l'interface WindowListener laquelle possède une classe adaptatrice WindowAdapter permettant de ne redéfinir que certaines méthodes.

 EXEMPLE 6 : 

01.     import javax.swing.*; import java.awt.event.*;
02.     import java.awt.*; 
03.     
04.     class Fenetre extends JFrame implements  WindowListener
05.     {
06.                 
07.         public Fenetre()
08.         {
09.              setTitle("evenement fenetre");
10.              setSize(600, 200);
11.                            
12.              addWindowListener(this);
13.              setDefaultCloseOperation(3);
14.         }
15.           
16.         public void windowClosing(WindowEvent w)
17.         {
18.              System.out.println("fentre en cours de fermeture");
19.         }
20.          
21.         public void windowOpened(WindowEvent w)
22.         {
23.              System.out.println("ouverture fentre");
24.         }
25.         
26.         public void windowIconified(WindowEvent w)
27.         {
28.              System.out.println("fentre en icone");
29.         }
30.         
31.         public void windowDeiconified(WindowEvent w)
32.         {
33.              System.out.println("icone en fenetre");
34.         }
35.         
36.         public void windowClosed(WindowEvent w)
37.         {
38.              System.out.println("fentre fermee");
39.         }
40.         
41.         public void windowActivated(WindowEvent w)
42.         {
43.              System.out.println("fentre activee");
44.         }
45.         
46.         public void windowDeactivated(WindowEvent w)
47.         {
48.              System.out.println("fentre desactivee");
49.         }
50.          
51.    }
52.         
53.    public class TesterEvenementFenetres
54.    {
55.         public static void main(String [] args)
56.         {
57.             JFrame f = new Fenetre();
58.             f.setVisible(true);
59.         }
60.    }


Compilez puis exécutez ce programme, il sera affiché : Une fenêtre graphique

Dans la fenêtre console, vous voyez affichée :
Fenetre ouverte et en dessous, s'affiche fenetre active

Cliquez sur la fenêtree console. La fentre graphique n'est plus active. On voit alors s'afficher sur la fenêtre console,
fentre désactivee

Cliquez sur la fenêtre graphique. On voit s'afficher à nouveau : fentre active

Réduisez la fenêtre à l'état d'icone. on voit s'afficher :
fenêtre désactivée et en dessous : fentre en icone


Evènements sur les souris, touches du clavier et fenêtres.
Pub : www.affnet.fr
.....