Im folgenden Beispiel sind alle sechs Fälle realisiert:
/* Example mouselistener.c */ : canvas1=j_canvas(frame,200,200); canvas2=j_canvas(frame,200,200); pressed = j_mouselistener(canvas1,J_PRESSED); dragged = j_mouselistener(canvas1,J_DRAGGED ); released = j_mouselistener(canvas1,J_RELEASED); entered = j_mouselistener(canvas2,J_ENTERERD); moved = j_mouselistener(canvas2,J_MOVED); exited = j_mouselistener(canvas2,J_EXITED); while((obj=j_nextaction())!=frame) { if(obj == pressed) { j_getmousepos(pressed,&x,&y); startx=x; starty=y; } if(obj == dragged) { j_getmousepos(dragged,&x,&y); j_drawrect(canvas1,startx,starty,x-startx,y-starty); } if(obj == released) { j_getmousepos(released,&x,&y); j_drawrect(canvas1,startx,starty,x-startx,y-starty); } if(obj == entered) { j_getmousepos(entered,&x,&y); startx=x; starty=y; } if(obj == moved) { j_getmousepos(moved,&x,&y); j_drawline(canvas2,startx,starty,x,y); startx=x; starty=y; } if(obj == exited) { j_getmousepos(exited,&x,&y); j_drawline(canvas2,startx,starty,x,y); } } :
Im Beispiel werden zunächst zwei Zeichenfelder ''canvas1'' und ''canvas2'' erzeugt. An jedes Zeichenfeld werden nun drei Mouselistener gebunden, die jeweils eine eigene Eventnummer erhalten. An ''canvas1'' wird je ein Listener für ''pressed'',''released'' und ''dragged'' gebunden. In diesem Zeichenfeld sollen bei grdrückter Maustaste Rechtecke aufgezogen werden. Wird nun in diesem Canvas eine Maustaste gedrückt, so wird über die Eventnummer des ''pressed'' Listener die Applikation benachrichtigt:
if(obj == pressed) { j_getmousepos(pressed,&x,&y); startx=x; starty=y; }
Mit der Funktionen j_getmousex() bzw. j_getmousey() kann die Position der Mouse ermittelt werden, an der das entsprechende Event stattfand. Im Beispiel dient diese Position als Startecke für ein Rechteck.
Wird nun bei gedrückter Taste die Maus bewegt, so liefert die Eventnummer des ''dragged'' Listener ein entsprechendes Event,
if(obj == dragged) { j_getmousepos(dragged,&x,&y); j_drawrect(canvas1,startx,starty,x-startx,y-starty); }
und es wird permanent ein Rechteck von der Startpostion bis zur Aktuellen Postion eingezeichnet. Wird die Maustaste losgelassen, so wird über den ''realeased'' Listener ein Event weitergereicht, und das abschließende Rechteck wird eingezeichnet. Ein erneutes Drücken der Maustaste wählt einen neuen Startpunkt aus.
if(obj == released) { j_getmousepos(released,&x,&y); j_drawrect(canvas1,startx,starty,x-startx,y-starty); }
Im zweiten Canvas werden alle Mausbewegungen nachgezeichnet. Betritt der Mauszeigen dieses Fenter, so wird vom ''entered'' Listener ein Event gemeldet:
if(obj == entered) { j_getmousepos(entered,&x,&y); startx=x; starty=y; }
und die Eintrittsposition wird zwischengespeichert. Jede Bewegung der Maus erzeugt nun ein ''move'' Event:
if(obj == moved) { j_getmousepos(moved,&x,&y); j_drawline(canvas2,startx,starty,x,y); startx=x; starty=y; }
und es wird eine Linie zwischen der letzten Position der Maus und der aktuellen Position eingezeichnet. Abschließend wird die aktuelle Position als letzte Position gespeichert. Verläst die Maus das Fenster, so wird mit Hilfe des ''exited'' Listener der Austrittsort ermittelt, und eine letzte Linie dorthin gezeichnet:
if(obj == exited) { j_getmousepos(exited,&x,&y); j_drawline(canvas2,startx,starty,x,y); }
|