Applets med komponenter



Relevanta dokument
Lite logik. Kap 6: Sid 2

GUI-program med Swing

Kort om klasser och objekt En introduktion till GUI-programmering i Java

Datalogi I, grundkurs med Java 10p, 2D4112, Fiktiv tentamen, svar och lösningar och extra kommentarer till vissa uppgifter 1a) Dividera förs

Lab5 för prgmedcl04 Grafik

Objektorienterad programmering i Java I. Uppgifter: 2 Beräknad tid: 5-8 timmar (OBS! Endast ett labbtillfälle) Att läsa: kapitel 5 6

2D1339 Programkonstruktion för F1, ht 2004

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Tentamen. Datalogi I, grundkurs med Java 10p, 2D4112, Lördagen den 30 november 2002 kl , salar E33, E34

Övningsuppgifter till föreläsning 2 Variabler och uttryck

5. En metod som anropar sig själv a) får inte förekomma i Java-program b) kallas destruktiv c) kallas iterativ d) kallas rekursiv 6. Vilka värden har

Föreläsning 3: Händelsestyrda program och användargränssnitt

Att prova på en enkel Applet och att lära sig olika sätt att hämta data från tangentbordet. Du får även prova på att skapa din första riktiga klass.

Programmering A C# VT Ett kompendie över Programmering A (50p) i c# Stefan Fredriksson

Programstruktur och terminologi. Programmet producerar följande utskrift i terminalfönstret: Ett Javaprogram består av en eller flera klasser

Att skriva till och läsa från terminalfönstret

2D1339 Programkonstruktion för F1, ht 2003

FactoryCast HMI. Premium & Quantum PLC. Applets

ITK:P1 Föreläsning 4. Grafiska gränssnitt i Java. AWT-komponenter

Programmeringsteknik med C och Matlab

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

Kurs i programmering Java Uppgifter

TDIU01 - Programmering i C++, grundkurs

Laboration 1 Introduktion till Visual Basic 6.0

Objektorienterad programmering i Java. Föreläsning 5 Kort om Java-Applets

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag maj - 19 Tentamen i Objektorientering och Java Skrivtid 5 h

Bankkonto - övning. Övning 2 Skriv en metod, geträntan, som returnerar räntan.

Laboration 1. "kompilera"-ikonen "exekvera"-ikonen

F4. programmeringsteknik och Matlab

JAVA Mer om klasser och objektorientering

SMD 134 Objektorienterad programmering

Frames, menyer och GUI-program

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

Idag. statiska metoder och variabler. private/public/protected. final, abstrakta klasser, gränssnitt, delegering. wrapper classes

(Man brukar säga att) Java är... Denna föreläsning. Kompilering av Java. Historik: Java. enkelt. baserat på C/C++ Allmänt om Java

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 18

Introduktion till Datalogi DD1339. Föreläsning 2 22 sept 2014

FÖRSLAG TILL LÖSNINGAR FÖR TENTAMEN I INTERNETPROGRAMMERING MED JAVA, 5p för SY , kl

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

Labb i Datorsystemteknik och programvaruteknik Programmering av kalkylator i Visual Basic

Föreläsnings 11 - GUI, Händelsestyrda program, MVC

DI-institutionen Sid 1 av 5 Hans-Edy Mårtensson Sten Sundin Micael Karlsson

Javas klassbibliotek. Kap 7: Sid 2

Objektorienterad Programmering (TDDC77)

I Skapa Hej.java och skriv programmet. I Kompilera med javac Hej.java. I Rätta fel och repetera tills du lyckas kompilera ditt program

Föreläsning 2 sept 05 (Onsdag v 36). DD Chapter 2.

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

Programmering för språkteknologer I, VT2012. Rum

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Checklista. Föreläsning 1-2 Innehåll. Programmering.

Klasser i Java kan ha metoder och egenskaper. Metoder beskriver funktioner som klassen kan utföra. Egenskaper beskriver innehållet i klassen.

Föreläsning 12. Föreläsning 12. Rörliga figurer Klassen Timer Undantag Något om applets. Rörliga appletsfigurer Klassen Timer Undantag

Föreläsning 3: Typomvandling, villkor och val, samt textsträngar

2D1342 Programkonstruktion för F1, ht 2006

Java: Utvecklingsverktyg, datatyper, kontrollstrukturer

Programmering C: Tentamen of 5 Prioritet och associativitet hos operatorerna i C De viktigaste operatorerna: Prioritet Kategori Operator

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

Objektorienterad programmering med Java Swing: Händelser, lyssnare och applets

Dagens program. Programmeringsteknik och Matlab. Vad är arv? Vi ärver från GregorianCalendar. Kan vi bygga vidare på existerande klasser?

Grundläggande programmering med C# 7,5 högskolepoäng

Föreläsning 2. Variabler, tilldelning och kodblock{} if-satsen Logiska operatorer Andra operatorer Att programmera

Grundläggande programmering

DD1342 Programkonstruktion för F1, ht 2007

Subklasser och arv Inledning till grafik (JFrame och JPanel). Något om interface. Objektorienterad programvaruutveckling GU (DIT011) Subklasser

Klassdeklaration. Metoddeklaration. Parameteröverföring

2D1311 Programmeringsteknik för Bio1 och Bio2, vt 2003 Fiktivt prov På flervalsfrågorna är endast ett svar rätt om inget annat anges i frågan! Det rik

Lektion Händelsehanterare

PROGRAMMERING A VB 2008 EXPRESS UTVECKLINGSVERKTYGET VISUAL BASIC

Programmeringsteknik II - HT18. Föreläsning 6: Grafik och händelsestyrda program med användargränssnitt (och Java-interface) Johan Öfverstedt

Hej Då, Karel! Programmering. Vårt första Javaprogram. hh.se/db2004. Java. Grundtyper, variabler och arrayer

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

Användarhandledning Version 1.2

Objektorienterad programmering i Java

Lösningar för tenta 3 DAT043,

Föreläsning 5-6 Innehåll

Lösningsförslag till tentamen FYTA11 Javaprogrammering

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

TENTAMEN. Kurs: Objektorienterad programmeringsmetodik 5DV133 Ansvarig lärare: Anders Broberg. VT-13 Datum: Tid: kl

TDDC77 Objektorienterad Programmering

Objektorienterad Programkonstruktion. Föreläsning 3 7 nov 2016

Mer om grafiska komponenter. Händelsestyrda program

Extramaterial till Matematik Y

Exempel på användning av arv: Geometriska figurer

2I1049 Föreläsning 8. Grafiska gränssnitt i Java. AWT-komponenter. Grafiska gränssnitt, Java interface och händelsehantering

Fortsättningskurs i programmering F 5. GUI händelsehantering - undantagshantering Hugo Quisbert AWT. Paket för hantering av grafik

Laboration 1. "kompilera"-ikonen "exekvera"-ikonen

Språket Python - Del 1 Grundkurs i programmering med Python

Objektorienterad Programkonstruktion. Föreläsning 4 8 nov 2016

TENTAMEN I PROGRAMMERING. På tentamen ges graderade betyg:. 3:a 24 poäng, 4:a 36 poäng och 5:a 48 poäng

TENTAMEN PROGRAMMERING I JAVA, 5P SOMMARUNIVERSITETET

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

TDDC77 Objektorienterad Programmering

1 Datorn som miniräknare. 1.1 Räkneoperationer. 1.2 Variabler

Objektorienterad programmering i Java

Klassen javax.swing.timer

Programmering A. Johan Eliasson

Transkript:

5 Applets med komponenter Knappar Om gränssnitt (interface) Händelser Måla om appletytan Etiketter och textrutor Förvandla strängar till tal Aritmetik Omvandla datatyper med cast Felhantering

Kap 5: Sid 2 Knappar Vi skapar en knapp I en applet (och i en frame) kan man lägga in komponenter av olika slag. En knapp är ett exempel på en komponent. Varje komponent-typ har en egen klass i Java. Knappar beskrivs i klassen Button. En komponent som vi lägger ut i t ex en applet är ett objekt instansierat från klassen Button. Klassen Button, och andra klasser som beskriver komponenter, finns i klassbibliotekets paket java.awt (Där fanns ju också bl a klassen Graphics som vi redan har använt ) Vi skapar ett objekt med ordet new. Härvid anropas, som du vet, en speciell metod i klassen som kallas konstruktorn. (Konstruktormetoden har samma namn som klassen.) Du har sett att man ofta skriver in argument i konstruktormetoden. Argumenten överförs till egenskaper hos objektet. När vi skapar en knapp är argumentet en sträng som innehåller den text som ska stå på knappen. När man ska lägga ut en knapp i en applet måste man: Importera klassen Button (alla komponentklasser finns i paketet java.awt ) Deklarera komponenten (t ex Button knapp; ) Skapa komponentobjektet (t ex med b = new Button( Tryck på mig! );) Lägga ut komponenten i appleten. Detta sker med en appletmetod som heter add, så här: add(knapp); Övning: Knapp-test Skriv denna kod i en editor. Spara som KnappTest.java i mappen X\java\KnappTest import java.applet.*; import java.awt.*; // Här importeras bl a klassen Button public class KnappTest extends Applet Button knapp; public void init() knapp = new Button("Tryck på mej!"); add(knapp); public void paint(graphics g) g.drawstring( Vi testar knappar!, 50,100); Kompilera. Skriv en html-fil som startar appleten och kör! Knappen visas - men om du trycker på knappen så händer inget. Vi ska strax gå igenom hur man får något att hända då knappen trycks (händelsehantering). Vi kommer då att behöva använda gränssnitt, så vi börjar med att repetera vad ett gränssnitt är

Kap 5: Sid 3 Om gränssnitt (interface) I kapitel 3 (om Arv) sa vi att man i Java inte kan ärva från två (eller fler) klasser. Detta fungerar alltså inte: Klass A Fält Metoder: metod1() met2od() metod3() Klass B Fält Metoder: metoda() metodb() metodc() Klass C Fält Metoder: Däremot kan man implementera (ett eller flera) gränssnitt eller interface. Ett gränssnitt är en speciell slags klass som bara innehåller tomma metoder avsedda att omdefinieras. Klass A Fält Metoder: metod1() metod2() metod3() Interface B Metoder: metoda() metodb() metodc() Klass C Fält Metoder: metod1() metod2() metod3() metoda() metodb() Med ordet implements implementeras gränssnittets metoder i vår nya klass. I java-kod ser det ut så här: public class C extends A implements B I händelsehanteringen nedan behöver vi metoder som inte finns i klassen Applet. Vi kommer att implementera ett gränssnitt som har de önskade metoderna.

Kap 5: Sid 4 Händelser Händelseobjekt och metoden actionperformed Naturligtvis vill vi att något ska hända när vi trycker på knappen! När någon trycker på en knapp skapas ett händelseobjekt (ett objekt ur en klass vid namn ActionEvent) Objektet låter vi vara argument i en metod som heter actionperformed och i den metoden beskriver vi vad som ska hända. En metod som beskriver vad som ska hända kallas allmänt för händelsehanterare. Metoden actionperformed finns tyvärr inte deklarerad i applets. Vi implementerar därför ett gränssnitt, ActionListener där metoden actionperformed finns. Ett Button-objekt har en metod som heter addactionlistener() Den metoden måste anropas för att associera knappen till actionperformed()-metoden. Den gör så att knappen lyssnar på en knapptryckning och anropar actionperformed()-metoden då knappen trycks. Övning: Testa händelser Vi ska komplettera appleten KnappTest med kod så att knappen blir aktiv. Fyra saker måste göras: Klasser som har med händelsehantering att göra finns i ett paket som heter java.awt.event, så det paketet måste importeras. Vi implementerar gränssnittet ActionListener (så att vi kan använda metoden actionperformed) Vi sätter en lyssnare på knappen: Med satsen knapp.addactionlistener(this); anger vi att knappen knapp ska lyssna på en knapptryckning och anropa metoden actionperformed. Parametern this anger att actionperfomed är definierad i denna (this) applet. (Ibland kan nämligen händelsehanteraren vara definierad i en annan klass) Vi omdefinierar metoden actionperformed. Där beskrivs vad som ska ske när knappen trycks. Metoden actionperfomed startar när den mottar ett ActionEvent-objekt, det vill säga när det har inträffat en händelse (någon trycker på knappen ) I vårt fall ska vi låta appleten byta bakgrundsfärg (till röd) när knappen trycks, så metoden actionperformed kommer att innehålla en enda sats, nämligen setbackground(color.red); Så här blir appleten när den kompletterats med händelsehantering:

Kap 5: Sid 5 import java.applet.*; import java.awt.*; import java.awt.event.*; Nytt paket för händelsehantering! Implementera gränssnittet Actionlistener! public class KnappTest extends Applet implements ActionListener Button knapp; public void init() knapp = new Button("Tryck på mej!"); add(knapp); knapp.addactionlistener(this); Sätt lyssnare på knappen! public void paint(graphics g) g.drawstring("vi testar knappar!", 50,100); public void actionperformed(actionevent e) setbackground(color.red); Skriv in metoden actionperformed! Komplettera appleten på detta sätt. Spara kompilera provkör! Övning: Starta ljud med en knapp Öppna filerna Bilder.java och Bilder.html (från bild- och ljudövningarna i Kapitel 4 ) (Det ska vara den senare versionen - den du gjorde i övningen med ljud ) Gör följande kompletteringar i klass-filen. Importera: import java.awt.*; import java.awt.event.*; Implementera gränssnittet ActionListener - lägg till:... extends Applet implements ActionListener Deklarera: I init-metoden: Button knapp; knapp = new Button("Spela!"); this.add(knapp); knapp.addactionlistener(this); Skriv actionperfomed-metoden och flytta this.ljud1.play(); från paint-metoden: public void actionperformed(actionevent e) this.ljud1.play(); Spara filen kompilera kör! Nu startar ljudet när du trycker på knappen!

Kap 5: Sid 6 Övning: Två knappar Deklarera ytterligare en knapp (med namnet knapp2) i KnappTest.java Button knapp, knapp2; Skapa knappobjektet i init-metoden: knapp2 = new Button("Blå"); Lägg ut den på appleten: add(knapp2); Se till att även knapp2 "lyssnar" på actionperformed-metoden: knapp2.addactionlistener(this); Gör tillägg i actionperformed-metoden: public void actionperformed(actionevent e) if (e.getsource() == knapp) setbackground(color.red); if (e.getsource() == knapp2) setbackground(color.blue); Metoden e.getsource() känner av vilken knapp som har tryckts. Trycker du på knapp blir appletens bakgrund röd. Trycker du på knapp2 blir den blå! Du kommer väl ihåg if-satsen från kapitel 1? Satsen setbackground(color.red); i exemplet ovan utförs endast om villkorssatsen (e.getsource() == knapp ) är sann Övning: Ljud igen Du arbetade förut med ett ljudobjekt, ljud1 i övningen Bilder.java Ljudet kunde startas med ljud1.play(); Det kan stoppas med ljud1.stop(); Ljudet spelas kontinuerligt med ljud1.loop(); Ta fram övningen Bilder.java Gör så att ljudet spelas kontinuerligt när man trycker på knappen. Lägg in ytterligare en knapp. När man trycker på denna ska ljudet upphöra.

Kap 5: Sid 7 Måla om appletytan Övning: Metoden repaint() Skriv in följande applet och spara den som KnappTest2.java i mappen X\java\KnappTest import java.applet.*; import java.awt.*; import java.awt.event.*; public class KnappTest2 extends Applet implements ActionListener Button knapp; String s; Color farg; public void init() knapp = new Button("Tryck"); add(knapp); knapp.addactionlistener(this); s = "Hej!"; farg = Color.green; public void paint(graphics g) g.setcolor(farg); g.filloval(100,100,80,80); g.drawstring(s, 50,70); public void actionperformed(actionevent e) s = "Du har tryckt på knappen!"; farg = Color.red; Strängen s ger vi från början värdet Hej! Color-objektet farg ger vi värdet Color.green I actionperformed()-metoden ändras värdet hos s och hos farg. Spara filen som KnappTest2.java. Kompilera. Starta appleten med en html-fil. Tryck på knappen. Inget händer Vi måste på något sätt få metoderna i paint()-metoden att utföras igen! Applets har en metod som heter repaint(). Den metoden anropar paint()-metoden på nytt. Lägg till metoden i repaint() sist i actionperformed()-metoden: public void actionperformed(actionevent e) s = "Du har tryckt på knappen!"; farg = Color.red; repaint(); Spara kompilera kör! Appletytan målas om med de nya värdena på s och farg!

Kap 5: Sid 8 Övning: Flytta på Jumbo Skapa mappen X\java\Jumbo Skriv nedanstående kod. Spara den som FlyttaJumbo.java //Övning FlyttaJumbo import java.awt.*; import java.awt.event.*; import java.applet.*; public class FlyttaJumbo extends Applet implements ActionListener // Deklarationer Label ledtext; Button knapp1, knapp2; Image jumbo; int x,y ; public void init() ledtext = new Label("Tryck på knapparna - flytta bilden"); jumbo = this.getimage(getcodebase(),"jumbo.gif"); knapp1 = new Button("Vä"); knapp2 = new Button("Hö"); add(ledtext); add(knapp1); add(knapp2); knapp1.addactionlistener(this); knapp2.addactionlistener(this); x = 100; y = 100; public void paint(graphics g) g.drawimage(jumbo,x,y,this); public void actionperformed(actionevent e) if (e.getsource() == knapp1) x = x - 10; if (e.getsource() == knapp2) x = x + 10; repaint(); Skriv också en enkel HTML-fil (FlyttaJumbo.html) som startar appleten. Kompilera och kör. (Genom att trycka på knapparna kan man flytta på figuren ) Läs kommentarer till koden på nästa sida!

Kap 5: Sid 9 Det mesta är bekant i koden. I actionperformed-metoden exekveras satsen x = x + 10; då man trycker på knapp2 Satsen x = x + 10; fungerar så här: Antag att x har värdet 100 från början Det nya värdet på x blir då det gamla värdet (100) plus 10, dvs 110 Nästa gång man trycker på knapp2 så blir x-värdet 110 + 10, dvs 120 osv, osv Varje gång man trycker på en knapp utförs metoden repaint(), (appleten ritas om) I paint-händelsen beskrivs Jumbos position av koordinaterna x och y, dvs Jumbo flyttar på sig Trycker man på knapp1 minskas i stället x-värdet (Jumbo flyttas åt vänster) Komplettera koden: Lägg in två nya knappar så att Jumbo även kan förflyttas vertikalt. Övning: Flytta objekt Skriv en applet där du, med samma teknik som ovan, kan flytta ett objekt ur någon av de klasser som du själv har skrivit (t ex Asteroid )

Kap 5: Sid 10 Etiketter och textrutor Skapa etiketter och textrutor Textrutor används när vi vill kunna mata in värden (texter och tal) i en applet. Etiketter (eller labels) är fasta texter som vi inte kan ändra värdet på. Textrutor beskrivs i klassen TextField, etiketter i klassen Label. Alla klasser som beskriver komponenter finns, som sagt, i klassbibliotekets paket java.awt Övning: Komponent-test Skriv denna kod i en editor. Spara som KompoTest.java i mappen X\java\KompoTest // En övning med komponenter import java.awt.*; import java.applet.*; public class KompoTest extends Applet // Deklarationer Label ledtext; // Här deklareras komponent-objekt TextField inruta; Button knapp; public void init() ledtext = new Label("Detta är skrivet i en label");// Här skapas inruta = new TextField(10); // komponent-objekt knapp = new Button("Tryck här!"); // this.add(ledtext); // Här läggs this.add(inruta); // komponenterna ut this.add(knapp); public void paint(graphics g) g.drawstring("detta är skrivet med drawstring", 10,70); Vi skapar här en label, en textruta och en knapp. Vi gör (som förut) alla deklarationer först. I metoden init skapar vi objekten (med new) och lägger ut komponenter med metoden add() Vi låter också paint()-metoden skriva ut en text. Kompilera! Skriv en HTML-fil som anropar appleten KompoTest.class Se på appleten med hjälp av appletviewer Testa att variera storleken hos fönstret som visar appleten. Du ser att labelns, textrutans och knappens lägen förändras. (Vi ska senare se hur man kan påverka placeringen av komponenter )

Kap 5: Sid 11 Övning: Ta hand om inmatade värden Det som matas in i en textruta ska kunna överföras till en variabel för fortsatt bearbetning (utskrift eller beräkning). Vi ska bygga vidare på appleten KompoTest och göra så att knappen blir aktiv. När vi trycker på knappen ska det som matats in i textrutan överföras till en strängvariabel vars värde skrivs ut på appleten. Komplettera / skriv om klassen KompoTest på följande sätt: // En övning med komponenter import java.awt.*; import java.awt.event.*; import java.applet.*; public class KompoTest extends Applet implements ActionListener // Deklarationer Label ledtext; TextField inruta; Button knapp; String namn; public void init() ledtext = new Label("Skriv ditt namn "); inruta = new TextField(10); knapp = new Button("Tryck här!"); add(ledtext); add(inruta); add(knapp); knapp.addactionlistener(this); namn = ; // två citationstecken, inget emellan public void paint(graphics g) g.drawstring("hej " + namn + "!",10,90); public void actionperformed(actionevent e) namn = inruta.gettext(); repaint(); Spara filen och kompilera Kör appleten med hjälp av appletviewer (eller genom att öppna HTML-filen i en web-läsare). Testa genom att skriva in ett namn (förslagsvis ditt eget) i textrutan - och trycka på knappen! Läs kommentarerna till koden på nästa sida!

Kap 5: Sid 12 För att knappen ska bli aktiv gör vi som förut: Importerar paketet java.awt.event. Implementerar gränssnittet ActionListener Sätter en lyssnare på knappen: knapp.addactionlistener(this); Skriver actionperformed()-metoden Vidare: Vi deklarerar ett strängobjekt som vi kallar namn I init()-metoden ser vi till att strängen namn från början är tom: namn = ; I metoden paint() står denna sats: g.drawstring("hej " + namn + "!",10,90); Här är ett exempel på konkatenering (sammanfogning) av strängar. Vi har tre strängar: - den konstanta strängen "Hej " - strängvaraibeln namn - den konstanta strängen "!" De sammanfogas med plustecken. Om namn har värdet "Pelle" kommer utskriften att bli: Hej Pelle! I metoden actionperformed(): Objektet inruta har en metod, gettext, som lämnar det värde som matas in i textrutan. (gettext är förstås definierad i klassen TextField) Satsen namn = inruta.gettext(); gör alltså att strängen namn tilldelas det som matas in. Metoden repaint() används för att på nytt rita upp det som metoden paint() beskriver. Övning: Metoden settext() Klassen TextField har en metod, settext(), med vilken man kan tilldela en textruta ett värde. Testa: I init()-metoden (efter att inruta instansierats) skriv satsen inruta.settext("olle"); Kompilera och kör. Nu visar inrutan från början texten Olle Övning: Textfältet kan lyssna! Lägg in en lyssnare även på textfältet: Skriv in denna sats i init()-metoden inruta.addactionlistener(this); Spara, kompilera, kör appleten. Skriv in ett namn i textfältet och tryck på ENTER. Du får samma reaktion som om du tryckt på knappen. Övning: Snyggare utskrift Gör så att utskriften i appleten KompoTest får större storlek och skrivs i färg.

Kap 5: Sid 13 Förvandla strängar till tal Övning: Matte1 Skriv in följande kod och spara den som Matte1.java i mappen X\java\Matte1 //Övning Matte1 import java.awt.*; import java.applet.*; import java.awt.event.*; public class Matte1 extends Applet implements ActionListener // Deklarationer Label ledtext; TextField inruta1, inruta2; Button knapp; int x, y, sum ; public void init() ledtext = new Label("Skriv ett tal i varje ruta - tryck knappen"); inruta1 = new TextField(10); inruta2 = new TextField(10); knapp = new Button("Tryck här!"); add(ledtext); add(inruta1); add(inruta2); add(knapp); knapp.addactionlistener(this); inruta1.addactionlistener(this); inruta2.addactionlistener(this); x = 0; y = 0; sum = 0; public void paint(graphics g) g.drawstring("summan är " + sum,10,90); public void actionperformed(actionevent e) x = Integer.parseInt( inruta1.gettext() ); y = Integer.parseInt( inruta2.gettext() ); sum = x + y; repaint(); Kommentar: Vi deklarerar tre variabler av primitiv datatyp (heltal, dvs int). De heter x, y och sum I metoden init tilldelas dessa ett initialvärde (noll) Två inmatningsrutor (TextField-objekt) är deklarerade: inruta1 och inruta2 I metoden paint står det: g.drawstring("summan är " + sum,10,90); Om man konkatenerar en sträng med ett tal på detta sätt så blir resultatet en sträng. Om variabeln sum har värdet 375 så kommer strängen Summan är 375 att skrivas ut.

Kap 5: Sid 14 I metoden actionperformed finns en ny metod, parseint(): Du vet sedan förra exemplet att metoden gettext() ger den text (de bokstäver eller siffror) som skrivs in i en textruta. Om vi t ex matar in en 1:a, en 2.a och en 3:a får vi textsträngen "123" Ibland (som här) vill vi tolka en textsträng (t ex "123") som ett tal istället ( talet 123 ) (Det går ju exempelvis inte att räkna med textsträngar - vare sig de består av bokstäver eller siffror!) Metoden Integer.parseInt(sträng) gör denna förvandling från en textsträng till ett tal! En textsträng! Integer.parseInt( "123" ) Resultatet blir ett tal: 123 Integer är en klass och parseint() är en metod i denna klass. parseint() är en klassmetod (eller statisk metod). En klassmetod är (som du förhoppningsvis minns) en metod som kan användas "direkt" - utan att man behöver skapa ett objekt. Man skriver helt enkelt klassens namn, en punkt samt metodnamnet. Alltså: Integer.parseInt( ) Nu: Kompilera och kör! Summan beräknas om du trycker på knappen, eller om du trycker på ENTER då markören står i någon av inmatningsrutorna! Hur gör man om ett tal till en sträng? Nu vet du hur man gör om en sträng till ett tal. Tvärtom då? Hur gör man om ett tal till en sträng? Vi har redan sett att vi får en sträng om vi konkatenerar en sträng med ett tal. I exemplet ovan: "Summan är " + sum blir en sträng. Man gör om ett tal till en sträng helt enkel genom att sammanfoga talet med en tom sträng! (En tom sträng är två citationstecken utan något däremellan) Exempel: Låt x vara ett (hel- eller flyt-)tal. Motsvarande sträng är x +

Kap 5: Sid 15 Aritmetik Aritmetiska operatorer Vi tog upp aritmetiska operatorer redan i kapitel 2. Vi repeterar och gör några tillägg: Antag att x, y och z är heltalsvariabler (int) och att x = 14 och y = 3 Räkneoperation Operator Java-sats z får värdet Benämning Addition + z = x + y; 17 summa Subtraktion - z = x - y; 11 differens Multiplikation * z = x * y; 42 produkt Division / z = x / y; 4 kvot Modulus (se nedan) % z = x % y; 2 rest Heltalsdivision ger 14 3 = 4 2 3 Rest Kvot Modulus ger resten vid en heltalsdivision Antag nu att x, y och z är flyttalsvariabler (double) och att x = 14.0 och y = 3.0 Räkneoperation Tecken Java-sats z får värdet Addition + z = x + y; 17.0 Subtraktion - z = x - y; 11.0 Multiplikation * z = x * y; 42.0 Division / z = x / y; 4.6666666 (Modulus används ej) Dessutom kan parenteser användas så som i matematiken. Exempel: z = (x + y) * 5 ; Övning: Matte2 Skapa mappen X\java\Matte2 Utgå från klassen Matte1 och skriv klassen Matte2 där du utöver x, y och sum även deklarerar heltalsvariablerna diff, produkt, kvot och rest. Gör så att de inmatade talens summa, differens, produkt, kvot och rest visas då du trycker på knappen. Spara som Matte2.java Kompilera och kör. Övning: Cirkel Skapa mappen X\java\Cirkel Använd samma metodik som i Matte1 för att skriva klassen Cirkel Deklarera variablerna, area, omkrets och pi som flyttal (double) och radie som heltal (int) I init-metoden tilldelas pi = 3.14159 Gör så att radien hos en cirkel kan inmatas i en textruta och då man trycker på en knapp, eller trycker på ENTER, ska cirkelns area och omkrets skrivas ut. Spara som Cirkel.java Kompilera och kör. (Integer.parseInt fungerar så länge du matar in heltalsvärden på radien. Vi återkommer till hur man kan mata in decimaltal ) Komplettera koden så att en cirkel ritas ut i appleten. Låt gärna cirkelns storlek bero av den inmatade radien.

Kap 5: Sid 16 Övning: En knapp som tömmer inmatningsrutorna Deklarera ytterligare en knapp (med namnet knapp2 ) i Matte1.java (eller Matte2.java) Button knapp2; Skapa knappobjektet i init()-metoden: knapp2 = new Button("Rensa"); Lägg ut den på appleten: add(knapp2); Se till att även knapp2 "lyssnar" på actionperformed()-metoden: knapp2.addactionlistener(this); Ändra actionperformed()-metoden så här: public void actionperformed(actionevent e) if (e.getsource() == knapp) x = Integer.parseInt( inruta1.gettext() ); y = Integer.parseInt( inruta2.gettext() ); sum = x + y; if (e.getsource() == knapp2) inruta1.settext(""); inruta2.settext(""); sum = 0; Om du trycker på knapp sker tilldelning av variabler och beräkning som tidigare. Om du trycker på knapp2 raderas inmatningsrutorna och variabeln sum sätts till noll repaint(); I if-satsen vill man ofta att flera satser ska utföras om det boolska uttrycket är sant. Då skriver man dessa satser i ett block (inom "krullparenteser) som i exemplet ovan. En utförlig genomgång av if-satsen kommer i nästa kapitel Övning: Stapel igen Öppna Stapeldiagram.java (en övning i kapitel 4) Lägg in tre textrutor och två knappar. När man skrivit in heltal i textrutorna och tryckt på ena knappen ska staplarna få den höjd som talen anger. Om man trycker på den andra knappen ska staplarnas höjd sättas till 0 (noll). (Du ska förstås utnyttja klassen Stapel för att rita staplarna )

Kap 5: Sid 17 Omvandla datatyper med cast Antag att du deklarerat följande: int i = 7; double d = i; Normalt måste variabeln som tar emot ett värde vara av samma datatyp som värdet. Dock kan en flyttalsvariabel ta emot ett heltal. (Ett flyttal rymmer mycket mer information än ett heltal) Flyttalet d ovan kommer att få värdet 7.0 Antag nu att du deklarerat följande: double d = 26.87; int i = d; // Fungerar inte! Heltalet i kan inte ta emot ett flyttal. (Ett flyttal rymmer mycket mer information än ett heltal) Hur ska vi göra? I Java kan man få en tillfällig kopia, med annan datatyp, av en variabel: double d = 26.87; int i = (int) d; (int) d är en heltalskopia av flyttalet d. Eftersom heltal inte kan hantera decimaler sker en avhuggning till heltal. i kommer alltså att få värdet 26 Detta förfarande, att arbeta med en tillfällig kopia med annan datatyp, kallas för att man gör en cast I övningen Matte2 ovan arbetar vi med två heltal, x och y Vi utför en heltalsdivision och bestämmer kvoten med satsen kvot = x / y; Om x = 13 och y = 3 blir kvoten 4 eftersom 13/3 = 4 1/3 Antag nu att vi vill utföra beräkningen x/y för att få ett decimaltal. Ett sätt är att först lagra heltalsvärdet x i en flyttalsvariabel och sedan utföra divisionen. Det är elegantare att utföra operationen med hjälp av en cast: Heltalsvariabeln är alltså x Om jag skriver (double)x så skapas en tillfällig flyttalskopia av heltalsvariabeln x Satsen dec_kvot = (double)x / y (där dec_kvot är en flyttalsvariabel) ger då dec_kvot värdet 4.3333333 Övning: Matte2 igen Deklarera flyttals(double)variabeln dec_kvot Låt dec_kvot tilldelas enligt ovan. Se till att värdet på dec_kvot skrivs ut Spara kompilera provkör

Kap 5: Sid 18 Felhantering Övning: try - catch Kör appleten Matte1 (eller Matte2) igen i appletviewer. Denna gång: Mata av misstag in bokstäver i stället för siffror i inmatningsrutorna och tryck på knappen. I DOS-fönstret som visas bakom appleten anmäls då ett fel att ett NumberFormatException har inträffat. Integer.parseInt()-metoden klarar förstås inte att översätta bokstäver till ett tal I Java kan man fånga upp sådana här fel ( = onormala händelser = undantag = exceptions ) Det sker med hjälp av en så kallad try catch konstruktion. Ändra i koden. Bädda in tilldelnings- och beräkningssatserna i ett try-block, så här: try x = Integer.parseInt( inruta1.gettext() ); y = Integer.parseInt( inruta2.gettext() ); sum = x + y; catch(numberformatexception nfe) Spara kompilera. Provkör dels med siffror i inmatningsrutorna, dels med bokstäver i åtminstone den ena rutan. Om allt fungerar i try-blocket så är det frid och fröjd. Om något går galet i try-blocket så tas felet om hand (inget meddelande i DOS-fönstert), och det som står i catch-blocket utförs. (För närvarande är catch-blocket tomt) Låt oss göra så att ett felmeddelande skrivs ut om vi matar in något som inte är siffror. Deklarera variabeln String felmedd = ; Lägg in kod i catch-blocket: catch(numberformatexception nfe) sum = 0; felmedd = "Du har inte matat in tal!"; Lägg in denna sats i paint()-metoden: g.drawstring(felmedd, 10,120); Lägg till denna sats allra först i actionperformed()-metoden: felmedd = ""; Spara kopilera provkör!