Kapitel 13. Hændelser i grafiske brugergrænseflader

Indhold:

Forudsættes af Kapitel 22, Indre klasser.

Forudsætter Kapitel 11, Grafiske brugergrænseflader og Kapitel 12, Interfaces.

Hændelser (eng.: events) spiller en stor rolle i programmering af grafiske brugergrænseflader. Når brugeren foretager en handling, f.eks. bevæger musen, klikker, trykker en knap ned, ændrer i et tekstfelt osv., opstår der en hændelse. I Java er alle hændelser objekter (af typen Event) med metoder til at undersøge de præcise detaljer omkring hændelsen.

Hændelser udsendes af de grafiske komponenter (knapper, vinduer osv.), og hvis man vil behandle en bestemt type hændelser fra en bestemt grafisk komponent, skal man lytte efter den hændelse. Det gøres ved at registrere en lytter (eng.: listener) på hændelsestypen på den pågældende grafiske komponent.

En lytter er et objekt, der kan "abonnere" på en bestemt type hændelse. Når en lytter er registreret hos en grafisk komponent, bliver der kaldt en metode på lytter-objektet, når hændelsen indtræffer (f.eks. kaldes mouseClicked(), når der klikkes med musen).

For at sikre, at lytteren har den pågældende metode, skal lytter-objektet implementere et interface, der garanterer, at det har metoden.

F.eks.:

Appletter kan udsende hændelser af typen MouseEvent. Appletter har derfor metoden addMouseListener(MouseListener lytter), der kan bruges til at registrere lytter-objekter hos appletten. Det er kun objekter af typen MouseListener, der kan registreres som lyttere. MouseListener er et interface, så man skal lave en klasse, der implementerer MouseListener og skabe lytter-objekter ud fra dette. Når brugeren klikker med musen i appletten, udsender appletten en MouseEvent-hændelse til alle lytter-objekter, der er blevet registreret vha. addMouseListener(). Det gør appletten ved at kalde metoden mouseClicked(MouseEvent hændelse) på lytter-objekterne.

13.1. Eksempel - LytTilMusen

Herunder definerer vi klassen Muselytter, der implementerer MouseListener. Hver gang der sker noget med musen, skrives det ud til skærmen.

MouseListener-interfacet har bl.a. metoden mousePressed, der kaldes, når musen trykkes ned. Parameteren er et MouseEvent-objekt, der bl.a. kan fortælle, hvor musen er, og hvilken knap der blev trykket på.

import java.awt.*;
import java.awt.event.*;

public class Muselytter implements MouseListener
{
  public void mousePressed(MouseEvent hændelse)  // kræves af MouseListener
  {
    Point trykpunkt = hændelse.getPoint();
    System.out.println("Mus trykket ned i "+trykpunkt);
  }

  public void mouseReleased(MouseEvent hændelse)  // kræves af MouseListener
  {
    Point slippunkt = hændelse.getPoint();
    System.out.println("Mus sluppet i "+slippunkt);
  }

  public void mouseClicked(MouseEvent hændelse)  // kræves af MouseListener
  {
    System.out.println("Mus klikket i "+hændelse.getPoint());
  }

  //--------------------------------------------------------------------
  //  Ubrugte hændelser (skal defineres for at implementere MouseListener)
  //--------------------------------------------------------------------
  public void mouseEntered (MouseEvent event) {}  // kræves af MouseListener
  public void mouseExited (MouseEvent event) {}  // kræves af MouseListener
}

Lad os nu lave en lille applet, der:

  1. Opretter et muselytter-objekt.

  2. Registrerer lytter-objektet, så det får kaldt sine metoder, når der sker noget med musen.

import java.applet.*;
public class LytTilMusen extends Applet
{
  public void init()
  {
    Muselytter lytter = new Muselytter();
    this.addMouseListener(lytter);  // this er objektet selv
  }
}

Uddata fra appletten kan ses i konsolvinduet (i Netscape: Communicator/Tools/Java Console):

Mus trykket ned i java.awt.Point[x=132,y=209]
Mus sluppet i java.awt.Point[x=139,y=251]
Mus trykket ned i java.awt.Point[x=101,y=199]
Mus sluppet i java.awt.Point[x=101,y=199]
Mus klikket i java.awt.Point[x=101,y=199]