Informaticasite van het Sondervick College te Veldhoven                 © L.J.M van Haperen (bron : R.J. van der Beek)
 

Hoofdstuk 18 Java

18.4 Tien sommen, applet met parameters

In dit hoofdstuk gaan we een programma maken, waarmee er tien keer een sommetje verschijnt (net zo als de tweede les van Visual Basic).
Het antwoord moet worden ingetypt, en de computer zegt dan of het goed of fout is.
Na afloop wordt er vermeld hoeveel antwoorden er goed waren.

Het scherm moet er bij de start zó uit zien:


  18.4.1. De methoden enabled, setVisible en requestFocus

We beginnen met de interface. Er moeten drie labels, een button, en vijf tekstvenstertjes worden geplaatst.
Voor de som worden vijf tekstvenstertjes gebruikt: twee voor de getallen, één voor de plus, één voor het is-gelijk-teken, en één voor het antwoord. Als je die tekstvenstertjes elkaar laat overlappen lijkt het net alsof het één tekstvenster is.
De namen van die interactiecomponenten zie je in de declaraties hier onder:

Label lblVulin;
Label lblHoeveelstesom;
TextField txtGetal1;
TextField txtPlus;
TextField txtGetal2;
TextField txtIsgelijk;
TextField txtAntwoord;
Label lblGoedzo;
Button btnVerder;


De opdrachten om die interactiecomponenten te maken zijn besproken in H18_3 , en die zie je bij de volledige code. Er worden echter een paar nieuwe methoden gebruikt.

Het Goedzo-label moet nog niet onder de som staat als de som gemaakt wordt, dat mag pas als het sommetje gemaakt is.
En er mag ook nog geen "Verder !" onder staan, dat moet ook pas gebeuren als het sommetje is gemaakt.

M.b.v. de opdracht lblGoedzo.setVisible(false); zorg je er voor dat het Goedzo-label in het begin onzichtbaar is.
En m.b.v. de opdracht btnVerder.setVisible(false); zorg je er voor dat de Verder-button in het begin onzichtbaar is.
Die opdrachten worden natuurlijk in de methode init gezet.

Het is niet de bedoeling de dingen die in de tekstvakken staan waarin de som verschijnt, te veranderen. Je mag alleen typen in het antwoordvenster.
Om ervoor te zorgen dat je de som zelf niet kunt veranderen komt de opdracht txtGetal1.setEnabled(false); (en nog vier soortgelijke opdrachten) in de methode init.

Verder is het handig als bij de start de cursor in het antwoord-tekstvak staat, anders moet je eerst in dat tekstvak klikken en dan pas kun je het antwoord intypen. We zeggen dat het antwoord-tekstvak de focus moet krijgen. De opdracht daarvoor is:
txtAntwoord.requestFocus();

  18.4.2. De klasse Math: willekeurige getallen en afronden

Als je het programma start moet er direkt een sommetje staan.
Er moet dus in het eerste tekstvakje een willekeurig getal verschijnen.
Met de methode random uit de klasse Math krijg je een willekeurig kommagetal tussen 0 en 1 (van het type double)
Als je dat keer 100 doet krijg je een willekeurig getal tussen 0 en 100, dus met 100.0 * Math.random()
En dat moet worden afgerond op een geheel getal.
Dat gaat met de methode ceil uit de klasse Math

Uiteindelijk krijgen we dan het volgende, en dat moet je invoeren in de methode init:

int g1 = (int)Math.ceil(100.0*Math.random( ) );
g1=g1-50;
if ((g1<10) && (g1>-10)) g1=g1-20;
txtGetal1.setText(String.valueOf(g1));
  • De eerste opdracht zorgt er voor dat g1 een waarde tussen 0 en 100 krijgt.
  • De tweede opdracht zorgt er voor dat er 50 van die waarde wordt afgetrokken, dan krijgt g1 dus een waarde tussen -50 en 50
  • De derde opdracht zorgt er voor dat, als het getal tussen -10 en 10 zit, er 20 van af wordt getrokken. Dat heeft tot gevolg dat getallen nooit heel klein zijn, en dat de som te gemakkelijk is.
    && betekent en, || betekent of !
  • De vierde opdracht zorgt er voor dat dat getal in het eerste tekstvenster verschijnt. Er moet eerst van het getal nog een string worden gemaakt, en dat gebeurt m.b.v. de opdracht String.valueOf(g1)
Dan krijg je nog vier van zulke opdrachten om er voor te zorgen dat er in het derde tekstvakje ook een willekeurig getal komt.
Vervang g1 dan door g2 en txtGetal1 door txtGetal2

  18.4.3. Wat moet er gebeuren als het antwoord is ingetypt.

Als het antwoord is ingetypt en er is op enter gedrukt, dan moet het programma controleren of het antwoord goed is.
Om er voor te zorgen dat het programma reageert als er op de entertoets is gedrukt in het antwoord-tekstvak moet er een ActionListener aan dat tekstvak gekoppeld zijn.
Daarom staat in de methode init de opdracht txtAntwoord.addActionListener(this);

En dan kun je in de methode actionPerformed invoeren wat er moet gebeuren:

public void actionPerformed(ActionEvent e)
      {
          if (e.getSource() == txtAntwoord)
          {
           ...........................
           ...........................
          }
      }

Op de stippeltjes zouden we dan de opdrachten kunnen zetten, die moeten worden uitgevoerd als er op de entertoets is gedrukt.
Maar om het overzichtelijk te houden hebben we die opdrachten in een aparte methode gezet, die we txtAntwoord_Action hebben genoemd.
Dat hebben we gedaan omdat in diezelfde methode actionPerformed ook de opdrachten geplaatst moeten worden die moeten worden uitgevoerd als er op de verder-knop wordt geklikt.

We hebben het dus als volgt gedaan:

public void actionPerformed(ActionEvent e)
      {
          if (e.getSource() == txtAntwoord)
            txtAntwoord_Action();
         else if (e.getSource() == btnVerder)
            btnVerder_Action();
      }

en de methode txtAntwoord_Action ziet er dan als volgt uit:

public void txtAntwoord_Action()
   {
// regel 1,2,3: getallen uit de tekstvensters in variabelen zetten
       int g1=Integer.parseInt(txtGetal1.getText());
       int g2=Integer.parseInt(txtGetal2.getText());
       int a=Integer.parseInt(txtAntwoord.getText());
// regel 4: De string tekst declareren, voorlopig wordt het de lege string
       String tekst="";
// regel 5 t/m 12
       if (a==g1+g2)
           {
            aantalgoed=aantalgoed+1;tekst=" Goed zo!       ";
           }
           else
           {
            tekst=" Fout !        ";
           };
// regel 13
       txtAntwoord.setEnabled(false);
// regel 14 t/m 17
       if (nummer_som < maxaantal) 
           {btnVerder.setVisible(true);}
       else
           {lblVulin.setText("Afgelopen");}
// regel 18 t/m 21
       String aantalg=String.valueOf(aantalgoed);
       String aantals=String.valueOf(nummer_som);
       lblGoedzo.setText(tekst+aantalg+" van de "+aantals);
       lblGoedzo.setVisible(true);
   }

Wat betekent dit allemaal ?
  • Er wordt gekeken welk getal in het tekstvak txtGetal1 staat, en dat getal wordt in g1 gezet (regel 1)
  • regel 2:Het getal in textvak txtGetal2 wordt in g2 gezet, en (regel 3) het getal in textvak txtAntwoord wordt in a gezet.

    Deze variabelen moeten eerst weer worden gedeclareerd, dat gebeurt doordat er int voor staat.
    Elke methode wordt eigenlijk als een apart programma opgevat, en de variabelen moeten in elke procedure opnieuw worden gedeclareerd.
    Behalve bij "instantie-variabelen", dat is de term die in java gebruikt wordt voor globale variabelen, daarover straks meer.
  • Het goedzo-label mag nu (als het antwoord is ingetypt) verschijnen, maar er mag natuurlijk alleen "goed zo!" op staan als het ingetypte antwoord goed was, en als het anwoord verkeerd was moet het opschrift worden: "Fout ! "

    De tekst voor het Goedzo-label wordt eerst in de string met de naam tekst vastgelegd, en die string moet eerst gedeclareerd worden. Dat gebeurt in regel 4
  • regel 5: Als a (dat is het ingetypte antwoord) gelijk is aan g1+g2 (dat is het antwoord dat de computer berekent, en dat is natuurlijk goed), dan moet de variabele waarin het aantal goede antwoorden bewaard wordt met één verhoogd worden (aantalgoed = aantalgoed + 1), (zie regel 7)
    (in plaats van (aantalgoed = aantalgoed + 1) mag je ook (aantalgoed++ typen)
    en de tekst voor het Goedzo-label wordt in de string met de naam tekst vastgelegd
    d.m.v. de opdracht tekst="Goed zo! " (zie regel 7)

    En als het antwoord fout was wordt het opschrift van het goedzo-label "Fout!" (zie regel 11)
  • In regel 13 wordt er voor gezorgd dat het antwoord niet meer veranderd kan worden.
  • Als het aantal sommetjes kleiner dan 10 is (regel 14; maxaantal heeft de waarde 10, dat is in de methode init vastgelegd) dan verschijnt de verder-knop (regel 15) en anders verschijnt er op het vulin-label "Afgelopen!" (regel 17)
  • Zinnen of woorden aan elkaar plakken doe je net zoals in VB met behulp van de +
    In regel 20 krijgt het goedzo-label op die manier de juiste tekst

  18.4.4. Instantie-variabelen en globale variabelen.

In de methode txtAntwoord_Action van de vorige paragraaf komen de variabelen aantalgoed, nummer_som en maxaantal voor.
Die zijn niet in die methode gedeclareerd.
Normaal worden de variabelen, die je in een methode gebruikt, gedeclareerd in die methode, maar hier dus niet.
Daar is een reden voor.
Zodra een methode is uitgevoerd worden de geheugenplaatsen, die in die methode zijn gedeclareerd, opgeruimd. Ze zijn gewoon weg.

Daarom moeten de variabelen aantalgoed, nummer_som en maxaantal ergens anders worden gedeclareerd, en wel in het begin van het programma. Nog voor de methode init, vlak onder de header van de klasse

Daar zet je neer:
int aantalgoed = 0;
int nummer_som = 1;
int maxaantal = 10;

nummer_som en aantalgoed zijn dan zogenaamde instantie-variabelen.
In de meeste andere porgrammeertalen worden dat globale variabelen genoemd, en de variabelen die in een methode zijn gedeclareerd heten lokale variabelen.
In Java worden globale variabelen dus instantie-variabelen genoemd, en die mogen in elke methode van het programma gebruikt worden zonder dat ze daar weer apart gedeclareerd worden. Ze houden hun waarde vast.

  18.4.5. Wat moet er gebeuren als er op de verder-knop geklikt wordt.

Als er op de verder-knop wordt geklikt moet er een nieuw sommetje komen.

Om er voor te zorgen dat het programma reageert als er op de verder-knop wordt geklikt moet er een ActionListener aan de verder-knop gekoppeld zijn.
Daarom staat in de methode init de opdracht btnVerder.addActionListener(this);

En dan kun je in de methode actionPerformed invoeren wat er moet gebeuren:

public void actionPerformed(ActionEvent e)
      {
          if (e.getSource() == btnVerder)
          {
           ...........................
           ...........................
          }
      }

Op de stippeltjes zouden we dan de opdrachten kunnen zetten, die moeten worden uitgevoerd als er op de verder-knop is geklikt.
Maar om het overzichtelijk te houden hebben we die opdrachten in een aparte methode gezet, die we btnVerder_Action hebben genoemd.
Dat hebben we gedaan omdat in diezelfde methode actionPerformed ook de opdrachten geplaatst moeten worden die moeten worden uitgevoerd als er op enter is gedrukt in het antwoordvak.

We hebben het dus als volgt gedaan:

public void actionPerformed(ActionEvent e)
      {
          if (e.getSource() == txtAntwoord)
            txtAntwoord_Action();
         else if (e.getSource() == btnVerder)
            btnVerder_Action();
      }

en de methode btnVerder_Action ziet er dan als volgt uit:

public void btnVerder_Action()
    {
// regel 1 t/m 8: er verschijnen random-getallen in txtGetal1 en txtGetal2
        int g1=(int)Math.ceil(100.0*Math.random());
        g1=g1-50;
        if ((g1<10) && (g1>-10)) g1=g1-20;
        txtGetal1.setText(String.valueOf(g1));
        int g2=(int)Math.ceil(100.0*Math.random());
        g2=g2-50;
        if ((g2<10) && (g2>-10)) g2=g2-20;
        txtGetal2.setText(String.valueOf(g2));
// regel 9 en 10: de verder-knop en het goedzo-label worden onzichtbaar
        btnVerder.setVisible(false);
        lblGoedzo.setVisible(false);
// het somnummer wordt met 1 verhoogd en dat wordt op het label vermeld
        nummer_som=nummer_som+1;
        String nummersom=String.valueOf(nummer_som);
        lblHoeveelstesom.setText("som "+nummersom);
// het antwoordvak wordt leeg gemaakt, er wordt voor gezorgd dat er in
// getypt kan worden en het krijgt de focus
        txtAntwoord.setText("");
        txtAntwoord.setEnabled(true);
        txtAntwoord.requestFocus();
    }

Dat lijkt heel veel op de opdrachten die er voor zorgen dat het eerste sommetje verschijnt.

Dit is hopelijk allemaal wel duidelijk, met het commentaar er bij.

  18.4.6. Een applet in een homepage opnemen.

Als je dit applet in een homepage op wilt nemen dan moet je er voor zorgen dat de broncode gecompileerd wordt.
Dat doe je door in de menubalk op Build te klikken, en dan op Compile Project
Als je het programma Oefening5 hebt genoemd, dan wordt er een bestand Oefening5.class aangemaakt.
De broncode is opgeslagen in het bestand met de naam Oefening5.java en Oefening5.class wordt opgeslagen in een submap van de map waarin Oefening5.java staat, en die submap heeft de naam classes.
In diezelfde map classes staat ook een html-bestand Oefening5.htm, dat door JCreator automatisch is aangemaakt.
Als je daarop dubbelklikt dan zie je het applet in de browser verschijnen.
En als je de broncode van die html-pagina opvraagt dan zie je daarin de regel
<APPLET CODE="Oefening5.class" WIDTH=500 HEIGHT=300> </APPLET>
(de hoogte en de breedte kunnen bij jou anders zijn)
En die regel zorgt er voor dat het applet op de homepage verschijnt.
Je moet er wel voor zorgen, als je zo'n html-bestand zelf maakt, dat de class-file in de zelfde map staat als het html-bestand (of dat het pad er bij staat in de verwijzing)
Je kunt nog meer doen in zo'n html-bestand: je kunt ook waarden vanuit de html-code meegeven aan het applet.
We zijn er in de vorige paragrafen van uit gegaan dat er 10 sommetjes verschijnen.
Dat aantal kun je ook variëren, en in de code van de html-pagina opgeven.
Je voegt dan een regel toe aan de code voor het applet, je maakt er bijvoorbeeld van:

<APPLET CODE="Oefening5.class" WIDTH=500 HEIGHT=300>
<param name=maxaantal value="5">
</APPLET>

En dan moet je in het java-programma daar ook rekening mee houden.
In de init-methode zet je er dan het volgende bij:

String max="";
max = getParameter("maxaantal");
if (max==null) 
	{maxaantal=10;}
else
	{maxaantal=Integer.parseInt(max);}

Uitleg:
  • De opdracht max = getParameter("maxaantal"); heeft tot gevolg dat er in het html-bestand naar een regel wordt gezocht, die begint met <param name=maxaantal
    En max krijgt dan de waarde die achter value staat, in dit geval 5 want in de html-code staat:
    <param name=maxaantal value="5">
  • De opdracht if (max==null) {maxaantal=10;} heeft tot gevolg dat, als max geen waarde heeft gekregen omdat de betreffende regel niet in het html-bestand is opgenomen (of er is een tikfout gemaakt), maxaantal de waarde 10 krijgt.
  • De regel else {maxaantal=Integer.parseInt(max);} heeft tot gevolg dat, maxaantal de getalswaarde krijgt van de string max (een parameter, die op deze manier wordt doorgegeven, kan alleen maar een string zijn)
    Dat gebeurt m.b.v. de methode parseInt van de klasse Integer.
Probeer het maar eens !

  18.4.7. De volledige code.

Tot slot nog de volledige code:

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

public class Oefening5 extends Applet implements ActionListener 
{ 
   int nummer_som=1;
   int aantalgoed=0;
   int maxaantal=10;
   Label lblVulin;
   Label lblHoeveelstesom;
   TextField txtGetal1;
   TextField txtPlus;
   TextField txtGetal2;
   TextField txtIsgelijk;
   TextField txtAntwoord;
   Label lblGoedzo;
   Button btnVerder;

   public void init()
   {
      setLayout(null);
      setSize(350,150);
      lblVulin = new Label("Vul in, druk dan op enter",Label.CENTER);
      lblVulin.setBounds(20,20,200,30);
      lblVulin.setFont(new Font("Dialog", Font.BOLD, 16));
      lblVulin.setBackground(new Color(255,255,0));
      add(lblVulin);
      txtGetal1 = new TextField();
      txtGetal1.setText("");
      txtGetal1.setBounds(20,70,42,30);
      txtGetal1.setFont(new Font("Dialog", Font.BOLD, 16));
      txtGetal1.setEnabled(false);
      add(txtGetal1);
      txtPlus = new TextField();
      txtPlus.setText("  +");
      txtPlus.setBounds(60,70,32,30);
      txtPlus.setFont(new Font("Dialog", Font.BOLD, 16));
      txtPlus.setEnabled(false);
      add(txtPlus);
      txtGetal2 = new TextField();
      txtGetal2.setText("");
      txtGetal2.setBounds(90,70,42,30);
      txtGetal2.setFont(new Font("Dialog", Font.BOLD, 16));
      txtGetal2.setEnabled(false);
      add(txtGetal2);
      txtIsgelijk = new TextField();
      txtIsgelijk.setText("  =");
      txtIsgelijk.setBounds(130,70,32,30);
      txtIsgelijk.setFont(new Font("Dialog", Font.BOLD, 16));
      txtIsgelijk.setEnabled(false);
      add(txtIsgelijk);
      txtAntwoord = new TextField();
      txtAntwoord.setBounds(160,70,60,30);
      txtAntwoord.setFont(new Font("Dialog", Font.BOLD, 16));
      add(txtAntwoord);
      lblGoedzo = new Label("Goed zo !",Label.CENTER);
      lblGoedzo.setVisible(false);
      lblGoedzo.setBounds(20,120,200,30);
      lblGoedzo.setFont(new Font("Dialog", Font.BOLD, 16));
      lblGoedzo.setBackground(new Color(255,0,0));
      add(lblGoedzo);
      lblHoeveelstesom = new Label("som 1",Label.CENTER);
      lblHoeveelstesom.setBounds(250,20,70,30);
      lblHoeveelstesom.setFont(new Font("Dialog", Font.BOLD, 16));
      lblHoeveelstesom.setBackground(new Color(255,255,0));
      add(lblHoeveelstesom);
      btnVerder = new Button("Verder");
      btnVerder.setVisible(false);
      btnVerder.setBounds(250,120,70,30);
      btnVerder.setFont(new Font("Dialog", Font.BOLD, 16));
      btnVerder.setBackground(new Color(150,150,150));
      add(btnVerder);

      txtAntwoord.addActionListener(this);
      btnVerder.addActionListener(this);
      
      int g1=(int)Math.ceil(100.0*Math.random());
      g1=g1-50;
      if ((g1<10) && (g1>-10)) g1=g1-20;
      txtGetal1.setText(String.valueOf(g1));
      int g2=(int)Math.ceil(100.0*Math.random());
      g2=g2-50;
      if ((g2<10) && (g2>-10)) g2=g2-20;
      txtGetal2.setText(String.valueOf(g2));
      btnVerder.setVisible(false);
      lblGoedzo.setVisible(false);
      txtAntwoord.requestFocus();
      
      String max="";
      max=getParameter("maxaantal");
      if (max==null) 
           {maxaantal=10;}
      else
           {maxaantal=Integer.parseInt(max);}
   }

   public void actionPerformed(ActionEvent e)
      {
          if (e.getSource() == txtAntwoord)
            txtAntwoord_Action();
          else if (e.getSource() == btnVerder)
            btnVerder_Action();
      }

   public void txtAntwoord_Action()
   {
       int g1=Integer.parseInt(txtGetal1.getText());
       int g2=Integer.parseInt(txtGetal2.getText());
       int a=Integer.parseInt(txtAntwoord.getText());
       String tekst="";
       if (a==g1+g2)
           {aantalgoed=aantalgoed+1;tekst=" Goed zo! ";}
           else
           {tekst=" Fout ! ";}
       lblGoedzo.setVisible(true);
       lblGoedzo.setText(tekst);
       txtAntwoord.setEnabled(false);
       if (nummer_som<maxaantal) 
           {btnVerder.setVisible(true);}
       else
           {lblVulin.setText("Afgelopen");}
       String aantalg=String.valueOf(aantalgoed);
       String aantals=String.valueOf(nummer_som);
       lblGoedzo.setText(tekst+aantalg+" van de "+aantals);
       lblGoedzo.setVisible(true);
   }

   public void btnVerder_Action()
   {
       int g1=(int)Math.ceil(100.0*Math.random());
       g1=g1-50;
       if ((g1<10) && (g1>-10)) g1=g1-20;
       txtGetal1.setText(String.valueOf(g1));
       int g2=(int)Math.ceil(100.0*Math.random());
       g2=g2-50;
       if ((g2<10) && (g2>-10)) g2=g2-20;
       txtGetal2.setText(String.valueOf(g2));
       btnVerder.setVisible(false);
       lblGoedzo.setVisible(false);
       nummer_som=nummer_som+1;
       String nummersom=String.valueOf(nummer_som);
       lblHoeveelstesom.setText("som "+nummersom);
       txtAntwoord.setText("");
       txtAntwoord.setEnabled(true);
       txtAntwoord.requestFocus();
   }
}

Hieronder zie je het applet, probeer maar eens!

  18.4.8. Het gebruik van swing.

Er is een nieuwere versie van de package awt: swing Daarmee kun je modernere interactiecomponenten maken, met meer mogelijkheden.
Als je daar gebruikvan wilt maken dan moet je rekening houden met het volgende:
  1. aan het begin een extra package importeren, namelijk:
    import javax.swing.*;
  2. In de kopregel vermelden dat het om een uitbreiding gaat van JApplet.
    De kop wordt dus:
    public class Oefening5 extends JApplet implements ActionListener
  3. Bij het declareren van labels, knoppen, tekstvensters enz. moet er een J voor het object.
    Dus JLabel, JButton, JTextField, enz
  4. In de methode init plaats je de volgende opdracht: Container c = this.getContentPane(); De interactiecomponenten kunnen namelijk niet rechtstreeks op het applet getekend worden, er wordt eerst een container gedeclareerd en gemaakt, en daarop worden de interactiecomponenten getekend.
    Ook de achtergrondkleur enz. moet worden toegepast op de container.
    Je voegt bijv. de volgende opdrachten toe:
    c.setLayout(null);
    c.setSize(350,150); c.setBackground(new Color(255,255,255));
  5. De interactiecomponenten moeten op de container worden geplaatst m.b.v. de methode add.
    Om bijvoorbeeld het eerste label te maken en te plaatsen gebruik je de volgende opdrachten:
    lblVulin = new JLabel("Vul in, druk dan op enter",JLabel.CENTER);
    lblVulin.setBounds(20,20,200,30);
    // Deze opdracht moet je toevoegen om het label te kunnen kleuren.
    lblVulin.setOpaque(true);
    lblVulin.setFont(new Font("Dialog", Font.BOLD, 16));
    lblVulin.setBackground(new Color(255,255,0));
    c.add(lblVulin);

De code van het begin t/m de methode init is dan als volgt (de rest verandert niet):

import java.awt.*; 

import java.awt.*; 
import java.applet.*; 
import java.awt.event.*; 
import javax.swing.*;

public class Oefening5 extends JApplet implements ActionListener 
{ 
   int nummer_som=1;
   int aantalgoed=0;
   int maxaantal=10;
   JLabel lblVulin;
   JLabel lblHoeveelstesom;
   JTextField txtGetal1;
   JTextField txtPlus;
   JTextField txtGetal2;
   JTextField txtIsgelijk;
   JTextField txtAntwoord;
   JLabel lblGoedzo;
   JButton btnVerder;

   public void init()
   {
      Container c = this.getContentPane();
      c.setLayout(null);
      setSize(350,150);
      c.setBackground(new Color(255,255,255));
      lblVulin = new JLabel("Vul in, druk dan op enter",JLabel.CENTER);
      lblVulin.setBounds(20,20,200,30);
      lblVulin.setOpaque(true);
      lblVulin.setFont(new Font("Dialog", Font.BOLD, 16));
      lblVulin.setBackground(new Color(255,255,0));
      c.add(lblVulin);
      txtGetal1 = new JTextField();
      txtGetal1.setText("");
      txtGetal1.setBounds(20,70,42,30);
      txtGetal1.setFont(new Font("Dialog", Font.BOLD, 16));
      txtGetal1.setEnabled(false);
      c.add(txtGetal1);
      txtPlus = new JTextField();
      txtPlus.setText("  +");
      txtPlus.setBounds(60,70,32,30);
      txtPlus.setFont(new Font("Dialog", Font.BOLD, 16));
      txtPlus.setEnabled(false);
      c.add(txtPlus);
      txtGetal2 = new JTextField();
      txtGetal2.setText("");
      txtGetal2.setBounds(90,70,42,30);
      txtGetal2.setFont(new Font("Dialog", Font.BOLD, 16));
      txtGetal2.setEnabled(false);
      c.add(txtGetal2);
      txtIsgelijk = new JTextField();
      txtIsgelijk.setText("  =");
      txtIsgelijk.setBounds(130,70,32,30);
      txtIsgelijk.setFont(new Font("Dialog", Font.BOLD, 16));
      txtIsgelijk.setEnabled(false);
      c.add(txtIsgelijk);
      txtAntwoord = new JTextField();
      txtAntwoord.setBounds(160,70,60,30);
      txtAntwoord.setFont(new Font("Dialog", Font.BOLD, 16));
      c.add(txtAntwoord);
      lblGoedzo = new JLabel("Goed zo !",JLabel.CENTER);
      lblGoedzo.setVisible(false);
      lblGoedzo.setBounds(20,120,200,30);
      lblGoedzo.setFont(new Font("Dialog", Font.BOLD, 16));
      lblGoedzo.setOpaque(true);
      lblGoedzo.setBackground(new Color(255,0,0));
      c.add(lblGoedzo);
      lblHoeveelstesom = new JLabel("som 1",JLabel.CENTER);
      lblHoeveelstesom.setBounds(250,20,70,30);
      lblHoeveelstesom.setOpaque(true);
      lblHoeveelstesom.setFont(new Font("Dialog", Font.BOLD, 16));
      lblHoeveelstesom.setBackground(new Color(255,255,0));
      c.add(lblHoeveelstesom);
      btnVerder = new JButton("Verder");
      btnVerder.setVisible(false);
      btnVerder.setBounds(250,120,90,30);
      btnVerder.setFont(new Font("Dialog", Font.BOLD, 16));
      btnVerder.setBackground(new Color(150,150,150));
      c.add(btnVerder);
}

Opgaven.
Maak nu opgave 4 van hoofdstuk 18 (Java)