| Titel | Inhalt | Suchen | Index | API | Go To Java 2, Zweite Auflage, Handbuch der Java-Programmierung |
| << | < | > | >> | Kapitel 29 - Low-Level-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. |
|
![]() |
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 |
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 | API | Go To Java 2, Zweite Auflage, Addison Wesley, Version 2.0 |
| << | < | > | >> | © 2000 Guido Krüger, http://www.gkrueger.com | |