Les événements de bas niveau

Les événements de bas niveau

Suivi des déplacements de la souris

Nous nous contentons du gestionnaire par défaut de la fenêtre. Pour identifier le bouton concerné par un événement souris, nous aurions pu utiliser la référence à la source fournie par getSource. Cela aurait toutefois nécessité de conserver les références de tous les boutons créés dynamiquement. Ici, nous avons choisi d’exploiter la chaîne de commande de la source ; elle s’obtient à l’aide de la méthode getActionCommand qui figure dans toutes les classes dérivées de AbstractButton, donc en particulier dans JButton1. import javax.swing.* ; import java.awt.* ; import java.awt.event.* ; class MaFenetre extends JFrame implements MouseListener, ActionListener { static final Color couleurs[] = {Color.red, Color.yellow, Color.green, Color.blue} ; public MaFenetre () { setTitle (« Evenements souris ») ; setSize (300, 150) ; contenu = getContentPane() ; contenu.setLayout (new FlowLayout()) ; boutonCreation = new JButton (« CREATION_BOUTONS ») ; contenu.add (boutonCreation) ; boutonCreation.addActionListener (this) ; } public void actionPerformed (ActionEvent e) { if (e.getSource() == boutonCreation) { numBouton++ ; JButton b = new JButton (« B »+numBouton) ; contenu.add (b) ; b.addMouseListener (this) ; } } public void mousePressed (MouseEvent e) {} public void mouseReleased (MouseEvent e) {} public void mouseClicked (MouseEvent e) {} public void mouseEntered (MouseEvent e) { Object source = e.getSource () ; JButton bSource ; if (source instanceof JButton) // par precaution { bSource = (JButton)source ; String ch = bSource.getActionCommand() ; if (ch.charAt(0) == ‘B’) { int n = Integer.parseInt (ch.substring(1)) ; int numCoul = n % couleurs.length ; bSource.setBackground (couleurs[numCoul]) ; } } } 1. Bien qu’elle fournisse le même résultat, il s’agit bien d’une méthode différente de getActionCommand de la classe ActionEvent.   public void mouseExited (MouseEvent e) { Object source = e.getSource () ; JButton bSource ; if (source instanceof JButton) // par precaution { bSource = (JButton)source ; String ch = bSource.getActionCommand() ; if (ch.charAt(0) == ‘B’) bSource.setBackground (Color.white) ; } } private Container contenu ; private JButton boutonCreation ; private int numBouton = 0 ; } public class BtDynCol { public static void main (String args[]) { MaFenetre fen = new MaFenetre() ; fen.setVisible (true) ; } } Dans les méthodes mouseEntered et mouseExited, nous nous sommes assurés que la source était bien d’un type JButton (opérateur instanceof) avant de lui appliquer la méthode getActionCommand. Ce n’était pas indispensable ici, mais cela pourrait le devenir si l’on modifiait le programme en écoutant les événements souris générés par d’autres composants

Dessin par le clavier

(1) Écrire un programme permettant de dessiner à la volée dans une fenêtre en utilisant les touches fléchées du clavier : Le dessin commencera en un point donné de la fenêtre (ici 20 × 20). On pourra fixer un incrément de plusieurs pixels (ici 5) pour chaque appui sur une touche. 138 geneli~1.book Page 242 Lundi, 10. juillet 2006 12:46 12 © Éditions Eyrolles 243 Exercice 138 Dessin par le clavier (1) Comme il s’agit ici de dessin à la volée, nous aurions pu opérer directement sur la fenêtre (ou plutôt sur son contenu). Mais, pour conserver au programme un caractère plus général, nous avons préféré dessiner sur un panneau. La position de début du dessin est fixée par les valeurs initiales des variables x et y qui désignent ensuite la position courante de fin de dessin. L’incrément du déplacement est fixé par les constantes incx et incy. Nous pouvons faire de la fenêtre l’écouteur des événements clavier. En effet, ceux-ci seront transmis à la fois au panneau et à son conteneur, c’est-à-dire la fenêtre. Ici, nous redéfinissons la méthode keyPressed, ce qui revient à dire que nous décidons que les déplacements seront effectués lors de l’appui des touches. La méthode getKeyCode de la classe KeyEvent nous permet de connaître le code de touche virtuelle concerné. Nous utilisons les constantes telles que KeyEvent.KEY_UP pour identifier les touches fléchées. import javax.swing.* ; import java.awt.* ; import java.awt.event.* ; class MaFenetre extends JFrame implements KeyListener { static int incx=5, incy=5 ; public MaFenetre () { setTitle (« DESSIN AU CLAVIER ») ; setSize (350, 150) ; addKeyListener (this) ; pan = new JPanel () ; getContentPane().add (pan) ; } public void keyPressed (KeyEvent e) { int code = e.getKeyCode () ; switch (code) { case KeyEvent.VK_UP : dx = 0 ; dy = -incy ; bouge = true ; break ; case KeyEvent.VK_DOWN : dx = 0 ; dy = incy ; bouge = true ; break ; case KeyEvent.VK_LEFT : dx = -incx ; dy = 0 ; bouge = true ; break ; case KeyEvent.VK_RIGHT : dx = incx ; dy = 0 ; bouge = true ; break ; } if (bouge) { Graphics g = pan.getGraphics() ; g.drawLine (x, y, x+dx, y+dy) ; g.dispose() ; x += dx ; y += dy ; } } public void keyReleased (KeyEvent e) {} public void keyTyped (KeyEvent e) {} private JPanel pan ; private int x=20, y=20 ; private int dx, dy ; private boolean bouge ; }

Synthèse : dessin par le clavier 

Les touches fléchées provoqueront donc toujours le déplacement du curseur. Pour ce faire, il est nécessaire de pouvoir effacer le curseur de son ancienne position et de le tracer dans sa nouvelle position. Pour y parvenir, le plus simple consiste à utiliser le mode de dessin dit XOR, en le paramétrant par la couleur de fond du panneau. Dans ce cas, en effet : • le dessin sur une zone ayant la couleur de fond est fait avec la couleur courante, • le même dessin effectué deux fois de suite efface le premier. En ce qui concerne l’éventuel tracé du trait, il faut cette fois tenir compte de l’état de la touche Shift. On l’obtient avec la méthode getModifiers qui fournit un entier dans lequel un bit de rang InputEvent.SHIFT_MASK correspond à la touche Shift. On notera que si l’on traçait ce trait dans le mode XOR, on effacerait le point situé à l’intersection des deux segments représentant le curseur. On pourrait éventuellement prévoir d’afficher Modifier le programme de l’exercice , de manière qu’on puisse interrompre le dessin et le reprendre en un autre point : Un motif (en forme de x) permettra de visualiser la position courante du « curseur ». Les touches fléchées agiront toujours sur la position du curseur ; en revanche, le dessin n’aura lieu que si la touche Shift est enfoncée. Note : cet exercice nécessite (en plus des prérequis mentionnés en début de ce chapitre et du précédent) de savoir ce qu’est un « mode de dessin » et comment le modifier. à nouveau ce point mais cette démarche serait dépendante du motif utilisé pour le curseur. Le plus raisonnable consiste à afficher le trait dans le mode de dessin normal qu’on obtient par appel de setPaintMode. Initialement, aucun curseur ne s’affiche dans la fenêtre. En effet, nous ne pouvons pas effectuer ce tracé dans le constructeur de la fenêtre car aucun contexte graphique ne serait encore disponible pour le panneau (la méthode getGraphics fournirait la valeur null). Par souci de simplicité, nous nous sommes donc contentés d’afficher ce curseur après la première action sur une touche fléchée (nous recourons à un indicateur booléen nommé debut).

Formation et coursTélécharger le document complet

Télécharger aussi :

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *