Koordinatengrafik mit Java
HomeAufgabenDruckenJava-Online

Mouse-Events

Mit Mouse-Events können mausgesteuerte Aktionen ausgelöst werden. Die Maus wird in einem Grafikfenster durch den MouseListener und den MouseMotionListener überwacht. Der MouseListener reagiert auf die Bedienung der Maustaste (Mausklick), MouseMotionListener kann die Mausbewegungen erfassen.

Methoden des MouseListeners

mouseClicked() Maustaste gedrückt und losgelassen
mouseEntered() Mauscursor tritt in eine Komponente ein
mouseExited() Mauscursor verlässt die Komponente
mousePressed() Maustaste gedrückt
mouseReleased() Maustaste losgelassen
In der Praxis funktioniert die Methode mousePressed() zuverlässiger als die Methode mouseClicked(), die zu kurze Klicks nicht registriert.

Methoden des MouseMotionListeners

mouseMoved() Maus wird bewegt
mouseDragged() Maus wird mit gedrückter Taste bewegt


Im ersten Beispiel werden die Koordinaten des Mausklicks erfasst und an dieser Position kleine Kreise gezeichnet.

// MouseEvent1.java 

import ch.aplu.util.*;
import java.awt.*;
import java.awt.event.*;

public class MouseEvent1 extends GPanel
{
  public MouseEvent1()
  {
    color(Color.red);

    addMouseListener(new MouseAdapter()
    {
      public void mousePressed(MouseEvent e)
      {
        move(toWindowX(e.getX())toWindowY(e.getY()));
        fillCircle(0.01);
      }
    });
  }
  
  public static void main(String[] args)
  {
    new MouseEvent1();
  }
}
 


Erklärungen zum Programmcode
:

Die Mouse-Events rufen die entsprechenden Methoden der Klasse MouseAdapter auf. Diese Methoden enthalten allerdings keinen Code. Wir überschreiben diese leeren Methoden und führen darin die gewünschte Aktion aus. Die Syntax mit den Klammern ist etwas gewöhnungsbedürftig.

Mit e.getX() und e.getY() werden die Koordinaten beim Drücken der Maustaste zurückgegeben.

Die Methode toWindowX() und toWindowY() dienen zur Umrechnung von Bildschirmkoordinaten zu den Koordinaten des GPanels

Anstatt getX() und getY() kann auch getPoint() verwendet werden. Die Klasse Point2D erzeugt einen Punkt mit den Koordinaten (x, y). Die Methode getPoint() erfasst beide Koordinaten. Der zugehörige Programmausschnitt sieht dann wie folgt aus:

    addMouseListener(new MouseAdapter()
    {
      public void mousePressed(MouseEvent e)
      {
        move(toWindow(e.getPoint()));
        fillCircle(0.01);
      }
    });
 

 

Beispiel 2: Freihandzeichnen mit gedrückter Maustaste

// MouseEvent2.java

import ch.aplu.util.*;
import java.awt.*;
import java.awt.event.*;

public class MouseEvent2 extends GPanel
{
  private double x0, y0;
  private double x1, y1;

  public MouseEvent2()
  {
    addMouseListener(new MouseAdapter()
    {
      public void mousePressed(MouseEvent e)
      {
        x0 = toWindowX(e.getX());
        y0 = toWindowY(e.getY());
      }
    });

    addMouseMotionListener(new MouseMotionAdapter()
    {
      public void mouseDragged(MouseEvent e)
      {
        x1 = toWindowX(e.getX());
        y1 = toWindowY(e.getY());
        color(Color.red);
        line(x0, y0, x1, y1);
        x0 = x1;
        y0 = y1;
      }
    });
  }

  public static void main(String[] args)
  {
    new MouseEvent2();
  }
}
 


Erklärungen zum Programmcode
:
Mit der Methode mouseDragged() verfolgen wir den Mauszeiger. Die aktuelle Position wird unter x1, y1 gespeichert. Die Zeichnung entsteht durch die Verbindung der alten und der neuen Koordinaten mit einer kurzen Linie.


Beispiel 3. Linien zeichnen vom Mausdrücken bis zum Loslassen der Maustaste (Gummibandlinien).
So lange die Maustaste gedrückt wird, ist die Linie "beweglich" und wird provisorisch in rot gezeichnet. Die provisorischen Linien werden fortlaufend gelöscht. Beim Loslassen der Maustaste wird die Linie definitiv in schwarz gezeichnet.
Die Zeichnungsmethoden vom GPanel arbeiten mit dem sogennanten OffScreen Buffer. Das Bild wird zuerst in einen Screen Buffer (Speicher) gezeichnet und von da aus auf den Bildschirm kopiert.

// MouseEvent3.java, Zeichnet Linien vom Mausdrücken bis zum Mausloslasen

import ch.aplu.util.*;
import java.awt.*;
import java.awt.event.*;

public class MouseEvent3 extends GPanel
{
  private double x0 = 0, y0 = 0// Start point
  private double x1 = 0, y1 = 0// End point

  public MouseEvent3()
  {
    addMouseListener(new MouseAdapter()
    {

      public void mousePressed(MouseEvent e)
      {
        x0 = x1 = toWindowX(e.getX());
        y0 = y1 = toWindowY(e.getY());
      }

      public void mouseReleased(MouseEvent e)
      {
        setPaintMode();
        color(Color.black);
        line(x0, y0, x1, y1);
      }

    });

    addMouseMotionListener(new MouseMotionAdapter()
    {
      public void mouseDragged(MouseEvent e)
      {
        setXORMode(Color.white);
        line(x0, y0, x1, y1);
        x1 = toWindowX(e.getX());
        y1 = toWindowY(e.getY());
        color(Color.red)//folgt Mauszeiger und zeichnet (provisorisch) Linien in rot
        line(x0, y0, x1, y1);
      }
    });
  }

  public static void main(String[] args)
  {
    new MouseEvent3();
  }
}
 

Erklärungen zum Programmcode:
Durch den Aufruf setXORMode(Color.white) wird in den XOR-Zeichnungsmodus umgeschaltet. Rote Pixels auf einem weissen Hintergrund erscheinen rot, rote Pixels auf einem roten Hintergrund hingegen weiss. Damit lässt sich das Zeichnen und Löschen einer provisorischen Linie so erreichen, dass man die Linie ein zweites Mal an der gleichen Position zeichnet. Der Hintergrund bleibt nach dieser Operation unverändert. Zum definiten Zeichnen wird mit setPaintMode() in den normalen Zeichnungsmodus umgeschaltet.

 

Beispiel 4. Linke und rechte Maustaste verwenden.
Mit der linken Maustaste werden Punkte gezeichnet, mit dem rechten Mausklick werden sie gelöscht.

// MouseEvent4.java

import ch.aplu.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class MouseEvent4 extends GPanel
{
  MouseEvent4()
  {
    addMouseListener(new MouseAdapter()
    {
      public void mousePressed(MouseEvent e)
      {
        if (SwingUtilities.isLeftMouseButton(e))
        {
          color(Color.red);
          move(toWindow(e.getPoint()));
          fillCircle(0.01);
        }

        if (SwingUtilities.isRightMouseButton(e))
        {
          color(Color.white);
          move(toWindow(e.getPoint()));
          fillCircle(0.05);
        }
      }
    });
  }

  public static void main(String[] args)
  {
    new MouseEvent4();
  }
}
 

Erklärungen zum Programmcode:
Die Klasse SwingUtilities aus der java-Bibliothek swing enthält Methoden, mit denen abgefragt werden kann, welche Maustaste gedrückt wurde.
Die Methode isLeftMouseButton() gibt true zurück, falls die linke Maustaste gedrückt wurde. Die Methode isRightMouseButton() gibt true zurück, fals die rechte Maustaste gedrückt wurde.
Die Methode getPoint (e) gibt die Koordinaten des Mausklicks zurück. Die Punkte werden mit einem einfachen Trick gelöscht: der Punkt an der Mausklickposition wird noch einmal mit der Hintergrundfarbe (weiss) gezeichnet.