© 1999-2003, Flemming Koch Jensen
Alle rettigheder forbeholdt
MouseListeners

 

 

 

1. MouseListener

Hvis man er interesseret i at følge hændelser i forbindelse med musen: At den flytter sig, at den klikkes etc., melder man sig som MouseListener. Man melder sig f.eks. til hos en frame, og vil dernæst få besked om alle MouseEvents vedrørende framen.
Som MouseListener forpligtiger man sig til at implementere følgende metoder:
public void mouseClicked( MouseEvent e )
public void mouseEntered( MouseEvent e )
public void mouseExited( MouseEvent e )
public void mousePressed( MouseEvent e )
public void mouseReleased( MouseEvent e )
mouseClicked kaldes når der klikkes med musen på et komponent man er tilmeldt.
mouseEntered kaldes når musen bevæger sig ind over et komponent man er tilmeldt. Dvs. hvis musen først ikke er over komponentet, men dernæst bevæger sig ind over komponentet, udløser det en event og metoden kaldes.
mouseExited er det omvendte af mouseEntered. Metoden kaldes når musen forlader et komponent man er tilmeldt.
mousePressed kaldes når en af muse-knapperne trykkes ned.
mouseReleased kaldes når en af muse-knapperne slippes efter at have været trykket ned.

 

1.1 MouseEvent

Alle de metoder der findes i interfacet for de forskellige MouseListeners modtager en MouseEvent som parameter. Vha. af denne MouseEvent kan man få en række oplysninger ved at kalde en af følgende metoder på den:
public int getClickCount()
public Point getPoint()
public int getX()
public int GetY()
Hvis den event man modtager vedrører, at en muse-knap er blevet klikket, vil getClickCount returnere antallet af gange dette er sket. Hvis man modtager en event i forbindelse med et såkaldt dobbelt-klik vil metoden returnere to. Man skal være opmærksom på at et dobbelt-klik vil udløse to events: Først en med et getClickCount på én og dernæst en event med et getClickCount på to.
De tre sidste metoder drejer sig alle om det samme. Hvor skete eventen?
getPoint returnerer svaret som et Point, mens de to andre metoder kan bruges hvis man vil have koordinaterne enkeltvis. Man skal bemærke at koordinaterne regnes fra øverste venstre hjørne af komponentet, der har sendt eventen - ikke skærmens koordinater.

 

1.2 MouseAdapter

MouseAdapter implementerer MouseListener-interfacet med stubbe for samtlige metoder. En stob-metode er i denne samemenhæng en metode, som returnerer uden at foretage sig noget.
Det kan være bekvemt at nedarve fra MouseAdapter, hvis man vil være MouseListener, da man så kan nøjes med at override de metoder man er interesseret i. Man skal dog være opmærksom på, at det kræver, at man ikke samtidig ønsker at nedarve fra en anden klasse, pga. den manglende multiple nedarvning i Java.

 

2. MouseMotionListener

Hvis man er specielt interesseret i hændelser vedrørende musens bevægelser kan man tilmelde sig som MouseMotionListener. Som MouseMotionListener skal man implementere følgende to metoder:
public void mouseDragged( MouseEvent e )
public void mouseMoved( MouseEvent e )
mouseDragged kaldes når en muse-knap trykkes ned på et komponent man er tilmeldt og musen dernæst trækkes.
mouseMoved kaldes når musen bevæger sig over et komponent man er tilmeldt.

 

2.1 MouseMotionAdapter

Selv om der kun er to metoder i interfacet MouseMotionListener er der alligevel en adapter-klasse, der implementerer metoderne som stubbe. Det er formodentligt fordi de andre MouseListeners har en adapter-klasse, at man har valgt at lave én, da det i sig selv synes overflødigt.

 

3. MouseInputListener

MouseInputListener kom til med Swing (javax.swing.event). Interfacet gør ikke andet end at samle MouseListener og MouseMotionListener i ét interface.

 

3.1 MouseInputAdapter

MouseInputAdapter er adapter-klassen for MouseInputListener. Den implementerer stubbe for alle metoder i interfacet MouseInputListener, og kan anvendes hvis man ikke nedarver fra andre klasser og vil undgå selv at lave stubbene.

 

4. JPopupMenu

Mange applikationer anvender popup-menuer, og muligheden for at anvende disse i Java kom med Swing. En popup-menu er en instans af JPopupMenu.
Betragt følgende vindue:
Figur 1:
Eksempel med popup-menu
Vi har helt valgt at lave et tomt vindue af en vis størrelse for at have et område at arbejde med. Til denne frame har vi lavet en popup-menu, som åbnes når man bruger højre muse-knap.
Vinduet er lavet med følgende frame:
Source 1:
Eksempel med JPopup-Menu
public class PopupMenuFrame extends JFrame {
  private JPopupMenu pop;
  
  public PopupMenuFrame( String title ) {
    super( title );
    
    pop = new JPopupMenu();
    pop.add( new JMenuItem( "New" ) );
    pop.add( new JMenuItem( "Open" ) );
    pop.add( new JMenuItem( "Close" ) );
    pop.addSeparator();
    pop.add( new JMenuItem( "Exit" ) );
    
    addMouseListener( new MouseHandler() );
    
    setDefaultCloseOperation( EXIT_ON_CLOSE );
    
    setSize( 200, 100 );
    setVisible( true );
  }
  
  class MouseHandler extends MouseAdapter {
    public void mousePressed( MouseEvent e ) {
      checkPopup( e );
    }
    
    public void mouseReleased( MouseEvent e ) {
      checkPopup( e );
    }
    
    private void checkPopup( MouseEvent e ) {
      if ( e.isPopupTrigger() )
        pop.show( e.getComponent(), e.getX(), e.getY() );
    }
  }
}
Vi laver en instans af JPopupMenu som vi opbygger på samme måde som en instans af JMenu. Vi add'er en række menu-punkter som vi plejer, og kan gøre alt hvad vi ellers kan med en JMenu - submenuer, radiobuttons etc. Vi begrænser os til enkle JMenuItems for at koncentrere os om det egentlige: Popup-menuer.
Vi add'er ikke popup-menuen til noget komponent. Derimod add'er vi en MouseListener til selve framen. Denne MouseListener vil vise popup-menuen når bruger indikere et ønske om det, ved at vælge højre muse-knap.
Da det er platformsafhængigt, hvad der aktiverer poup-menuer, checker MouseListener'en ikke direkte efter klik med højre muse-knap, men kalder metoden isPopupTrigger på event-objektet. Selve MouseListener'en laves vi som en intern klasse i framen. Det er ikke strengt nødvendigt, da den ikke tilgår noget i frame-klassens virkefelt, men det er sædvane at event-handlere laves interne.
Alt efter platformen kan popup-menuen udløses når muse-knappen trykkes ned eller når den slippes igen (For Win32 er det når den slippes). Vi checker derfor både med mousePressed og mouseReleased om der er tale om en PopupTrigger-event, med metoden isPopupTrigger på event-objektet.
Hvis popup-menuen skal vises kaldes showJPopupMenu'en, og resten kører af sig selv. show tager tre parametre. Først er der det komponent som den skal tilhøre. Det er først her vi binder den til et komponent, og denne binding gælder kun mens den bliver vist. Dernæst følger placeringen af popup-menuen i forhold til dette komponent. Alle tre oplysninger henter vi i event-objektet.