11. Meer over methodenAls je een programma compileert waarin de methode action voorkomt, heb je misschien gemerkt dat Java een waarschuwing geeft. De methode action (en enkele andere methoden) zijn namelijk wat verouderd en zijn inmiddels vervangen door methoden (de zogenaamde Listener methoden), die wat efficiënter werken. Deze nieuwere methoden zijn onderdelen van zogenaamde interfaces. Maar wat is een interface? Elke applet die we tot dusver maakten begon met: De toevoeging extends Applet houdt in dat dit programma alle functionaliteit erft van de klasse Applet. Dat wil zeggen dat applets bijvoorbeeld 'weten' hoe ze moeten omgaan met methodes als init en paint. Helaas kunnen klassen via overerving slechts van één andere klasse erven. Net zoals bij overerving (dus via extends), biedt een interface de mogelijkheid om een programma extra functionaliteit mee te geven. De opname van zo'n interface heeft één belangrijk nadeel en één belangrijk voordeel ten opzichte van erving:
De interface ActionListenerIn de applets die we tot dusver maakten, kon een ingetypte tekst alleen naar een string-variabele worden gekopieerd als op een knop werd geklikt. Maar het is vaak prettiger als je na invoer gewoon op de Enter-toets kan drukken. We kunnen dit bereiken met de interface ActionListener. Hiervoor moeten we vier regels aan ons programma toevoegen:
MouseListenerEen tweede serie Listener-methoden vinden we in de interface MouseListener. Ook deze interface voegen toe we in vier stappen:
De methoden die in dit hoofdstuk geïntroduceerd zijn gaan we gebruiken in een programma dat ons driehoeken laat tekenen door met de muis te klikken.
Om het venster weer leeg te maken, gaan we een knop aanbrengen die een complete repaint verricht. Maar tot dan moeten de getekende driehoeken wel op het beeldscherm blijven staan. Dus dan kunnen we geen repaint gebruiken. Anders zouden we telkens maar één lijntje kunnen tekenen. We gaan dit oplossen door het mechanisme dat de applet tekent te "overriden". Overriden betekent dat we geen gebruik maken van een standaard mechanisme, maar dit vervangen door een zelfgeschreven methode. Het tekenwerk in een applet wordt standaard geregeld door een methode die update heet. Deze methode vult eerst de achtergrond van het appletvenster op, waardoor het venster feitelijk wordt gewist. Hierna wordt paint aangeroepen, die het tekenwerk verricht. We kunnen deze echter overriden door een eigen versie van update te schrijven, die paint alleen laat tekenen, maar die niets uitwist. Dat kan heel simpel, bijvoorbeeld zo: Een belangrijk aspect van computerprogramma's waar mensen mee omgaan is feedback. De mens ziet graag dat het programma op hem reageert. Per slot van rekening verwachten wij ook een reactie als we met mensen communiceren. Om deze feedback te leveren, gaan we op plaatsen waar in onze applet geklikt wordt, een stip tekenen. Hiervoor kan de methode mouseClicked ons de coördinaten leveren, aldus: Je ziet dat we de coördinaten opslaan in twee arrays (x[ ] en y[ ]), die zo zijn gedefinieerd:
Als we de variabele beurt de waarden 0, 1 en 2 laten doorlopen, zal de methode mouseClicked keurig drie setjes coördinaten opvangen. Als op de reset-knop is geklikt, vegen we alles uit door een rechthoek met de kleur wit te vullen. Anders tekenen we een stip op het aangeklikte punt. Bij het derde punt laten we telkens een nieuwe driehoek tekenen door onze methode driehoek, aldus:
De rest van het programma spreekt hopelijk voor zichzelf:
Opdracht 11.1 Schrijf een applet waarin een zin kan worden ingetypt in een tekstvak. Na indrukken van de enter-toets wordt het vak leeggemaakt en wordt de zin opnieuw getoond en wordt er meegedeeld hoeveel klinkers (a, e, i, o, u, ook als hoofdletters) de zin bevat. Dit tellen moet gedaan worden in een aparte methode die als return-waarde het aantal klinkers afgeeft.
Opdracht 11.2 Schrijf een applet waarin bij elke klik een lijnstuk wordt bijgetekend vanaf het laatst getekende tot het nieuw aangeklikte punt. Het tekenen begint in de linkerbovenhoek bij een vlakje met daarin het woord "reset". Bij klikken op dat vlakje start het programma opnieuw.
(c) 2003-2008, Thomas J.H.Luif |