VII. De Java-klassen A. Package Het mooie aan Java is de programmeur een hele serie van klassen en afgeleide klassen geleverd worden, die de programmeur naar behoefte kan gebruiken. De basisklasse van deze hele klassenboom, is de klasse Object. Alle andere klassen zijn hiervan afgeleid. De gebruiker is vrij zijn eigen klasse af te leiden van een java-klasse, en gebruik te maken van de reeds geïmplementeerde klassevariabelen, constructoren, en methoden. Deze klassen worden gegroepeerd in packages. De ervaren programmeren kan zijn eigen package met eigen ontworpen klassen implementeren en vrij gebruiken in zijn programma s. Hiervoor verwijzen wij naar de vakliteratuur over Java. Enkele bekende packages zijn java.applet, java.lang, java.lang-errors, enz. Een beschrijving van de ganse klassenboom vindt u in de documentatie die bij JDK wordt meegeleverd. Zo vind u hierin de volgende documentatie over de klasse Applet: Class java.applet.applet java.lang.object +----java.awt.component +----java.awt.container +----java.awt.panel +----java.applet.applet De basisklasse Object is vervat in het package java.lang, de klassen Component, Container, en Panel vindt u in het package java.awt, en de klasse Applet in het package java.applet. De klassen-hierarchie is als volgt: Object Java.lang Component Java.awt Java.applet Container Java.awt Panel Java.awt Applet Legende: abstract public Inleiding tot Java door ir. C. Daniels 50
Elk onderliggende klasse erft alle methodes van de bovenliggende klasse. De klassen Component en Container zijn abstracte klassen, de andere public. Het is dus erg nuttig de documentatie bij JDK te leren gebruiken. Laten we als oefening eens de klasse String nemen. Oefening: Enkele methoden van de klasse string worden hieronder gebruikt in een oefening Oefstring //OefString.java //importeer de gewenste klasse import java.lang.string; //eigenlijk niet nodig, want java.lang wordt ALTIJD geïmporteerd! class OefString public static void main(string args[]) //Maak een nieuw object Tekst van de klasse String String Tekst = new String("Programmeren in Java is fun!"); System.out.println("De tekst: \""+Tekst+"\""); System.out.println("Deze tekst is "+ Tekst.length() + " karakters lang."); System.out.println("De eerst 'i' staat op plaats: " +Tekst.indexOf('i')); System.out.println("Vervang alle 'a's door 'x':" + Tekst.replace('a','x')); Plaats de code in een bestand OefString.java, in een project met dezelfde naam. Test uit! De uitvoer ziet eruit als volgt: De tekst: "Programmeren in Java is fun!" Deze tekst is 28 karakters lang. De eerst 'i' staat op plaats: 13 Vervang alle 'a's door 'x':progrxmmeren in Jxvx is fun! Zoek nog enkele andere methoden van de klasse String! en gebruik ze in deze oefening. Een package van java wordt in een klasse geimporteerd door de opdracht : import java.package.klasse ; Om alle klassen van een bepaald package te importeren kunt gebruikt u een asterisk * : Deze opdracht importeert alle klassen van het package java.awt. Inleiding tot Java door ir. C. Daniels 51
B. Applets in detail Een zeer interessante klasse is de klasse Applet, omdat deze ons toelaat applicaties te ontwerpen die draaien in een webpagina. Laten we deze klasse eens wat nader bestuderen. Deze is afgeleid van de klassen Component, Container en Panel. Dus ook de methoden van deze klassen kunnen we gebruiken in de klasse Applet! Een applet kent vijf belangrijke methoden: 1. void init() : initialisatie 2. void start(): het applet wordt gestart 3. void paint(): voor het weergeven van de inhoud van het applet-venster 4. void stop(): het applet wordt gestopt 5. void destroy(): als het applet wordt beëindigd. Oefening: Laten we dit eens toepassen in een eenvoudig applet maken met naam Oef1Applet: public class Oef1Applet extends Applet Font f; String s; Color c; static int i=0; System.out.println("Initialisatie met init()"+ i++); f = new Font("Serif",0,50); c = new Color(100,200,0); s =new String("Java is fun!"); public void start() System.out.println("Starten met start()"+ i++); public void paint(graphics g) System.out.println("Methode paint()"+ i++); g.setfont(f); g.setcolor(color.red); g.drawstring(s,30,100); public void stop() System.out.println("Gestopt met stop()"+ i++); public void destroy() Inleiding tot Java door ir. C. Daniels 52
System.out.println("Beëindigd met destroy()"+ i++); Compileer en test uit! En zo ziet het eruit in de appletviewer: Zoek eens op of u alle gebruikte methoden zoals paint(), setfont() en drawstring() kunt terugvinden in de java-help. Zoek ook eens naar uitleg over de klasse Graphics. In het ouput-venster kunt u ook zien wanneer de verschillende methoden worden aangeroepen: - Welke methoden worden aangeroepen bij het opstarten? - Welke bij het vergroten of verkleinen van het aplletvenster? - Welke bij het minimaliseren van het applet? - Welke bij het aflsluiten? Speel eens met de parameters van de verschillende methoden. Verander de opdracht Font f = new Font("Serif",3,50); Wat betekent de 10 en 100 in de drawstring-opdracht? C. Java awt: Abstract Windowing Toolkit Dit package bevat alle klassen vor het tekenen van vensters, knoppen, tekstvelden, enz. Deze is dus erg nuttig, en zullen we bijna altijd nodig hebben bij het ontwerpen van een applet. De klasse Container is een abstracte klasse, dwz. Dat we deze alleen kunnen gebruiken om onze eigen klasse ervan af te leiden. Een container kan weer andere grafische componenten Inleiding tot Java door ir. C. Daniels 53
bevatten, zoals canvassen, of aanklikvakjes. Een canvas is speciaal geschikt voor grafische toepassingen. Een frame is zelf ook afgeleid van een container, en kan dus op zijn beurt weer andere componenten bevatten. Tip: bij het ontwerpen van een applet kunt u zich best eerst buigen over de grafische layout van het applet. De structuur van de awt-klasse ziet eruit als volgt: Component Canvas Container TextComponent Button Panel Window TextField Apllet Frame Dialog D. De belangrijkste UI-componenten UI staat voor User Interface, een gebruikelijke engelse term voor alle componenten waarmee de gebruiker communiceert met de toepassing, zoals knoppen, tekstvelden, enz. De componenten kunnen bij het applet worden gevoegd met de methode add. 1 Labels Dit zijn de eenvoudigste componenten en bevatten wat tekst in het font van het applet. Constructors: Label(): maakt een leeg label Label(String): maakt een label met de tekst String Label(String,int): maakt een label met de tekst String, en opgelijnd. Hiervoor kunt u de constanten Label.RIGHT, Label.LEFT en Label.CENTER gebruiken Oefening: maak volgend applet met de naam OefAWT aan: public class OefAWT extends Applet Font f = new Font("Serif",0,20); Label l1= new Label("Links opgelijnd"); Label l2= new Label("Rechts opgelijnd",label.right); Label l3= new Label("Gecentreerd",Label.CENTER); Inleiding tot Java door ir. C. Daniels 54
setfont(f); add(l1); add(l2); add(l3); Bij uitvoering, (en mits u het applet de goede breedte geeft) ziet het er als volgt uit: Zoek de eigenschappen van de klasse Label ook eens op in de JDK-help. 2 Knoppen Knoppen (Engels: Button) zijn veel gebruikte componenten om bepaalde acties te starten door erop te klikken. Denk maar aan de knop OK, of Cancel. Constructors: Button(): maakt een knop zonder opschrift Button(String): maakt een knop met het opschrift String. Oefening: maak volgend applet met de naam OefAWT2 aan in een nieuw project met dezelfde naam: public class OefAWT2 extends Applet Button B1= new Button("Terugspoelen"); Button B2= new Button("Play"); Button B3= new Button("Voorwaarts"); Button B4= new Button("Stop"); add(b1); add(b2); add(b3); add(b4); Inleiding tot Java door ir. C. Daniels 55
Bij uitvoering, ziet het er als volgt uit: Merk op dat de knoppen nog niets uitvoeren, dat zien we later. 3 Aankruisvakjes Aankruisvakjes (Engels: checkboxes) worden gebruikt om bepaalde opties in een programma aan of uit te zetten. U kunt er meerdere tegelijke aan of uitzetten. Als u slechts één van de vakjes kunt aanzetten, noemt men deze vakjes radiobuttons. Constructors: Checkbox(): maakt een leeg aankruisvakje aan Checkbox(String): maakt een aankruisvakje met de tekst aan Checkbox(String,null,boolean): maakt een checkbox die al of aan staat volgens de waarde van boolean. Oefening: maak volgend applet met de naam OefAWT3 aan in een nieuw project met dezelfde naam: public class OefAWT3 extends Applet Checkbox C1= new Checkbox(); Checkbox C2= new Checkbox("Groen"); Checkbox C3= new Checkbox("Rood"); Checkbox C4= new Checkbox("Aan",null,true); Checkbox C5= new Checkbox("Uit",null,false); add(c1); add(c2); add(c3); add(c4); add(c5); Inleiding tot Java door ir. C. Daniels 56
Bij uitvoering ziet het applet er als volgt uit : Merk op dat de knoppen gewoon naast mekaar worden neergezet. Hoe we de layout van het venster mooier kunnen maken, zien we later. De parameter null, in de constructor, laat ons toe de aankruisvakjes te groeperen, zodat slecht één enkel vakje kan geselcteerd worden. We hebben dan radio-buttons. Het volgend voorbeeld zal dit duidelijk maken. 4 Radio-knoppen Om deze te ontwerpen moeten we de aankruisvakjes een groep toewijzen. Een nieuwe groep maken we met de code: CheckboxGroup cbg = new CheckboxGroup(); Oefening: wijzig de code van voorgaand applet als volgt: public class OefAWT3 extends Applet CheckboxGroup cbg = new CheckboxGroup(); Checkbox C1= new Checkbox("Groen",cbg,true); Checkbox C2= new Checkbox("Rood",cbg,false); Checkbox C3= new Checkbox("Aan",cbg,false); Checkbox C4= new Checkbox("Uit",cbg,false); add(c1); add(c2); add(c3); add(c4); De uitvoer ziet er als volgt uit : Compileer en test uit! Inleiding tot Java door ir. C. Daniels 57
5 Keuzelijsten Keuzelijsten zijn popup of pulldown menu s. Zij bevatten items waarvan u er een kunt selecteren. Om een keuzelijst te maken, instantieert u een nieuw object van de klasse Choice. U kunt items bijvoegen door de methode additem(string); Oefening: maak volgend applet met de naam OefAWT4 aan in een nieuw project met dezelfde naam: public class OefAWT4 extends Applet Choice Keuzelijst = new Choice(); Keuzelijst.addItem("Appels"); Keuzelijst.addItem("Peren"); Keuzelijst.addItem("Bananen"); Keuzelijst.addItem("Kersen"); Keuzelijst.addItem("Aardbeien"); add(menu); De uitvoer ziet er als volgt uit : Compileer en test uit! 6 Tekstvelden Tekstvelden zijn handig om allerlei soorten tekstgegevens in te voeren. Constructoren: TextField() : maakt een leeg tekstveld met lengte = 0 karakters TextField(int) : maakt een tekstveld met de aangegeven breedte TextField(String):maakt een tekstveld waarde gegeven tekst is ingeplaatst TextField(String,int):maakt een tekstveld met daarin de aangegeven tekst, en de met de aangegeven lengte. Deze constructoren plaatsen geen uitleg bij het tekstveld, dat moet u apart doen met een label. Inleiding tot Java door ir. C. Daniels 58
Oefening: Programmeer volgend applet met de naam OefAWT5, en plaats het in een project met dezelfde naam. public class OefAWT5 extends Applet TextField T1=new TextField("Typ hier uw naam",20); TextField T2=new TextField(13); TextField T3=new TextField(20); add(new Label("Uw naam:")); add(t1); add(new Label("Telefoonnummer:")); add(t2); add(new Label("Paswoord:")); T3.setEchoChar('*'); add(t3); TIP: Met de opdracht setechochar( * ) kan men een tekstveld maken, dat toelaat een onzichtbaar paswoord in te geven. De uitvoer ziet er als volgt uit : Compileer en test uit! 7 Textarea Een textarea is een tekstveld dat verschillende lijne hoog kan zijn en voorzien is van schuifbalken (Engels: scrollbar). Constructoren: TextArea(int, int): maakt een tekstarea met het aangeduide aantal rijen en kolommen TextArea(String): maakt een textarea met de ingevulde tekst TextArea(String, int, int):maakt een textarea met de ingevulde tekst, en de aangegeven aantal rijen en kolommen Oefening: Programmeer volgend applet met de naam OefAWT5, en plaats het in een project met dezelfde naam. Inleiding tot Java door ir. C. Daniels 59
public class OefAWT6 extends Applet String Tekst= "'k Speelde gisteren in ons tuintje"+ "\nmet mijn kleine zusje Koos"+ "\ndie al 't speelgoed wilde ruilen"+ "\nvoor een opengaande roos"+ "\naan wier stengel nog een knopje"+ "\npronkte met een morgendropje"; TextArea TA1=new TextArea(4,10); TextArea TA2=new TextArea(Tekst,5,20); add(ta1); add(ta2); De uitvoer ziet er als volgt uit : Compileer en test uit! 8 Schuiflijst Een schuiflijst (Engels: Scrolling List), lijkt op de keuzelijst, maar is toch anders. Het is geen popup-menu. U kunt het instellen, dat u slechts één item kunt kiezen of meerdere tegelijk. Constructoren: List(): maakt een lege schuiflijst, en laat slechts de selectie van één enkel item toe. List(int,boolean):maakt een schuiflijst met het aangegeven aantal zichtbare lijnen. Als boolean op true staat kunt u meerdere items selecteren, anders (false) niet. Oefening: Programmeer volgend applet met de naam OefAWT7, en plaats het in een project met dezelfde naam. public class OefAWT7 extends Applet List L1=new List(5,true); List L2=new List(5,false); L1.addItem("Hamlet"); Inleiding tot Java door ir. C. Daniels 60
L1.addItem("Aida"); L1.addItem("Falstaf"); L1.addItem("Faust"); L1.addItem("Othello"); L1.addItem("Barbier van Sevilla"); add(l1); L2.addItem("Rood"); L2.addItem("Oranje"); L2.addItem("Geel"); L2.addItem("Groen"); L2.addItem("Blauw"); L2.addItem("Paars"); add(l2); De uitvoer ziet er als volgt uit : Compileer en test uit! 9 Schuifbalk U kan een aparte schuifbalk ook programmeren om een bepaalde waarde in te stellen. Constructoren: Scrollbar(int): maakt een schuifbalk met initiële waarden 0, 0 en het getal stelt de orientatie voor: Scrollbar.HORIZONTAL en Scrollbar.VERTICAL Scrollbar(int, int, int, int, int): een schuifbalk waarvan de parameters de volgende waarden hebben: 1. Oriëntatie: Scrollbar.HORIZONTAL of Scrollbar.VERTICAL 2. Initiële waarde van schuifbalk 3. De breedte (of hoogte) van de schuifbalk 4. Minimum waarde 5. Maximum waarde Oefening: Programmeer het volgend applet OefAWT8, en test uit: public class OefAWT8 extends Applet Label l; l = new Label(" 0"); Inleiding tot Java door ir. C. Daniels 61
add (l); add(new Scrollbar(Scrollbar.HORIZONTAL, 0, 10, 0, 255)); public boolean handleevent(event e) if (e.target instanceof Scrollbar) int v=((scrollbar)e.target).getvalue(); l.settext(string.valueof(v)); return true; De uitvoer ziet er als volgt uit : Voor het eerst hebben we het programma ook laten reageren op een event met de methode handleevent(), namelijk het verschuiven van het schuifblokje. Hierover later meer. 10 Canvas Dit is een speciaal paneel speciaal geschikt om grafische voorstellingen op te bouwen. Meer hierover later. E. Layout Tot nog toe hadden we geen controle over de plaats waarop de componenten in ins applet werden getoond. We kunnen dat wel min of meer in de hand houden door het gebruik van Layout s. Met de methode setlayout() kunnen we onderdelen van ons applet een bepaalde vormgeving opdringen. Een applet, of een panel zijn afgeleid van de klasse Containers. Dit zijn componenten, die zelf weer andere componenten kunnen bevatten. Zie ook de klassenhiërarchie. Er zijn verschillende soorten van layout s: FlowLayout: de componenten worden van links naar rechts en van boven naar beneden op in de container geplaatst. GridLayout: de componenten worden van links naar rechts en van boven naar beneden in een rooster geplaatst. BorderLayout: de componenten worden rondom het centrum geplaatst. Er worden vijf plaatsen voorzien: North, East, South, West, en Center. Door de methode insets() van een container te herdefiniëren (Engels : override), kan men de afstand tussen componenten instellen. Een voorbeeld maakt een en ander veel duidelijker. Zoek zelf eens naar de verschillende constructoren op van deze layout s. Hierna volgt een uitgewerkt voorbeeld. Inleiding tot Java door ir. C. Daniels 62
Zo ziet het applet OefLayout eruit in IE: Panel met FlowLayout Panel met GridLayout Insets Panel met BorderLayout Panel met GridLayout en insets Het applet is verdeeld in vier panelen in 2 rijen en 2 kolommen. Voor de duidelijkheid werden de vier panelen omrand in deze afbeelding met streepjes, die natuurlijk niet zichtbaar zijn in het origineel. De panelen werden van links naar rechts en van boven naar onder ingevuld, met verschillende layout s. In elk paneel werden een aantal drukknoppen voorzien. Voor het panel onder rechts, werd een nieuwe klasse MijnPaneel afgeleid van de klasse Panel, om de insets (de ruimte tussen de componenten) te kunnen instellen. Inleiding tot Java door ir. C. Daniels 63
En hier is de code van dit applet. Eerst worden vier panelen met verschillende layout s aan het het applet toegevoegd, public class OefLayout extends Applet // Vier panelen in ons applet Panel P1= new Panel(); //default FlowLayout Panel P2= new Panel(new GridLayout(2,2)); Panel P3= new Panel(new BorderLayout()); //Gebruik ook de eigen klasse MijnPaneel MijnPaneel P4 = new MijnPaneel(new GridLayout(2,2,10,20)); //een hoop knopkes. Button b1=new Button("Een"); Button b2=new Button("Twee"); Button b3=new Button("Drie"); Button b4=new Button("Vier"); Button b5=new Button("A"); Button b6=new Button("B"); Button b7=new Button("C"); Button b8=new Button("D"); Button b9=new Button("West"); Button b10=new Button("Noord"); Button b11=new Button("Oost"); Button b12=new Button("Zuid"); Button b13=new Button("Centrum"); Button b14=new Button("Rood"); Button b15=new Button("Wit"); Button b16=new Button("Zwart"); Button b17=new Button("Groen"); //Een GridLayout voor het applet setlayout(new GridLayout(2,2)); //Voeg de knopjes toe aan de panelen P1.add(b1); P1.add(b2); P1.add(b3); P1.add(b4); P2.add(b5); P2.add(b6); P2.add(b7); P2.add(b8); Inleiding tot Java door ir. C. Daniels 64
P3.add("West",b9); P3.add("North",b10); P3.add("East",b11); P3.add("South",b12); P3.add("Center",b13); P4.add(b14); P4.add(b15); P4.add(b16); P4.add(b17); add(p1); add(p2); add(p3); add(p4); //maak wat randjes rond het applet public Insets insets() return new Insets(20,20,20,20); // Een eigen paneelontwerp, dus afgeleid van Panel class MijnPaneel extends Panel //Nieuwe constructor MijnPaneel(LayoutManager l) setlayout(l); /* maak rondom randen override de methode insets()*/ public Insets insets() return new Insets(20,20,20,20); Inleiding tot Java door ir. C. Daniels 65