next up previous contents
Nächste Seite: Key Listener Aufwärts: Die Listener Vorherige Seite: Die Listener   Inhalt


Mouse Listener

Der Mouslistener dient dazu, Mausbewegungen und Mausklicks innerhalb eines graphischen Objekts der Applikation zu melden. Es können sechs verschiedene Mausoperationen abgefragt werden:

  1. pressed Abfrage ob eine Maustaste gedrückt wurde.
  2. released Abfrage ob eine Maustaste wieder losgelassen wurde.
  3. draggend Abfrage ob die Maus bei gedrückter Maustaste bewegt wurde.
  4. entered Abfrage ob der Mauszeiger das Objekt betritt.
  5. exited Abfrage ob der Mauszeiger das Objekt verläßt.
  6. moved Abfrage ob sich die Maus innerhalb des Objekts bewegt.

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);
    }

Abbildung: Der Mouselistener in Action. Im linken Canvas werden Rechtecke mit einer gedrückten Mousetaste aufgezogen. Im rechten Canvas werden alle Mousebewegungen nachgezeichnet.
mouselistener.eps


next up previous contents
Nächste Seite: Key Listener Aufwärts: Die Listener Vorherige Seite: Die Listener   Inhalt
Merten Joost 2003-02-26