Groeidocument Week 1 Hoofdstuk 9 Fer van Rijswijk Yvonne van Dorst VTI 1 A.2 Inhoudsopgave Vragen 9.6 1. Wat is een klasse? Een klasse is een specificatie bij het maken van objecten, hierin staan alle attributen en methoden. 2. Wat zijn de leden van een klasse? Attributen en de methoden. 3. Wat is een constructor? Een soort methode die helpt bij het maken van een object. 4. Waar dient een methode voor? Een methode voert in het algemeen handelingen uit op of met behulp de attributen van het object. 5. Wat is de referentie this? Wanneer gebruik je die? Een referentie naar het huidige object. Je moet die gebruiken als een attribuut dezelfde naam heeft als het argument van een methode. 6. In voorbeeld 9.3 is drie keer de referentie this gebruikt in de constructor. Mag je this daar weglaten? In hetzelfde voorbeeld is this ook drie keer gebruikt in de methode toString(). Mag je in dit geval this weglaten? In de constructor mag je this niet weglaten omdat de argumenten dezelfde namen hebben als de attributen. In de methode toString() mag je this wel weglaten omdat daar geen naamsverwarring kan ontstaan 7. Maak het ontwerp voor een klasse Datum, met int dag, maand en jaar als attributen. Welke methoden lijken handig voor zo'n klasse? Datum int dag int maand int jaar Datum() Datum( int dag, int maand, int jaar ) void toon() int getDag() int getMaand() int getJaar() void setDag( int dag ) void setMaand( int maand ) void setJaar( int jaar ) 8. Maak het ontwerp voor een klasse Persoon, met voor- en achternaam en geboortedatum als attributen. Welke methoden wil je de klasse geven? Persoon String achternaam String voornaam Datum geboortedatum Persoon( String achternaam, String voornaam, Datum gebdat ) void toon() String getAchternaam() String getVoornaam() int getJaar() void setDag( int dag ) void setMaand( int maand ) void setJaar( int jaar ) 9. Gegeven is de klasse Test met twee methoden: class Test { ... void eersteMethode() { ... } void tweedeMethode() { ... } } Op welke twee manieren kun je in eersteMethode() de tweede methode aanroepen? In een applet-klasse maak je een instantie van Test met de naam test. Hoe kun je dan in de applet-klasse de tweede methode aanroepen? Met tweedeMethode(); of met this.tweedeMethode(); 10. Wat is een access-modifier? De woorden of een van de woorden: public, private of protected. Vragen 9.7 1. Tijdstip Schrijf de specificatie voor een klasse Tijdstip met daarin drie attributen van het type int voor de uren, de minuten en de seconden. Geef de klasse een constructor met drie argumenten voor het initialiseren van drie attributen. Geef de klasse twee methoden: volgendUur(), warmee je het tijdstip een uur verder zet (ga uit van een 24uurs klok), en een methode toString(), zodat je een bepaald tijdstip op het scherm kunt laten zien. Zorg ervoor dat de tijdstippen op een nette manier op het scherm komen, bijvoorbeeld: 15:05:03 of 14:00:59. Je moet zelf voor het juiste aantal nullen in de uitvoer zorgen. Het is het handigst als je daar een aparte methode voor maakt die door toString() wordt aangeroepen. Geef de klasse ook methoden volgendeMinuut() en volgendeSeconde(). Maak ten slotte een applet met drie knoppen waarmee je het volgende uur, de volgende minuut of de colgende seconde kunt instellen. Code: package h9_1; import java.awt.*; import java.awt.event.*; import java.applet.*; public class Tijdstip extends Applet { private tijd klok; Button Bseconde; Button Bminuut; Button Buur; public void init() { klok = new tijd(); Bseconde = new Button("seconde"); Bseconde.addActionListener(new BsecondeKnopHandler()); Bminuut = new Button("minuut"); Bminuut.addActionListener(new BminuutKnopHandler()); Buur = new Button("uur"); Buur.addActionListener(new BuurKnopHandler()); add(Buur); add(Bminuut); add(Bseconde); } public void paint(Graphics g) { klok.teken( g ); } class BuurKnopHandler implements ActionListener { public void actionPerformed(ActionEvent e) { klok.plusUur(); repaint(); } } class BminuutKnopHandler implements ActionListener { public void actionPerformed(ActionEvent e) { klok.plusMinuut(); repaint(); } } class BsecondeKnopHandler implements ActionListener { public void actionPerformed(ActionEvent e) { klok.plusSeconde(); repaint(); } } } class tijd { private int uur; private int minuut; private int seconde; public tijd() { this.uur = uur; this.minuut = minuut; this.seconde = seconde; } public void plusUur() { if (uur < 23) { uur += 1; } else uur = 0; } public void plusMinuut() { if (minuut < 59) { minuut += 1; } else { if (uur < 23) { uur += 1; minuut = 0; } else uur = 0; } } public void plusSeconde() { if (seconde < 59) { seconde += 1; } else { if (minuut < 59) { minuut += 1; seconde = 0; } else { if (uur < 23) { uur += 1; seconde = 0; minuut = 0; } else { uur = 0; seconde = 0; minuut = 0; } } } } public void teken(Graphics g) { if (uur < 10) { if (minuut < 10) { if (seconde < 10) { g.drawString("0" + uur + ":0" + minuut + ":0" + seconde, 200, 100); } else{ g.drawString("0" + uur + ":0" + minuut + ":" + seconde, 200, 100); } } else if( seconde < 10 ){ g.drawString("0" + uur + ":" + minuut + ":0" + seconde, 200, 100); } else{ g.drawString("0" + uur + ":" + minuut + ":" + seconde, 200, 100); } } else if( minuut < 10){ if( seconde < 10){ g.drawString("" + uur + ":0" + minuut + ":0" + seconde, 200, 100); } else{ g.drawString("" + uur + ":0" + minuut + ":" + seconde, 200, 100); } } else if( seconde < 10){ g.drawString( "" + uur + ":" + minuut + ":0" + seconde, 200, 100); } else{ g.drawString( "" + uur + ":" + minuut + ":" + seconde, 200, 100); } } } Screenshots: 2. Cirkel Cirkel. Maak een klasse cirkel met als attributen de x- en y-cöordinaat van het middelpunt en de straal van de cirkel. Geef de klasse een constructor met argumenten die de attributen initialiseren. Maak ook een methode void teken( Graphics g ) die de cirkel kan tekenen. Maak daarbij gebruik van de methode drawOval() uit de Java-bibliotheek (zie hoofdstuk 2). Bedenk dat drawOval() niet uitgaat van het middelpunt en de straal, maar van de linker bovenhoek en de diameter van de cirkel. Maak een methode void setMiddelpunt( int x, int y ) waarmee je de cirkel een ander middelpunt geeft. En een methode: void setStraal( int straal ) waarmee je de straal een andere waarde kunt geven. Schrijf een applet met wat knoppen om het een en ander te testen. Code: package h9_2; import java.awt.*; import java.awt.event.*; import java.applet.*; public class cirkel extends Applet { private test ronde1; private Button increasex; private Button decreasex; private Button increasey; private Button decreasey; private Button increasestraal; private Button decreasestraal; public void init() { ronde1 = new test( 25, 25, 25 ); increasex = new Button( "-->" ); increasex.addActionListener( new increasexKnopHandler() ); decreasex = new Button( "<--" ); decreasex.addActionListener( new decreasexKnopHandler() ); increasey = new Button( "^" ); increasey.addActionListener( new increaseyKnopHandler() ); decreasey = new Button( "v" ); decreasey.addActionListener( new decreaseyKnopHandler() ); increasestraal = new Button( "<-->" ); increasestraal.addActionListener( new increasestraalKnopHandler() ); decreasestraal = new Button( ">--<" ); decreasestraal.addActionListener( new decreasestraalKnopHandler() ); add( add( add( add( add( add( increasex ); decreasex ); increasey ); decreasey); increasestraal ); decreasestraal ); } public void paint( Graphics g ) { ronde1.teken( g ); } class increasexKnopHandler implements ActionListener{ public void actionPerformed( ActionEvent e ){ ronde1.rechts(); repaint(); } } class decreasexKnopHandler implements ActionListener{ public void actionPerformed( ActionEvent e ){ ronde1.links(); repaint(); } } class increaseyKnopHandler implements ActionListener{ public void actionPerformed( ActionEvent e ){ ronde1.omhoog(); repaint(); } } class decreaseyKnopHandler implements ActionListener{ public void actionPerformed( ActionEvent e ){ ronde1.omlaag(); repaint(); } } class increasestraalKnopHandler implements ActionListener{ public void actionPerformed( ActionEvent e ){ ronde1.groter(); repaint(); } } class decreasestraalKnopHandler implements ActionListener{ public void actionPerformed( ActionEvent e ){ ronde1.kleiner(); repaint(); } } } class test { private int private int private int private int x; y; straal; middel; public test( int x, int y, int straal ){ this.x = x-straal; this.y = y-straal; this.straal = straal; this.middel = straal; } public void x += 5; } public void x -= 5; } public void y -= 5; } public void y += 5; } public void straal += y -= 10; rechts() { links() { omhoog() { omlaag() { groter() { 5; x -= 10; } public void kleiner() { straal -= 5; y += 10; x += 10; } public void teken( Graphics g ){ g.drawOval( x+straal, y+straal, 2*straal, 2*straal ); } public void setMiddelpunt( int x, int y ){ this.y = y - straal; this.x = x - straal; } } Screenshots: Opdracht 3 Spaarrekening. Voeg aan de klasse Spaarrekening van voorbeeld 9.4 een methode toe om een bedrag van de rekening op te nemen: void neemOp ( double bedrag ) Geef de klasse een methode double getSaldo () die het saldo van een bepaalde spaarrekening als terugkeerwaarde aflevert. Test deze methoden (en de klasse) door een applet te maken met een tekstvak waarin je een bedrag kunt tikken, en twee knoppen; een om te storten en een om op e nemen. Laat telkens het saldo in een ander tekstvak zien. Code: package h9_3; import java.awt.*; import java.awt.event.*; import java.applet.*; public class Applet1 extends Applet { private SpaarRekening rekening; Button knop1, knop2; TextField tekstvak; public void init (){ setFont ( new Font ("SansSerif", Font.BOLD, 14) ); rekening = new SpaarRekening ("Welmer", 100, 4.5); knop1 = new Button ("Storten"); knop1.addActionListener (new StortKnopHandler () ); knop2 = new Button ("Opnemen"); knop2.addActionListener (new OpneemKnopHandler () ); tekstvak = new TextField (" ", 20); add (knop1); add (knop2); add (tekstvak); } public void paint (Graphics g){ int yPos = 100; g.drawString (" " + rekening, 20, yPos +=20); } class OpneemKnopHandler implements ActionListener{ public void actionPerformed (ActionEvent e){ double invoer; Double invoerGetal = Double.valueOf ( tekstvak.getText() ); invoer = invoerGetal.doubleValue(); rekening.neemOp ( invoer ); repaint (); } } class StortKnopHandler implements ActionListener{ public void actionPerformed (ActionEvent e){ double invoer; Double invoerGetal = Double.valueOf ( tekstvak.getText() ); invoer = invoerGetal.doubleValue(); rekening.stort ( invoer ); repaint (); } } } class SpaarRekening{ private String naam; private double saldo; private double percentage; public SpaarRekening (String naam, double saldo, double percentage){ this.naam = naam; this.saldo = saldo; this.percentage = percentage; } public String toString (){ String str = "Saldo van " + naam + " is " + saldo + " (" + percentage +" %)"; return str; } public void stort ( double bedrag ){ saldo += bedrag; } public void neemOp (double bedrag){ saldo -= bedrag; } public void schrijfRenteBij (){ double rente = saldo * percentage / 100; saldo += rente; } public double getSaldo (){ return saldo; } } Screenshots: Opdracht 4 In paragraaf 9.4.5 staat dat elke klasse uit de klassenbibliotheek van Java een methode toString () heeft, waarmee je informatie over dat object in een string kunt verkrijgen. Ga na wat het resultaat is als je het bericht toString () verstuurt naar een instantie van de klasse Button, een TextField en naar de applet zelf. Code: package opgave_9_7_4; import java.awt.*; import java.awt.event.*; import java.applet.*; public class opgave_9_7_4 extends Applet implements ActionListener { private String stringTest = "druk op de knop"; private TextField fieldTest; private Button buttonTest; private int teller = 1; public void init() { fieldTest = new TextField(10); buttonTest = new Button("Test"); buttonTest.addActionListener(this); add(buttonTest); add(fieldTest); } public void actionPerformed(ActionEvent e) { if(teller == 1) { stringTest = this.toString(); } if(teller == 2) { stringTest = fieldTest.toString(); } if(teller == 3) { stringTest = buttonTest.toString(); } teller ++; repaint(); if(teller > 2) { teller = 0; } } public void paint(Graphics g) { g.drawString(stringTest, 100, 100) ; } } Screenshots: Opdracht 5 Boom. Maak een klasse voor een boom als in figuur 9.15. Bedenk welke eigenschappen volgens jou een boom heeft; elk van deze eigenschappen is een attribuut voor de klasse. Geef de klasse een constructor waarmee je de attributen initialiseert en een methode public void teken (Graphics g) om een boom te kunnen tekenen. Code: package h9_5; import java.awt.*; import java.awt.event.*; import java.applet.*; public class Applet1 extends Applet { private Boom boom; public void init (){ boom = new Boom (100, 250, 80, 20); } public void paint (Graphics g){ boom.teken (g); } } class Boom { private int private int private int private int x; y; stambreedte; stamhoogte; public Boom (int x, int y, int stamhoogte, int stambreedte ){ this.x = x; this.y = y; this.stambreedte = stambreedte; this.stamhoogte = stamhoogte; } public void teken (Graphics g){ g.setColor( new Color( 85, 43, 0) ); g.fillRect( x, y-stamhoogte, stambreedte, stamhoogte ); g.setColor( Color.green ); g.fillOval( x-(2*stambreedte), y-((stamhoogte)+(4*stambreedte))+5, 5*stambreedte, 4*stambreedte ); g.setColor( Color.black ); g.drawOval( x-(2*stambreedte), y-((stamhoogte)+(4*stambreedte))+5, 5*stambreedte, 4*stambreedte); g.setColor( Color.red ); g.fillOval( x-(2*stambreedte)+(1*stambreedte), y((stamhoogte)+(4*stambreedte))+(1*stambreedte), 10, 10 ); g.fillOval( x-(2*stambreedte)+(2*stambreedte), y((stamhoogte)+(4*stambreedte))+(1*stambreedte), 10, 10 ); g.fillOval( x-(2*stambreedte)+(1*stambreedte), y- ((stamhoogte)+(4*stambreedte))+(3*stambreedte), 10, 10 ); g.fillOval( x-(2*stambreedte)+(3*stambreedte), y((stamhoogte)+(4*stambreedte))+(2*stambreedte), 10, 10 ); } } Screenshots: Opdracht 6 Dobbelsteen. Maak een klasse voor een dobbelsteen. Bedenk welke attributen een dobbelsteen heeft om een bepaalde worp op het scherm te kunnen laten zien. Geef de klasse een constructor, een methode public void werp () waarmee random het aantal ogen wordt bepaald, en een methode pubic void teken (Graphics g) om een dobbelsteen te kunnen tekenen. Code: package h9_6; import java.awt.*; import java.awt.event.*; import java.applet.*; public class Applet1 extends Applet { private Button buttonGooi; private TextField fieldGetal; String stringGetal = "Druk op de knop"; Dobbelsteen mijnDobbelsteen; public void init(){ buttonGooi = new Button( "Gooi" ); buttonGooi.addActionListener(new gooiHandler() ); fieldGetal = new TextField(4); add(buttonGooi); add(fieldGetal); mijnDobbelsteen = new Dobbelsteen(); } public void paint(Graphics g){ mijnDobbelsteen.teken(g); } class gooiHandler implements ActionListener{ public void actionPerformed(ActionEvent e){ mijnDobbelsteen.werp(); fieldGetal.setText("" + mijnDobbelsteen.ogen); repaint(); } } } class Dobbelsteen{ int ogen; public Dobbelsteen(){ } public void werp(){ ogen = (int) ( 6 * Math.random() + 1 ); } public void teken(Graphics g){ g.setColor(Color.white); g.fillRoundRect(100, 100, 100, 100, 20, 20); g.setColor(Color.black); if (ogen == 6) { g.fillOval(110, g.fillOval(110, g.fillOval(110, g.fillOval(170, g.fillOval(170, g.fillOval(170, } if (ogen == 5) { g.fillOval(110, g.fillOval(110, g.fillOval(140, g.fillOval(170, g.fillOval(170, } if (ogen == 4) { g.fillOval(110, g.fillOval(110, g.fillOval(170, g.fillOval(170, } if (ogen == 3) { g.fillOval(110, g.fillOval(140, g.fillOval(170, } if (ogen == 2) { g.fillOval(110, g.fillOval(170, } if (ogen == 1) { g.fillOval(140, } } } Screenshots: 110, 140, 170, 110, 140, 170, 20, 20, 20, 20, 20, 20, 20 20 20 20 20 20 ); ); ); ); ); ); 110, 170, 140, 110, 170, 20, 20, 20, 20, 20, 20 20 20 20 20 ); ); ); ); ); 110, 170, 110, 170, 20, 20, 20, 20, 20 20 20 20 ); ); ); ); 110, 20, 20 ); 140, 20, 20 ); 170, 20, 20 ); 110, 20, 20 ); 170, 20, 20 ); 140, 20, 20 ); Opdracht: een zeer eenvoudige parkeersysteem Ontwerp en schrijf een klasse ParkeerSysteem die de volgende methoden bevatten: - Een constructor ParkeerSysteem (int n), om een parkeersysteem met n plaatsen aan te maken. - Een methode inrijden om aan te geven dat één auto naar binnen gaat. - Een methode inrijden (int n) om aan te geven dat n auto’s naar binnen gaan. - Een methode uitrijden om aan te geven dat er één auto naar buiten gaat. - Een methode uitrijden (int n) om aan te geven dat n auto’s naar buiten rijden. - Een methode isVol om te bepalen of de parkeergarage vol is. - Een methode aantalBeschikbarePlaatsen die het aantal beschikbare plaatsen terug geeft. Bedenk voor zover niet aangegeven zelf de juiste resultaattypen van de methoden en typen van de parameters, waarbij je de methoden zo algemeen bruikbaar mogelijk dient te houden. Schrijf een applet waarin je een instantie van het parkeersysteem kunt uittesten. De applet moeten 2 buttons bevatten voor het simuleren van in/uit rijden van de garage. Op het scherm dien je verder weer te geven hoeveel plaatsen er nog beschikbaar zijn in de garage en ook het resultaat van de methode isVol moet op het scherm komen te staan. Code: Screenshots: