From 33613a85afc4b1481367fbe92a17ee59c240250b Mon Sep 17 00:00:00 2001 From: Sven Eisenhauer Date: Fri, 10 Nov 2023 15:11:48 +0100 Subject: add new repo --- .../hjp5/html/k100188.html | 311 +++++++++++++++++++++ 1 file changed, 311 insertions(+) create mode 100644 Master/Reference Architectures and Patterns/hjp5/html/k100188.html (limited to 'Master/Reference Architectures and Patterns/hjp5/html/k100188.html') diff --git a/Master/Reference Architectures and Patterns/hjp5/html/k100188.html b/Master/Reference Architectures and Patterns/hjp5/html/k100188.html new file mode 100644 index 0000000..a59e913 --- /dev/null +++ b/Master/Reference Architectures and Patterns/hjp5/html/k100188.html @@ -0,0 +1,311 @@ + + + +Handbuch der Java-Programmierung, 5. Auflage + + + + + + + + + +
 Titel  + Inhalt  + Suchen  + Index  + DOC  +Handbuch der Java-Programmierung, 5. Auflage +
 <<  +  <   +  >   + >>  + API  +Kapitel 29 - Low-Level-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 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.

+ + + + +
 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 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 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, 5. Auflage, Addison +Wesley, Version 5.0.1 +
 <<  +  <   +  >   + >>  + API  +© 1998, 2007 Guido Krüger & Thomas +Stark, http://www.javabuch.de +
+ + + -- cgit v1.2.3