12. Tekst afbeeldenVaak worden in applets een soort tabel of een aantal regels tekst afgebeeld. Stel dat we de dagen van de week onder elkaar willen afbeelden. Dat zou je vrij eenvoudig kunnen doen op de volgende manier:
Dit programma is niet al te ingewikkeld. Het begint met commentaar -- wat je kunt zien aan de tekens /* en */.
/* Eenvoudig programma om de In de methode paint worden de woorden maandag tot en met zondag afgebeeld in gele letters op een grijze achtergrond (die in init is aangezet), dus zo:
Efficiënter behandeling van dataDit programmaatje werkt wel, maar erg efficiënt is het niet. Stel dat we geen zeven, maar enkele tientallen stuks data moeten afbeelden, dan zouden we ons programma toch echt iets anders moeten inrichten. We kunnen de dagen van de week beter in een array plaatsen. De methode paint zou er dan zo gaan uitzien: De manier waarop de dagen worden afgebeeld werkt als volgt: de variabele i doorloopt via de for-lus de waarden 0 tot en met 6. De waarde van dagen[0] is "maan", en zo verder tot en met dagen[6] met als waarde "zon".
Elk van de dagen bevat het stukje "dag". We kiezen ervoor dit niet zeven maal op te slaan, maar het pas aan de string te "plakken" als we die afbeelden. Het programma bevat maar weinig data. Toch is het nu al iets korter geworden dan het eerste. Het is duidelijk dat met honderden stuks data de winst nog veel groter zal zijn. Maar er is nog wel meer dat we aan het programma kunnen verbeteren.
FontgrootteIn het algemeen zijn er twee manieren om een knop op te nemen in een programma. De eerste manier hebben we gezien in hoofdstuk 6, de geprefabriceerde Java-Button:
De tweede manier is dat we aan klikken op bepaalde vlakken binnen het appletvenster een bepaalde betekenis toekennen, bijvoorbeeld zo:
In paint wordt het venster door een rechte lijn in een onderste en een bovenste deel verdeeld.
Als geklikt wordt, vangt de methode evt.getY in mousePressed de y-coördinaat op. We wijzen deze toe aan de globale variabele clickY, zodat in paint kan worden geconstateerd of er boven, onder of op de lijn geklikt is. Het programma ziet er zo uit:
Vaak zul je op zo'n knop een tekst willen zetten. Maar dan moet zo'n tekst natuurlijk wel netjes passen, dus niet zo:
Het ziet er natuurlijk pas goed uit als zo'n tekst het grootste gedeelte van de breedte van de knop beslaat. We kunnen een methode maken die zo'n knop voor ons afbeeldt. We gaan onze methode vijf argumenten meegeven:
Behalve een methode om de knop neer te zetten, is het ook handig een tweede methode te maken (knopGeklikt), waarmee kan worden geconstateerd of op de knop geklikt is:
Zodra er is geklikt, worden in mousePressed de x- en y-coördinaat toegekend aan de (globaal gedeclareerde) clickX en clickY.
Daarna krijgt de boolean-variabele zetTekst de tegengestelde waarde (het uitroepteken betekent: not). Met andere woorden, als hij true was, wordt hij false, en andersom. Daarna wordt in paint een nieuwe knop getekend en met knopGeklikt gecontroleerd of er op het vlak van de knop geklikt is. Ten slotte wordt er twee teksten neergezet als de variabele zetTekst gelijk is aan true.
Een string-array "inpakken"We komen nog even terug op het eerste programma van dit hoofdstuk. De data kosten nogal wat ruimte. In de volgende programmaregel nemen ze 53 tekens in beslag, waarvan er maar liefst 22 uit komma¹s, aanhalingstekens en accolades bestaan. Dat is meer dan 40% van de ingetypte tekens.
String dagen[]={"maan","dins","woens","donder","vrij","zater","zon"}; We kunnen de dagen "verpakken" in een string waarin de afzonderlijke woorden gescheiden worden door slechts één teken, bijvoorbeeld zo:
String s="maan-dins-woens-donder-vrij-zater-zon"; Het is mogelijk deze string "uit te pakken" naar een array. Hiertoe maken we gebruik van de klasse StringTokenizer. Om deze klasse te kunnen gebruiken moeten we boven de applet de volgende regel opnemen: import java.util.StringTokenizer; Ook moeten we van deze klasse een object (in dit geval: st) aanmaken, waaraan we twee gegevens moeten meegeven: de naam van de uit te pakken string en het teken (streepje) waardoor de elementen gescheiden worden. StringTokenizer st = new StringTokenizer (s, "-"); De elementen worden op de volgende manier in het array gezet:
String dagen[ ] = new String [7];
Een hele tekst afbeeldenDe methode stringWidth is goed te gebruiken om een tekst passend maken binnen de ruimte die we ervoor hebben. Als je veel tekst moet afbeelden is het handig om woord voor woord te bepalen of de tekst nog wel in de beschikbare ruimte past. Dit gaan we doen in het laatste programma van dit hoofdstuk, waarin een tekst van enkele honderden woorden passend binnen het appletvenster wordt afgebeeld:
In het programma zouden we de string s ook als één lange regel kunnen schrijven, maar dan zou die buiten het venster van de programma-editor vallen, wat wel eens lastig kan zijn.
Het feitelijke proces vindt plaats tussen de regels die gemarkeerd zijn door //begin en //eind. Telkens wordt geprobeerd of een regel met het volgende woord erbij nog binnen 9/10 van de vensterbreedte vb past. Past het, dan plakken we het woord achter de regel. Wordt het te lang, dan beelden we de regel (zonder dat laatste woord) af, we verhogen de hoogte voor de volgende regel, waarna we met een lege regel beginnen. Hoe dat er in de praktijk uit gaat zien, kun je hieronder bekijken:
Het is ook mogelijk de tekst geheel uit te lijnen. Het programma daarvoor is misschien wat te ingewikkeld om in deze cursus te behandelen. Voor wie er toch belangstelling voor heeft, zet ik hieronder het programmadeel waar de tekst zowel links als rechts uitgelijnd wordt:
Dimension d = getSize(); Ook hier zal ik laten zien hoe dat eruit ziet:
Opdracht 12.1 Schrijf een programma dat een zwarte rechthoek in het midden van het beeldscherm afbeeldt op een grijze achtergrond. Daarin komt je naam in gele letters, die er precies in passen. De breedte van je naam moet (in elke browser) tussen 40% en 50% van het appletvenster in beslag nemen, bijvoorbeeld zo:
Opdracht 12.2 Copyright-vermeldingen zie je vaak in kleine letters in de hoek van het venster staan. Breid de eerste opdracht zo uit dat een copyright-vermelding die zo'n 140 à 160 pixels breed is netjes in de rechterbenedenhoek komt, bijvoorbeeld zo:
Opdracht 12.3 Herschrijf opdracht 12.2 zo dat de fontgrootte van zowel de grote als de kleine tekst bepaald worden in een methode die de maximale fontgrootte bepaalt waarbij de tekst nog in de beschikbare ruimte past, en die er bijvoorbeeld zo uitziet:
int bepaalFontGrootte (Graphics g, String tekst, int ruimte)
(c) 2003-2008, Thomas J.H.Luif |