Tit   Inh   Ind   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   <<   <   >   >> 

19.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 /* Listing1904.java */
002 
003 import java.awt.*;
004 import java.awt.event.*;
005 import java.util.*;
006 
007 public class Listing1904
008 extends Frame
009 {
010    private Vector drawlist;
011    private Rectangle actrect;
012 
013    public static void main(String[] args)
014    {
015       Listing1904 wnd = new Listing1904();
016       wnd.setLocation(200,200);
017       wnd.setSize(400,300);
018       wnd.setVisible(true);
019    }
020 
021    public Listing1904()
022    {
023       super("Listing1904");
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 }
Listing1904.java
Listing 19.4: Zeichnen von Rechtecken durch Ziehen der Maus

 Beispiel 

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

Abbildung 19.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 


 Tit   Inh   Ind   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   <<   <   >   >> 
Go To Java 2, Addison Wesley, Version 1.0.2, © 1999 Guido Krüger, http://www.gkrueger.com