Titel | Inhalt | Suchen | Index | DOC | Handbuch der Java-Programmierung, 7. Auflage |
<< | < | > | >> | API | Kapitel 29 - Low-Level-Events |
Im JDK 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, drastisch reduziert.
Ein Empfänger für MouseMotion-Events muss 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. |
|
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 dass 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 ArrayList<Rectangle> 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 ArrayList<Rectangle>(); 025 actrect = new Rectangle(0,0,0,0); 026 addWindowListener(new WindowClosingAdapter()); 027 addMouseListener(new MyMouseListener()); 028 addMouseMotionListener(new MyMouseMotionListener()); 029 } 030 031 public void paint(Graphics g) 032 { 033 Rectangle r; 034 Iterator<Rectangle> e; 035 036 for (e = drawlist.iterator(); e.hasNext(); ) { 037 r = e.next(); 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.add(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 |
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. |
|
Titel | Inhalt | Suchen | Index | DOC | Handbuch der Java-Programmierung, 7. Auflage, Addison Wesley, Version 7.0 |
<< | < | > | >> | API | © 1998, 2011 Guido Krüger & Heiko Hansen, http://www.javabuch.de |