Mausereignisse¶
Bei den Mausereignissen unterscheiden wir zwei Arten von Ereignissen:
- Ereignisse der Maus, die einmalig von der Maus ausgelöst werden. Dazu gehören die Ereignisse, wenn die linke Maustaste gedrückt wird, wenn die gedrückte Taste losgelassen wird, wenn sich die Maus auf eine Komponente bewegt, die sich an den Mauslistener angemeldet hat oder wenn der Mauszeiger diese Komponente wieder verlässt.
- Ereignisse der Maus, die durch Bewegung der Maus permanent ausgelöst werden. Dazu gehört die Mausbewegung selbst oder auch die Bewegung der Maus bei gedrückter Taste.
Die erste Art von Mausereignissen können wir behandeln, indem wir
- den
MouseListenerimplementieren und - eine Komponente (z.B. ein
JPanel) an denMouseListeneranmelden.
Die zweite Art von Maus(-Bewegungs-)ereignissen können wir behandeln, indem wir
- den
MouseMotionListenerimplementieren und - eine Komponente (z.B. ein
JPanel) an denMouseMotionListeneranmelden.
Wir betrachten dieses Semester aber nur den MouseListener.
Der MouseListener¶
Wir betrachten ein einfaches Beispiel mit JPanels, die in einem size x size-Gitter angeordnet sind. Diese JPanels haben alle eine zufällig erzeugte Hintergrundfarbe (siehe randomColor(). In dieser Klasse implementieren wir zunächst den MouseListener, d.h. wir fügen in den Klassenkopf implements MouseListener ein und lassen durch Eclipse die zu implementierenden Methoden einfügen:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | |
Wie wir sehen, sind es nun nicht mehr nur eine Methode, wie beim ActionListener, sondern gleich fünf Methoden, die wir implementieren können. Unsere zunächst einfachste Implementierung (aber zumindest am Anfang stets empfohlen!) ist die einfache Ausgabe auf die Konsole. Wir dürfen auf keinen Fall vergessen, uns an den MouseListener anzumelden! In diesem Beispiel melden wir das panel, das eine Objektvariable ist, an den MouseListener an (siehe Zeile 49).
Wir könnten auch das gesamte Fenster an den MouseListener anmelden. Dazu würden wir in den Konstruktor von Mausereignisse ein this.addMouseListener(this); einfügen. Damit würde this (also das Objekt von Mausereignisse, welches ja selbst ein JFrame ist) an den MouseListener angemeldet. Die Methode addMouseListener() erwartet ein Objekt der Implementierung von MouseListener. Das wäre ebenfalls this, da der MouseListener in der Klasse Mausereignisse implementiert ist.
Weil jedoch später der Umgang mit den Mausereignissen etwas leichter ist, melden wir das panel-Objekt an den MouseListener an. Wir hätten auch jedes einzelne JPanel anmelden können. Das zeigen wir später.
Die Methoden des MouseListener¶
Nun ist der MouseListener implementiert und das panel-Objekt ist an den MouseListener angemeldet. Wir können nun die einzelnen Methoden des MouseListener ausprobieren:
mousePressed()wird aufgerufen, wenn die (linke) Maustaste heruntergedrückt wird. Drücken Sie die Maustaste und halten Sie sie gedrückt. In der Konsole erscheintmousePressed.mouseReleased()wird aufgerufen, wenn die (linke) Maustaste nach dem Drücken wieder losgelassen wird. Lassen Sie die Maustaste, nachdem auf der KonsolemousePressederschienen ist, wieder los. In der Konsole erscheintmouseReleased.mouseClicked()wird aufgerufen, wenn erstmousePressed()und dannmouseReleased()aufgerufen wurde.mouseClicked()beschreibt also die Kombination aus Maustaste gedrückt und Maustaste losgelassen - einen Maus-Klick also.mouseEntered()wird aufgerufen, wenn Sie den Mauszeiger auf die Komponente bewegen, die an denMouseListenerangemeldet ist. Wenn Sie in unserem Fall also die Maus in die Zeichenflächecanvasbewegen, dann wird die MethodemouseEntered()einmalig ausgeführt.mouseExited()wird aufgerufen, wenn Sie den Mauszeiger von der Komponente wieder wegbewegen, die an denMouseListenerangemeldet ist. Wenn Sie in unserem Fall also die Maus von der Zeichenfläche in die Titelleiste des Fensters oder ganz aus dem Fenster (derContentPane) bewegen, dann wird die MethodemouseExited()einmalig ausgeführt.
Übung
Probieren Sie intensiv aus, wann welche Methoden aufgerufen werden!
1. Schaffen Sie es, dass zwar mouse pressed und danach mouse released auf der Konsole erscheint, nicht aber mouse clicked? Wann ist das der Fall?
2. Erzeugen Sie folgende Ausgabereihenfolge auf der Konsole: mouse pressed, mouse exited, mouse released, mouse entered!
Objektmethoden der Klasse MouseEvent¶
All diesen Methoden wird ein MouseEvent als Parameter übergeben. Dieses Objekt besitzt einige nützliche Objektmethoden. Die wichtigsten dabei sind sicherlich die Auskünfte darüber, wo das Mausereignis ausgelöst wurde. Wir betrachten einige Objektmethoden des MouseEvent-Objekts am Beispiel der mouseClicked(MouseEvent e)-Methode.
- die Methode
getX()gibt denx-Wert der Koordinate zurück, bei dem dasMouseEventstattgefunden hat. Die Koordinate bezieht sich auf die Komponente, die an denMouseListener(bzw.MouseMotionListener) angemeldet ist. Das ist auch der Grund, warum wir nicht das gesamte Fenster an denMouseListener(undMouseMotionListener) angemeldet haben. Der Punkt[x=0, y=0]befindet sich bei demCanvas-Objekt in der linken oberen Ecke derContentPane. Der Punkt mit den Koordinaten[x=0, y=0]beim Fenster ist der linke obere Punkt des Fensters, d.h. der linke obere Punkt der Titelleiste. - die Methode
getY()gibt deny-Wert der Koordinate zurück, bei dem dasMouseEventstattgefunden hat (Koordinate der Komponente). - die Methode
getPoint()gibt einPoint-Objekt (vonjava.awt) zurück. EinPoint-Objekt besitzt die sichtbaren Objektvariablenxundyfür die Koordinaten.
Wir probieren beide Möglichkeiten aus, die Koordinaten zu erfragen:
49 50 51 52 53 54 55 56 | |
Beide Ausgaben zeigen (natürlich) die gleichen Koordinaten an, z.B.
mouseClicked bei [x=388 ,y=215]
mouseClicked bei [x=388 ,y=215]
Beachten Sie, dass Sie in allen Methoden, in denen das MouseEvent übergeben wird, die Koordinaten des Ereignisses auslesen können.
Weiterhin kann mithilfe des MouseEvent-Objektes überprüft werden, ob während des auslösenden Mausereignisses eine besondere Taste auf der Tastatur gedrückt wurde, z.B. die Alt-Taste (linke option-Taste beim Mac), die AltGraph-Taste (rechte option-Taste beim Mac), die Ctrl-Taste, oder die Meta-Taste (Windows-Taste bzw. Apple-Taste):
75 76 77 78 79 80 81 82 83 84 85 86 87 88 | |
Probieren Sie die Maus-Klicks bei unterschiedlich gedrückter Taste auf der Tastatur aus!
Mithilfe der Objektmethode getClickCount() lässt sich die Anzahl die Klicks abfragen:
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | |
Nochmal, weil es wichtig ist: alle diese Objektmethoden stehen allen Methoden zur Verfügung, denen ein MouseEvent übergeben wird. Wir können sie also in allen Methoden aus MouseListener (und MouseMotionListener) anwenden.
Farben ändern mit Mausklick¶
Wir implementieren nun die mouseClicked()-Methode, um die Farbe des JPanels zu ändern, in das wir geklickt haben. Um das JPanel zu ermitteln, in das wir geklickt haben, benötigen wir folgende Daten:
- den
x- und deny-Wert der Koordinate, in die wir die Maus innerhalb despanel-Objektes geklickt haben, - die Breite und die Höhe jedes einzelnen JPanels,
- um die Breite und die Höhe jedes einzelnen JPanels zu berechnen, benötigen wir die Höhe und die Breite des
panel-Objektes.
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | |
- In den Zeilen
77und78fragen wir die Koordinaten des Mausklicks ab. - In den Zeilen
79und80ermizteln wir die Breite und Höhe despanel-Objektes. - In den Zeilen
81und82berechnen wir die Breite und Höhe jedes einzelnenJPanels. - In den Zeilen
84und85berechnen wir mit den obigen Informationen den Zeilen- und Spalten-Index des angeklicktenJPanelsimpanels-Array. - Nach Ausgabe aller Informationen auf die Konsole (Zeilen
87-89) wird für dieses angeklickteJPaneldie Hintergrundfarbe neu gesetzt (Zeile90).
Jedes JPanel einzeln anmelden¶
Wir haben den MouseListener an das panel-Objekt angemeldet, das alle JPanels enthält. Wir ändern dies nun und melden stattdessen jedes einzelne JPanel aus dem panels-Array an den MouseListener an. Dies erledigen wir mithilfe einer anonymen Klasse, die den MouseListener implementiert.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | |
Beachten Sie, dass nun nicht mehr die Mausereignisse-Klasse den MouseListener implementiert, sondern die Implementierung innerhalb der anonymen Klasse erfolgt (siehe Zeilen 63-100). Die Anmeldung an den MouseListener erfolgt nun für jedes einzelne JPanel aus dem panels-Array. Jedes dieser JPanel besitzt nun also sein eigenes MouseListener-Objekt.
Übung
Lassen Sie sich erneut die Koordinaten der Mausklicks auf die Konsole ausgeben.