Wie kann man Mausereignisse abfragen?
Mausereignisse werden bei der Bedienung einer Computermaus
ausgelöst. Sie beziehen sich immer auf eine Komponente,
also ein Objekt einer von java.awt.Component
abgeleiteten Klasse1. Damit dort
auf Mausereignisse reagiert werden kann, muss die Komponente
durch Component#addMouseListener(MouseListener)
bei
einem MouseListener
angemeldet werden. Das hierbei
als Parameter übergebene Objekt muss das Interface MouseListener
implementieren. Es definiert fünf Methoden, die
verschiedene Mausereignisse behandeln können. Hierzu
bekommen sie ein MouseEvent
übergeben.
Es wird automatisch erzeugt, wenn die Maus eine der in der u.a. Tabelle aufgeführten Aktionen
durchführt. Es kann - wie jeder andere Parameter -
innerhalb der Methode angesprochen werden. Hierzu definiert MouseEvent
selbst eine Reihe von Methoden, mit denen die Eigenschaften der
Klasse (Anzahl Klicks, Position des Mauszeigers, etc.) abgefragt
werden können.
Signatur | Ausführung |
---|---|
void mouseEntered(MouseEvent e) | Wird ausgeführt, wenn die Maus die Oberfläche der Komponente betritt. |
void mouseExited(MouseEvent e) | Wird ausgeführt, wenn die Maus die Oberfläche der Komponente verlässt. |
void mousePressed(MouseEvent e) | Wird ausgeführt, wenn die Maustaste gedrückt wird. |
void mouseReleased(MouseEvent e) | Wird ausgeführt, wenn die Maustaste losgelassen wird. |
void mouseClicked(MouseEvent e) | Wird ausgeführt, wenn die Maus geklickt (gedrückt und losgelassen) wird. |
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.SwingUtilities;
import javax.swing.JFrame;
public class Mausereignisse implements MouseListener {
public Mausereignisse() {
JFrame frame = new JFrame("Maus Ereignisse");
frame.addMouseListener(this);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(600, 400);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("Mouse " + e.getClickCount() + " times clicked at "
+ e.getPoint());
}
@Override
public void mousePressed(MouseEvent e) {
System.out.println("Mouse " + e.getClickCount() + " times pressed at "
+ e.getPoint());
}
@Override
public void mouseReleased(MouseEvent e) {
System.out.println("Mouse " + e.getClickCount() + " times released at "
+ e.getPoint());
}
@Override
public void mouseEntered(MouseEvent e) {
System.out.println("Mouse entered at " + e.getPoint());
}
@Override
public void mouseExited(MouseEvent e) {
System.out.println("Mouse exited at " + e.getPoint());
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new Mausereignisse());
}
}
Im Beispiel wird ein Fenster in Form eines JFrame
erzeugt. Durch Component#addMouseListener(MouseEvent)
wird der MouseListener
beim Frame registriert. Im
vorliegenden Fall implementiert die Klasse selbst den Listener
und muss somit die fünf Methoden des Interface
konkretisieren.
Ein Ausführen des Beispiels zeigt das Verhalten durch die
Konsolenausgabe. Bemerkenswert ist hierbei, dass MouseEvent#getClickCount()
nicht nur Einfach- und Doppeklicks registriert, sondern, nach
genügend schnellen Tastendrücken, jede beliebige
Anzahl zurückgibt. So können auch Dreifach- oder sogar
Vierfachklicks selektiv registriert werden.
MouseAdapter
In vielen Fällen müssen nur ein oder zwei
Mausereignisse abgefragt werden. Es würde den Code
unnötig verunklären, wenn dann alle fünf Methoden
implementiert werden müssten. Java stellt hierzu die
Adapter-Klasse MouseAdapter
bereit. Sie macht die
Implementierung des vollständigen Interface
überflüssig. Die Verwendung von MouseAdapter
gestattet es, dann nur die jeweils benötigten Methoden zu
überschreiben, um die gewünschte Funktionalität
zu erhalten.
Gerne wird dies in Form einer anonymen
Klasse realisiert.
public class Mausereignisse { //... frame.addMouseListener(new MouseAdapter() { public void mouseReleased(MouseEvent e){ System.out.println("Maus losgelassen"); } }); //... }
Mausbewegungen
Mausbewegungen werden in Java durch ein gesondertes Interface
behandelt, java.awt.event.MouseMotionListener
. Es
definiert zwei Methoden mouseDragged()
und mouseMoved()
.
Die erste Methode wird aufgerufen, wenn die Maus bei
gedrückter Maustaste über der angemeldeten Komponente
bewegt wird, die zweite wenn die Bewegung auf einer Komponente
ohne gedrückter Maustaste ausgeführt wird.
Analog
zum MouseAdapter
gibt es auch für das Abfangen
von Bewegungen eine Adapterklasse, java.awt.event.MouseMotionAdapter
,
mit der es ermöglicht wird, nur eine der beiden Methoden zu
verwenden.
import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener; import javax.swing.JFrame; import javax.swing.SwingUtilities; public class Mausbewegungsereignisse implements MouseMotionListener { public Mausbewegungsereignisse() { JFrame frame = new JFrame("Maus Ereignisse"); frame.addMouseMotionListener(this); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(600, 400); frame.setLocationRelativeTo(null); frame.setVisible(true); } public static void main(String[] args) { SwingUtilities.invokeLater(() -> new Mausbewegungsereignisse()); } @Override public void mouseDragged(MouseEvent e) { System.out.println("Maus gezogen"); } @Override public void mouseMoved(MouseEvent e) { System.out.println("Maus bewegt"); } }
Mausradereignisse
Das Interface MouseWheelListener
lauscht auf die
Drehung des Mausrades und definiert mouseWheelMoved()
.
Da hier nur eine Methode vorhanden ist, ist auch die Definition
einer Adapterklasse nicht sinnfällig. Dafür kann seit
Java 8 jedoch ein Lambda
Ausdruck formuliert werden:
//... frame.addMouseWheelListener(e -> System.out.println("Mausrad bewegt")); //...
1) Eine Ausnahme hiervon bildet die Klasse java.awt.TrayIcon
.
Wenn Ihnen javabeginners.de gefällt, freue ich mich über eine Spende an diese gemeinnützigen Organisationen.