Titel | Inhalt | Suchen | Index | DOC | Handbuch der Java-Programmierung, 3. Auflage
<< | < | > | >> | API | Kapitel 29 - Low-Level-Events

## 29.4 MouseMotion-Events

- 29.4 MouseMotion-Events

Im JDK 1.1 gibt es eine klare Trennung zwischen Mouse-Events und MouseMotion-Events. Während die Mouse-Events für Mausklicks und das Betreten oder Verlassen der Komponente zuständig sind, geben MouseMotion-Events Auskunft über die Bewegung des Mauszeigers. Neben der verbesserten Modularisierung (sehr viele Programme wollen lediglich von Mausklicks, nicht aber von Mausbewegungen unterrichtet werden) wurde die Trennung vor allem deshalb vorgenommen, um Performance-Verbesserungen zu erzielen. Durch die Entkopplung der Ereignishandler für Mausbewegungen wird die Anzahl der Events, mit denen die meisten Event-Handler beschossen werden, im Vergleich zum JDK 1.0 drastisch reduziert.

Ein Empfänger für MouseMotion-Events muß das Interface `MouseMotionListener` implementieren. Er wird mit der Methode `addMouseMotionListener` registriert, die in allen Objekten der Klasse `Component` oder daraus abgeleiteten Klassen zur Verfügung steht.

    public void addMouseMotionListener(MouseListener l)
| java.awt.Component

|  |  |  | Im Gegensatz zur bisherigen Systematik bekommen die Methoden von `MouseMotionListener` allerdings keine Events des Typs `MouseMotionEvent` übergeben (die gibt es nämlich nicht), sondern solche des Typs `MouseEvent`. Damit stehen dieselben Methoden wie bei Mouse-Events zur Verfügung. |  |
Warnung

Das Interface `MouseMotionListener` definiert die Methoden `mouseMoved` und `mouseDragged`:

    public abstract void mouseMoved(MouseEvent e)

    public abstract void mouseDragged(MouseEvent e)
| java.awt.event.MouseMotionListener

`mouseMoved` wird aufgerufen, wenn die Maus bewegt wird, ohne daß dabei eine der Maustasten gedrückt ist. `mouseDragged` wird dagegen aufgerufen, wenn die Maus bei gedrückter linker oder rechter Maustaste bewegt wird.

Das folgende Listing zeigt den Einsatz von `mouseDragged` am Beispiel eines Programms, mit dem Rechtecke gezeichnet werden können. Das Drücken der linken Maustaste legt den Anfangspunkt des Rechtecks fest, und durch Ziehen der Maus wird seine Größe bestimmt. Nach dem Loslassen der Maustaste wird das Rechteck in die Liste der gezeichneten Objekte eingetragen und beim nächsten Aufruf von `paint` gezeichnet.

    001 /* Listing2904.java */
    002
    003 import java.awt.*;
    004 import java.awt.event.*;
    005 import java.util.*;
    006
    007 public class Listing2904
    008 extends Frame
    009 {
    010   private Vector drawlist;
    011   private Rectangle actrect;
    012
    013   public static void main(String[] args)
    014   {
    015     Listing2904 wnd = new Listing2904();
    016     wnd.setLocation(200,200);
    017     wnd.setSize(400,300);
    018     wnd.setVisible(true);
    019   }
    020
    021   public Listing2904()
    022   {
    023     super("Rechtecke zeichnen");
    024     drawlist = new Vector();
    025     actrect = new Rectangle(0,0,0,0);
    026     addWindowListener(new MyWindowListener());
    027     addMouseListener(new MyMouseListener());
    028     addMouseMotionListener(new MyMouseMotionListener());
    029   }
    030
    031   public void paint(Graphics g)
    032   {
    033     Rectangle r;
    034     Enumeration e;
    035
    036     for (e = drawlist.elements(); e.hasMoreElements(); ) {
    037       r = (Rectangle)e.nextElement();
    038       g.drawRect(r.x, r.y, r.width, r.height);
    039     }
    040     if (actrect.x > 0 || actrect.y > 0) {
    041       g.drawRect(
    042         actrect.x,
    043         actrect.y,
    044         actrect.width,
    045         actrect.height
    046       );
    047     }
    048   }
    049
    050   class MyMouseListener
    051   extends MouseAdapter
    052   {
    053     public void mousePressed(MouseEvent event)
    054     {
    055       actrect = new Rectangle(event.getX(),event.getY(),0,0);
    056     }
    057
    058     public void mouseReleased(MouseEvent event)
    059     {
    060       if (actrect.width > 0 || actrect.height > 0) {
    061         drawlist.addElement(actrect);
    062       }
    063       repaint();
    064     }
    065   }
    066
    067   class MyMouseMotionListener
    068   extends MouseMotionAdapter
    069   {
    070     public void mouseDragged(MouseEvent event)
    071     {
    072       int x = event.getX();
    073       int y = event.getY();
    074       if (x > actrect.x && y > actrect.y) {
    075         actrect.width = x - actrect.x;
    076         actrect.height = y - actrect.y;
    077       }
    078       repaint();
    079     }
    080   }
    081
    082   class MyWindowListener
    083   extends WindowAdapter
    084   {
    085     public void windowClosing(WindowEvent event)
    086     {
    087       setVisible(false);
    088       dispose();
    089       System.exit(0);
    090     }
    091   }
    092 }
| Listing2904.java

Listing 29.4: Zeichnen von Rechtecken durch Ziehen der Maus

Eine Beispielsitzung mit dem Programm könnte folgendes Ergebnis liefern:

Abbildung 29.3: Die Ausgabe des Mausbewegungsprogramms

|  | Interessant ist hier das Zusammenspiel zwischen `paint` und den Methoden, die die Maus-Events behandeln. Beim Aufruf von `paint` werden zunächst alle Rechtecke gezeichnet, die sich in der Liste `drawlist` befinden. Anschließend überprüft `paint`, ob das aktuelle Element (dieses wurde beim Mausklick angelegt) eine Länge oder Breite größer Null hat, und zeichnet es gegebenenfalls. Dies ist genau dann der Fall, wenn der Anwender die Maustaste gedrückt und die Maus vom Ursprung nach rechts unten bewegt hat. Beim Loslassen der Maustaste wird das aktuelle Element in die Liste der Rechtecke eingetragen und steht so beim nächsten `paint` zur Verfügung. |  |
Hinweis

Titel | Inhalt | Suchen | Index | DOC | Handbuch der Java-Programmierung, 3. Auflage, Addison Wesley, Version 3.0
<< | < | > | >> | API | © 1998-2002 Guido Krüger, http://www.javabuch.de