Wie kann man Mausereignisse abfragen?

Mausereignisse (MouseEvents) werden durch das Interface MouseListener beobachtet. Es definiert fünf Methoden für deren Behandlung.

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.JFrame;

public class Mausereignisse extends JFrame implements MouseListener {

    public Mausereignisse() {
        this.addMouseListener(this);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setTitle("Maus Ereignisse");
        this.setSize(600, 400);
        this.setLocationRelativeTo(null);
        this.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) {
        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 extends JFrame {
    //...
    this.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;

public class Mausbewegungsereignisse extends JFrame
        implements MouseMotionListener {

    public Mausbewegungsereignisse() {
        this.addMouseMotionListener(this);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setTitle("Maus Ereignisse");
        this.setSize(600, 400);
        this.setLocationRelativeTo(null);
        this.setVisible(true);
    }

    public static void main(String[] args) {
        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:

//...
this.addMouseWheelListener(e -> System.out.println("Mausrad bewegt"));
//...

1) Eine Ausnahme hiervon bildet die Klasse java.awt.TrayIcon.