4. Condities, booleans en de klasse Dimension

Kunnen we onze monitor in een schietschijf veranderen? Stel dat we een beeld willen hebben als hieronder:

Hoe je concentrische cirkels tekent, zagen we in het vorige hoofdstuk. Maar in plaats van drawOval gaan we gebruik maken van de methode fillOval, die de getekende ellips ook gelijk opvult.

true en false: booleans
We kunnen van buiten naar binnen afwisselend zwarte en witte schijven tekenen. Met andere woorden …

Is de schijf donker, dan wordt de volgende licht.
Als de schijf licht was, dan wordt de volgende donker.
We zouden een variabele moeten hebben die die maar twee waarden kent: donker en licht.

Voor dit soort situaties kent Java het type boolean. Zo'n boolean kan maar twee waarden bevatten, namelijk true en false. Kijk maar eens naar de volgende regels, waarin we ook nog eens kennismaken met de woorden if en else.

boolean schrikkeljaar;
if (aantalDagen == 366)
   schrikkeljaar = true;
else
   schrikkeljaar = false;
if (schrikkeljaar)
   g.drawString ("Schrikkeljaar", 20, 100);
else
   g.drawString ("Een gewoon jaar", 20, 100);

Ook bij ons schietschijf-programma is zo'n conditie heel handig. We kunnen deze als volgt uitschrijven:

if (wit)
   g.setColor (Color.white); // Let op inspringing
else
   g.setColor (Color.black); // Let op inspringing

Het is niet moeilijk te begrijpen dat g.setColor (Color.white) de kleur wit aanzet. Maar wat bedoelt het programma eigenlijk met if (wit)?

Opnieuw zien we hier een boolean -- een variabele die maar twee waarden kan bevatten, namelijk true of false.

Zo'n boolean gebruikt men in condities. Booleans kunnen als volgt worden gedeclareerd:

boolean correct = true;
boolean lichtAan = false;
boolean open = true;

In ons programma gaan we telkens na het tekenen van een schijf de kleur "omdraaien". We zouden dat (wat omslachtig) zo kunnen doen:

if (wit == true)
   wit = false;
else
   wit = true;

Maar er is een veel kortere manier, namelijk zo:

wit = !wit;

Het uitroepteken wordt uitgesproken als NOT en betekent dat de inhoud van wit feitelijk wordt omgekeerd. Zo betekenen de volgende statements precies hetzelfde:

if (!wit) . . .
if (wit == false) . . .
if (!wit == true) . . .

   

De klasse Dimension

De afmetingen van onze applet worden normaliter vastgelegd in het html-bestand. Dat kan er bijvoorbeeld zo uitzien:

<applet code = MijnJavaApplet.class
  width = 320 height = 240>
</applet> 

Maar in sommige gevallen zou het wel prettig zijn als we binnen de applet kunnen vaststellen hoe groot het venster feitelijk is. Hiervoor kunnen we gebruik maken van de klasse Dimension. We kunnen de afmetingen van het venster aldus in een object d van deze klasse laten stoppen:

Dimension d = getSize();

Dit object d (dat je natuurlijk ook een andere naam kan geven) bevat twee velden, die width en height heten. Hiermee kunnen we de lengte en breedte van het appletvenster als volgt bepalen:

int breedte = d.width;
int hoogte = d.height;

Meestal gebruiken we in deze cursus een appletvenster van 320 pixels breed en 240 pixels hoog. Een cirkel die precies in dit venster past moet dus een straal van 120 pixels hebben. Maar bij een appletvenster van 400 pixels hoog en 300 pixels breed wordt de straal 150 pixels. We kunnen dat in het programma zo vermelden:

if (breedte > hoogte)
   straal = hoogte / 2;
else
   straal = breedte / 2;

Ten slotte volgt hier het volledige programma:

// Schietschijf die precies in het venster past
import java.applet.*;
import java.awt.*;
public class Schietschijf extends Applet {
   boolean wit = false;
   public void paint (Graphics g) {
      Dimension d = getSize();
      int breedte = d.width, hoogte = d.height;
      int straal = hoogte/2;
      if (breedte < hoogte)
         straal = breedte/2;
         do {
            int x=breedte/2-straal, y=hoogte/2-straal;
            if (wit)
               g.setColor (Color.white);
            else
               g.setColor (Color.black);
            g.fillOval (x, y, 2*straal, 2*straal);
            straal -= 10;
            wit = !wit;
         } while (straal > 0);
      }
   }
}

   

Opdracht 4.1

Schrijf een applet die - afhankelijk van de afmetingen - een van de volgende teksten schrijft (betreffende de afmetingen van het appletvenster

    De breedte is groter dan de hoogte.
    De hoogte is groter dan de breedte.
    De breedte is gelijk aan de hoogte.

Opdracht 4.2

Schrijf een applet met vier gelijke rechthoeken. De ruimte links, tussen en rechts van de rechthoeken is gelijk aan de breedte van elk van de rechthoeken. De ruimte onder, tussen en boven de rechthoeken is gelijk aan de hoogte van de rechthoeken. Dit moet zo blijven, onafhankelijk van de afmetingen van de applet.



   

(c) 2003-2008, Thomas J.H.Luif