• No results found

Applets med komponenter

N/A
N/A
Protected

Academic year: 2022

Share "Applets med komponenter"

Copied!
18
0
0

Loading.... (view fulltext now)

Full text

(1)

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

(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.

(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:

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.

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.

Klass A Fält…

Metoder:

metod1(){ … } met2od(){ … } metod3(){ … }

Klass B Fält…

Metoder:

metodA(){ … } metodB(){ … } metodC(){ … }

Klass C Fält…

Metoder:

Klass A Fält…

Metoder:

metod1(){ … } metod2(){ … } metod3(){ … }

Interface B Metoder:

metodA(){ } metodB(){ } metodC(){ }

Klass C Fält…

Metoder:

metod1(){ … } metod2(){ … } metod3(){ … } metodA(){ … } metodB(){ … }

(4)

Händelser

Händelseobjekt ochmetoden 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:

(5)

import java.applet.*;

import java.awt.*;

import java.awt.event.*;

public class KnappTest extends Applet implements ActionListener {

Button knapp;

public void init() {

knapp = new Button("Tryck på mej!");

add(knapp);

knapp.addActionListener(this);

}

public void paint(Graphics g) {

g.drawString("Vi testar knappar!", 50,100);

}

public void actionPerformed(ActionEvent e) {

setBackground(Color.red);

} }

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: Button knapp;

I init-metoden: 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!

Nytt paket för

händelsehantering! Implementera gränssnittet

Actionlistener !

Sätt ”lyssnare” på knappen!

Skriv in metoden actionPerformed !

(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.

(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 !

(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!

(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 …)

(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…)

(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!

(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.

(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.

(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!

Integer.parseInt( "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 +””

En textsträng!

Resultatet blir ett tal: 123

(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

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.

14 3 4 2

= 3

Rest

Kvot

(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;

}

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)

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

(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…

(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!

References

Related documents

Detta delprov består av uppgifter som ska lösas utan miniräknare och formelblad. Till ett par uppgifter ska du redovisa dina lösningar och till övriga uppgifter skriver du

Hur stor är sannolikheten att Niklas ”går plus” med minst en kula i en

Hur stor är sannolikheten att Niklas ”går plus” med minst en kula i en

[r]

[r]

Den teoretiska delen består av en redogörelse av hur klientbaserad programmering har växt fram, en beskrivning av några av de tekniker som finns för att åstadkomma

Experiment luft och tryck Nr 2 Material: glas, papper, hink med vatten?. Hypotes: Skriv vad du tror kommer att hända innan du

Gemensamt för alla planerare i Sverige har varit att det idag är upp till planerarna själva att planera arbetet med bymiljövägar, vilket kanske även är en av orsakerna till