LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson PROGRAMMERING I SPRÅKET JAVA Innehåll 0. EXEMPEL OCH ÖVNINGAR TILL JAVA-JAVISST! ..................................................................................... 4 0. OM PROGRAMUTVECKLING (P1) ............................................................................................................................ 4 1. ECLIPSE & GRUNDLÄGGANDE PROGRAMMERING (P1) ........................................................................................... 5 Heltal och utmatning ............................................................................................................................................. 5 Inmatning av heltal ............................................................................................................................................... 6 Inmatning av decimaltal........................................................................................................................................ 8 Urval och selektion med if och else ....................................................................................................................... 8 Teckentypen char .................................................................................................................................................. 9 Textsträngtypen String ........................................................................................................................................ 10 Iteration med while-loop ..................................................................................................................................... 10 Specialecken ........................................................................................................................................................ 12 2. KLASSER OCH OBJEKT (P1 OCH P2) ...................................................................................................................... 13 Åtkomst och inkapsling ....................................................................................................................................... 13 Klassvariabler och fält av klasser ....................................................................................................................... 16 Klassmetoder och final........................................................................................................................................ 17 3. ARV (P2) .............................................................................................................................................................. 18 Skapa klasser genom arv ..................................................................................................................................... 18 Sammanfattning av arvbegrepp .......................................................................................................................... 20 Metoden toString() .............................................................................................................................................. 21 Egna paket .......................................................................................................................................................... 22 4. GUI-PROGRAM MED SWING (P1, P2) ................................................................................................................... 24 Frame-objekt ....................................................................................................................................................... 24 Textklassen JLabel .............................................................................................................................................. 24 Knappobjektet JButton och händelser................................................................................................................ 26 Textfältet JTextField ........................................................................................................................................... 27 Aritmetik, cast och typomvandling ...................................................................................................................... 28 ASCII-standard och Unicode .............................................................................................................................. 30 Klassen Math ...................................................................................................................................................... 31 Felhantering med try-catch ................................................................................................................................. 32 Avrundning och utskriftsformatering .................................................................................................................. 33 5. GRAFIK, BILDER OCH LJUD (P2) ........................................................................................................................... 34 Klassen JPanel .................................................................................................................................................... 34 JPanel som rityta ................................................................................................................................................ 34 Färger, text och figurer ....................................................................................................................................... 35 Visa bilder ........................................................................................................................................................... 35 Rekursion ............................................................................................................................................................ 36 Grafik med rekursion .......................................................................................................................................... 38 Cantor-mängden ................................................................................................................................................. 39 Koch-kurvan ........................................................................................................................................................ 40 Ormbunksblad ..................................................................................................................................................... 41 Mandelbrotmängden ........................................................................................................................................... 42 Fullskärmsläge .................................................................................................................................................... 43 Ljud ..................................................................................................................................................................... 44 Egna grafiska klassen Cirkel .............................................................................................................................. 45 Lite om animering och tangenthändelser ............................................................................................................ 47 Förslag på repetitionsuppgifter inför prov 2 i Programmering C (P2) .............................................................. 49 7. MEST OM LOOPAR OCH VAL (P1).......................................................................................................................... 50 Nästlade if-satser ................................................................................................................................................ 50 Jämförelseoperatorer och logiska operatorer .................................................................................................... 51 Sammansatta villkor ............................................................................................................................................ 51 Urval med Switch ................................................................................................................................................ 53 Loopar ................................................................................................................................................................. 53 Datatypen boolean .............................................................................................................................................. 55 9. ARRAYER, SORTERING OCH STRÄNGAR ................................................................................................................ 57 ARRAY ..................................................................................................................................................................... 57 875099958 1 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson SORTERING .............................................................................................................................................................. 61 MER OM STRÄNGAR ................................................................................................................................................. 62 13. ANIMERING OCH TRÅDAR ................................................................................................................................... 63 Timer ................................................................................................................................................................... 63 Klasser och Timer ............................................................................................................................................... 66 Datorns tid .......................................................................................................................................................... 68 Grafik och animering .......................................................................................................................................... 69 Mushändelser ...................................................................................................................................................... 71 18. APPAR FÖR ANDROID ......................................................................................................................................... 73 Installation av verktyg ......................................................................................................................................... 73 Androidprojekt .................................................................................................................................................... 74 TextView, typsnitt, färger och bakgrundsbild ..................................................................................................... 75 Händelsehantering – via ett exempel .................................................................................................................. 76 Beräkningar och layout ....................................................................................................................................... 78 Radio- och bildknappar....................................................................................................................................... 79 Layouter .............................................................................................................................................................. 80 Grafik .................................................................................................................................................................. 82 Animering ............................................................................................................................................................ 84 Bilderväxlingar ImageViews ............................................................................................................................... 84 Menyer ................................................................................................................................................................ 85 Ändra startsida .................................................................................................................................................... 86 Ljud ..................................................................................................................................................................... 86 Gruppuppgift – turistapp..................................................................................................................................... 87 Publicera appar på Google Play ........................................................................................................................ 88 1. VI BÖRJAR PROGRAMMERA......................................................................................................................... 89 INLEDNING ............................................................................................................................................................... 89 NEDLADDNING OCH INSTALLATION AV JAVA........................................................................................................... 89 JAVA MED TEXTPAD ................................................................................................................................................ 90 JAVADOKUMENTATION ............................................................................................................................................ 90 FÖRSTA PROGRAMMET I JAVA - UTMATNING ........................................................................................................... 91 INMATNING MED STANDARDKLASSER ...................................................................................................................... 92 String och tecken ................................................................................................................................................. 92 Heltal och decimaltal .......................................................................................................................................... 93 AVRUNDNING .......................................................................................................................................................... 93 HELTALSDIVISION .................................................................................................................................................... 93 ASCII-KOD .............................................................................................................................................................. 93 MATEMATISKA FUNKTIONER ................................................................................................................................... 94 URVAL OCH LOOPAR ................................................................................................................................................ 94 FÄLT (ARRAY) ......................................................................................................................................................... 95 2. GRAFISKA METODER ...................................................................................................................................... 98 FÖNSTER (FRAME) ................................................................................................................................................... 98 FÄRGER ................................................................................................................................................................... 98 LINJE I FÖNSTER MED METODEN PAINT .................................................................................................................... 99 TEXT I FÖNSTER ..................................................................................................................................................... 100 INSTANSVARIABLER MED KONSTRUKTOR OCH OBJEKT .......................................................................................... 103 INLÄSNING AV VARIABLER..................................................................................................................................... 104 3. APPLETS OCH GRAFISKA KOMPONENTER ............................................................................................ 106 APPLETS ................................................................................................................................................................ 106 PARAMETRAR I HTML-KODEN .............................................................................................................................. 109 GRAFISKA KOMPONENTER ..................................................................................................................................... 110 Knapp ................................................................................................................................................................ 110 Textruta ............................................................................................................................................................. 111 Etikett (label)..................................................................................................................................................... 112 Egenskaper hos komponenter ........................................................................................................................... 113 Rullningslist (scrollbar) .................................................................................................................................... 114 4. MUS- OCH TANGENTHÄNDELSER ............................................................................................................. 116 MUSHÄNDELSER .................................................................................................................................................... 116 875099958 2 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson OVERRIDE PÅ UPDATE ............................................................................................................................................ 117 RITA UTAN PAINT ................................................................................................................................................... 119 TANGENTHÄNDELSER ............................................................................................................................................ 120 5. ANIMERING MED TRÅDAR .......................................................................................................................... 121 TRÅDAR OCH MULTITASKING................................................................................................................................. 121 MULTIPELT ARV OCH GRÄNSSNITT I JAVA ............................................................................................................. 121 KLASSEN THREAD OCH GRÄNSSNITTET RUNNABLE ............................................................................................... 121 TVÅ TRÅDAR .......................................................................................................................................................... 124 TRÅDAR I EGEN KLASS ........................................................................................................................................... 125 6. KLASSER I EGNA FILER ................................................................................................................................ 127 EGEN KLASSFIL ...................................................................................................................................................... 127 LÖSNINGAR .......................................................................................................................................................... 128 875099958 3 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson 0. Exempel och övningar till Java-javisst! Kursmaterialet Java-javisst! omfattar det centrala innehållet till gymnasiekurserna Programmering 1 och 2 (P1 och P2), samt den gamla kursen Programmering C. I detta kapitel finns kompletterande exempel och övningar som anknyter till motsvarande kapitel i kursmaterialet Java-javisst! På följande Youtubelänkar finns bra lektioner (tutorials) i Java. Följande länk innehåller grunderna och denna fortsättningen, där kurs 20 inleder med Java Applets. Han som gjort detta heter thenewboston och har även andra kurser. 0. Om programutveckling (P1) Visar programmering av LEGO MINDSTORMS NXT, http://mindstorms.lego.com/en-us/whatisnxt/default.aspx. Laddar ner Java Plattforn (JDK) via http://www.oracle.com/technetwork/java/javase/downloads /index.html och installerar (se nedan). Gör en mapp med namnet java på datorn, kopiera första javakoden nedan (utskrifter), klistra in koden i Anteckningar och spara filen under namnet test1.java (samma namn som klassen) i mappen java. Öppna Kommandotolken via tillbehör och gå till mappen java (testa DOS-kommandona dir, cd mappnamn och cd..). Prova och kompilera filen med javac test1.java. Fungerar inte! Lägg in en sökväg (path) till bin-mappen där programmet java.exe ligger (se nedan). Kompilera test1.java igen, samt kör den kompilerade filen test1.class med kommandot java test1. Övning 0.0.1: Skapa filen test001.java som skriver ut ditt förnamn och efternamn på samma rad. Kompilera och kör programmet med kommandotolken. Övning 0.0.2: Modifiera föregående program så att för- och efternamn skrivs ut på olika rader. 875099958 4 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson 1. Eclipse & Grundläggande programmering (P1) Ladda ner programutvecklingsverktyget Eclipse via http://www.eclipse.org/downloads/. Eclipse är ett s.k. IDE - Integrated Development Environment, som är kopplat till JDK och förenklar programmeringen med felmeddelanden, kompileringen och körningen av programmen jämfört med om det skulle ha gjorts via en vanlig texteditor (Anteckningar) och med kommandotolken. Genomgång av Eclipse (s. 3-4). Övning 0.1.1: Skapa javaprojektet kap1 med Eclipse i mappen C:\Users\User\Documents\java\. Byt så att denna mappen blir till workspace med menyvalet File/Switch Workspace i Eclipseprogrammet. Heltal och utmatning Genomgång av utmatning och beräkning av heltal (s. 5-8). Ett programexempel: public class Summera { public static void main( String[] args ){ int x, y, sum; x = 17; y = 23; sum = x + y; System.out.println("Summan är " + sum); //Utskrift i konsoll } } Heltalsvariabler har datatypen int (integer) och måste deklareras i ett program: int kalle=3, x; x=kalle; //x får värdet som variabeln kalle har, d.v.s. 3; Observera att texten i programmet ovan är tabulerad (tabbad). Detta kallas indentering och görs för att öka läsbarheten av programmet. Om programmet inte är indenterat gör detta automatiskt med kommandor Ctrl+Shift+F. Övning 0.1.2: Skapa programmet Ovn012.java i projektet kap1. Programmet ska skriva ut följande tre meningar med tre olika satser, antingen System.out.println eller System.out.print: Jag heter Anders i förnamn. Andersson i efternamn. Jag bor i Skoghall. Övning 0.1.3: Skapa programmet Ovn013.java i projektet kap1 som adderar de båda heltalen x och y, som har värdena 3 respektive 7. Med koden: System.out.println("x="+x); System.out.println("y="+y); System.out.println("Summan är="+x+y); //koden har ett fel. Vilket? Ska utskriften bli: x=3 y=7 Summan är 10 875099958 5 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Övning 0.1.4: Skapa programmet Ovn014.java i projektet kap1 som multiplicerar de båda heltalen x=5 och y=7 och som tilldelar produkten till heltalsvariabeln prod med koden: int x=5, y=7, prod; prod=x*y; Ska utskriften bli: x=3 y=7 Produkten är 10 Inmatning av heltal Genomgång av inmatning av text och heltal (s. 9-10). Ett programexempel: import java.util.*; //paket för klassen Scanner public class Summa{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); //Scanner, klass för inmatning int x, y, sum; System.out.print("Skriv ett tal: "); x = sc.nextInt(); //läser in heltal System.out.print("Skriv ett tal till: "); y = sc.nextInt(); sum = x + y; System.out.println("Summan är " + sum); } } Med utskriften: Skriv ett tal: 3 Skriv ett tal till: 4 Summan är 7 Övning 0.1.5: Skapa programmet Ovn015.java i projektet kap1 som beräknar din ålder med följande utskrifter: Vilket år är du född: 1959 Ange innevarande årtal: 2012 Du fyller 53 år i år. Övning 0.1.6: Skapa programmet Ovn016.java i projektet kap1 som beräknar hur långt (s meter) en sten faller fritt på en viss tid (t sekunder) med formeln s = 4,9 ∙ t2. Det ska även gå att mata in decimaltal. Utskrifterna är följande: Ange tiden i sekunder som stenen faller fritt: 3 På 3 sekunder faller stenen 44.1 m 875099958 6 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Övning 0.1.7: Skapa programmet Ovn017.java i projektet kap1 som läser in två heltal och beräknar talens summa, differens, produkt och kvot, med följande utskrifter: Ange två heltal: 15 3 Summan är: 18 Differensen är: 12 Produkten är: 45 Kvoten är: 5 875099958 7 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Inmatning av decimaltal I förra uppgiften matade vi in heltal via konsollen. Datorn skiljer dock på heltal (int) och decimaltal (double). Därför är metoderna för inmatning lite olika: Scanner sc = new Scanner(System.in); //Scanner, klass för inmatning int x; //deklaration av heltalsvariabel double y; //deklaration av decimaltalsvariabel x = sc.nextInt(); //läser in heltal y = sc.nextDouble(); //läser in decimaltal I Ingemar Olofssons dokument http://web.kristinehamn.se/skola/anders/java/JavaKurs.pdf kan du läsa mer om datatyperna int och double. Övning 0.1.8: Modifiera övningarna 0.1.6 och 0.1.7 så att de även räknar med decimaltal. Övning 0.1.9: Skriv javaprogrammet ovn019.java som beräknar omkretsen L av en cirkel med formeln L=2R, där R är cirkelns radie och ≈3,14. Utskrifterna ska vara följande: Ange en radie: 4 Omkretsen= 25.12 Tänk på hur ett decimalkomma matas in (punkt eller komma) i konsolen, samt hur decimalkomma skrivs i programkoden. Urval och selektion med if och else Genomgång av avsnittet Selektion (s. 13). Övning 0.1.10: Skriv ett program ovn0110.java som frågar efter din kroppstemperatur. Om febern är mer än 37,5 ska programmet skriva ut "FEBER!" annars ska programmet skriva ut "Du ar frisk!". Övning 0.1.11: Skriv ett program ovn0111.java som läser in två decimaltal. Om talen är lika skrivs Talen är lika! ut, annars skrivs Talen är olika! ut. Övning 0.1.12: Skriv ett program ovn0112.java som läser in två tal och som sedan skriver ut det största av talen. Om båda är lika skrivs också talet ut. *Övning 0.1.13: Skriv ett program ovn0113.java som läser in tre tal och som sedan skriver ut det största av talen. 875099958 8 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Teckentypen char Teckenvariablerna t och s deklareras med satsen: char t,s=’k’; //char = character Tecknet t läses in från tangentbordet med satsen: t = sc.next().charAt(0); //sc är som tidigare av klassen Scanner Genomgång av avsnittet teckenvariabler (s. 14). Övning 0.1.14: Skriv programmet ovn0114.java som läser in två bokstäver. Om bokstäverna är lika skrivs Bokstäverna är lika! ut, annars skrivs Bokstäverna är olika! ut. Bokstäverna ska matas in på samma rad skilda åt av mellanslag, med utskriften: Ange två bokstäver: e u Bokstäverna är olika! Övning 0.1.15: Skriv programmet ovn0115.java som läser in en bokstav och som sedan kollar om tecknet kommer före bokstaven h i alfabetet. Om exempelvis den inmatade bokstaven är d skrivs ”d kommer först”, annars skrivs ”h kommer först”. Utskriften är följande: Övning 0.1.16: Skriv programmet ovn0116.java som först frågar om du vill beräkna en produkt (gånger) eller kvot(delat), varpå du svarar med ett p eller k. Om du väljer p uppmanas du mata in två tal, varpå produkten skrivs ut. Väljer du k uppmanas du först mata in täljaren och sedan nämnaren, varpå kvoten skrivs ut. Utskrifterna är följande: Vill du beräkna en produkt (p) eller kvot (k)? p Mata in två tal: 4 5 Produkten är 20 Eller: Vill du beräkna en produkt (p) eller kvot (k)? k Mata in täljaren: 42 Mata in nämnaren: 7 Kvoten är 6 875099958 9 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Textsträngtypen String En följd av tecken kallas för en textsträng eller bara sträng, exempelvis ”Java är kul” (s. 15). Strängvariablerna namn och s deklareras med satsen: String namn="Anders", s; //Stort S i String! En strängvariabel läses in med följande två satser: enamn = sc.next(); //sc är som tidigare av klassen Scanner. Läser ej blanktecken enamn = sc.nextLine(); Läser även blanktecken Datatyperna int, double och char är primitiva datatyper, medan String är en klass, vilket vi läser mer om senare. Övning 0.1.17: Skriv programmet ovn0117.java som läser in ditt förnamn, efternamn och ålder och sedan skriver ut detta, enligt utskrifterna nedan: Ange förnamn: Kalle Ange Efternamn: Ek Ange ålder: 17 Du heter Kalle Ek och är 17 år Övning 0.1.18: Skriv programmet ovn0118.java som läser in en text och som sedan skriver ut texten med följande utskrift: Mata in en text: Java och matte är jättekul Du matade in texten: Java och matte är jättekul Iteration med while-loop Ska något upprepas (itereras) görs detta med en loop (s. 16). Vi inleder med med while-loopen, som avbryter när ett villkor är uppfyllt. Följande program visar hur ordet java skrivs ut 5 gånger: public class test { public static void main( String[] args ){ int i = 1; while(i<=5){ System.out.println("Varv nummer "+i); i=i+1; //i++ fungerar också } } } Med utskriften: Varv Varv Varv Varv Varv nummer nummer nummer nummer nummer 875099958 1 2 3 4 5 10 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Övning 0.1.19: Skriv programmet ovn0119.java som skriver ut ditt namn 4 gånger på skärmen med en whileloop, med följande utskrift: Anders Anders Anders Anders Övning 0.1.20: Modifiera föregående program så att det frågar efter och läder in hur många gånger ditt namn ska skrivas ut, med följande utskrift: Hur många gånger ska ditt namn skrivas ut? 8 Anders Anders Anders Anders Anders Anders Anders Anders Övning 0.1.21: Modifiera föregående program ytterligare så att det även frågar efter vad du heter, med följande utskrift: Vad heter du? Anders Hur många gånger ska ditt namn skrivas ut? 8 Anders Anders Anders Anders Anders Anders Anders Anders Övning 0.1.23: Skriv programmet ovn0123.java som frågar efter hur långt uppräkning ska ske, med följande utskrift: Hur långt ska uppräkning? 8 1, 2, 3, 4, 5, 6, 7, 8 Övning 0.1.24: Modifiera föregående program så att det även startvärdet anges, med följande utskrift: Ange start- och slutvärdet för uppräkningen: -2 5 -2, -1, 0, 1, 2, 3, 4, 5 Övning 0.1.25: Modifiera föregående program så att det även skriver ut ”Nu är det noll!” på en egen rad när det är 0, med följande utskrift: Ange start- och slutvärdet för uppräkningen: -2 5 -2, -1, 0, Nu är det noll! 1, 2, 3, 4, 5 Övning 0.1.26: Modifiera föregående program så att utskriften räknar nedåt, med följande utskrift: Ange start- och slutvärdet för uppräkningen: -4 6 6, 5, 4, 3, 2, 1, 0, Nu är det noll! -1, -2, -3, -4 Övning 0.1.27: Skriv programmet ovn0127.java med följande utskrift: Ange startvärde, steglängd och antal varv i lopen för uppräkningen: -7 3 8 -7, -4, -1, 2, 5, 8, 11, 14 875099958 11 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Övning 0.1.28: Skriv programmet ovn0128.java som beräknar summan av termerna 1+2+3+4+…+n. Om exempelvis n=3 är summan 6. Utskrifterna är följande: Ange n: 5 Summan=15 Övning 0.1.29: Skriv programmet ovn0129.java som beräknar produkten av termerna 1*2*3*4*…*n. Om exempelvis n=4 är produkten 24. Utskrifterna är följande: Ange n: 5 Produkt=120 Specialecken \ Avänds om reserverade tecken ska skrivas ut, exempelvis \” \t Tabulator, d.v.s. inskjutning (indentering) av text. \n Ger ny rad // Kommentar på en rad /*…*/ Kommentar över flera rader. Övningar: Gör övningarna 1-7 på sidan 24-25 i Java javisst! Kursen Programmering 1 fortsätter nu i avsnitt 7 i detta kapitel. 875099958 12 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson 2. Klasser och objekt (P1 och P2) Inledningsvis visas en klass Person med instansvariabler för ålder, förnamn och efternamn, samt ett par konstruktorer och några metoder: public class Person { private int age; //instansvariabel private String fnamn; //instansvariabel private String enamn; //instansvariabel public Person(){ //konstruktor ger default-värden (förvalda) på instansvariablerna age = 17; fnamn = "Carl"; enamn = "Carlsson"; } public Person( int age, String fnamn, String enamn){ //konstruktor med argument this.age = age; //this används för att komma åt det egna objektet this.fnamn = fnamn; this.enamn = enamn; } public String SkrivPerson(){ //metoden returnerar alder, förnamn och efternamn för utskrift return age + " " + fnamn +" "+ enamn; } public void setage(int c){ age = c; } //metod för att kunna ändra ålder public void setfnamn(String c){ //metod för att kunna ändra förnamn fnamn = c; } public int getAge(){ //metod för att ta reda på ålder return age; } } Ett program (klass) som använder klassen Person: public class test_person { public static void main(String[] args) { //Objektet (instansen) p1 skapas (instansieras) från klassen Person med konstruktorn Person(...) Person p1 = new Person(35, "Therese", "Alshammar"); Person kalle; //Skapar referens för objektet kalle (som variabeldeklaration) kalle = new Person(); //Objektet kalle skapas med defaultkonstruktorn Person() System.out.println("Person 1: " + p1.SkrivPerson()); System.out.println( "Ålder på person Kalle: "+ kalle.getAge()); System.out.println( "Namn på kalle: "+ kalle.SkrivPerson()); kalle.setenamn("Svensson"); System.out.println( "Namn på kalle: "+ kalle.SkrivPerson()); } } Åtkomst och inkapsling Genomgång av begreppen private och public i avsnittet Åtkomst i objekt (kapitel 2 s. 19). 875099958 13 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Övning 0.2.1: Skapa klassen Klot.java i projektet kap2 med var en variabel för radie (double), en konstruktor Klot() med värdet 1 för radien, en konstruktor Klot(double radie), metoden void volym() för utskrift av klotets volymen och metoden double area() för beräkning av klotets area. Skriv även ett program test_klot.java i projektet kap2 som inledningsvis skapar ett objekt med defaultkonstruktorn Klot() och som sedan läser in en ny radie och skapar ett nytt objekt med konstruktorn Klot(radie). Utmatningen ska fungera på följande sätt: Volymen är 4.188786666666666 Arean är 12.56636 Ange radien: 2 Volymen är 33.51029333333333 Övning 0.2.2: Skapa klassen Familj.java i projektet kap2 med en variabel antal_barn för antal barn, en variabel mor för mammans namn, en variabel far för pappans namn, samt en fältvariabel barn_namn för barnens namn. Konstruktorn Familj(antal, mor, far) skapar ett objekt för antal barn, samt för mammans och pappans namn. Klassen har även följande metoder: antal_barn(): returnerar antal (int) barn mor_far(): returnerar namnen på båda föräldrarna med ”och” emellan. las-in-barn(): läser in namnen på barnen till fältet barn med en for-lop. skriv_ut_barn(): skriver ut namnen på barnen. las_in_parents(): läser in föräldrarnas namn. Klassen har följande struktur: import import import public java.io.BufferedReader; //Alternativt: import java.io.*; för alla tre paket java.io.IOException; java.io.InputStreamReader; class Familj { private int antal_barn; private String[] barn=new String[10]; private String mor,far; public Familj( int antal_barn, String mor, String far){ this.antal_barn = antal_barn; this.mor = mor; this.far = far; } BufferedReader in=new BufferedReader(new InputStreamReader(System.in)); public int antal_barn(){ ... } public String mor_far(){ ... } public void las_in_barn() throws IOException{ ... } public void skriv_ut_barn() throws IOException{ ... } public void las_in_parents() throws IOException{ ... } } 875099958 14 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Programmet (klassen) familj_prog.java som använder klassen Familj har följande utseende: import java.io.*; public class familj_prog { public static void main(String[] args) throws IOException{ Familj f1 = new Familj(3,"Gun","Jan"); System.out.println("Antal barn: "+f1.antal_barn()); System.out.println("Föräldrarna heter "+f1.mor_far()); f1.las_in_barn(); f1.skriv_ut_barn(); f1.las_in_parents(); System.out.println("Föräldrarna heter "+f1.mor_far()); } } En körning med programmet kan ha följande urskrifter: Antal barn: 3 Föräldrarna heter Gun och Jan Ange barnnamn 1: Eva Ange barnnamn 2: Per Ange barnnamn 3: Linda Barn 1: Eva Barn 2: Per Barn 3: Linda Ange moderns namn: Helena Ange faderns namn: Viktor Föräldrarna heter Helena och Viktor Din uppgift är nu att skriva programkoden för metoderna i klassen Familj ovan. Lös förslagsvis uppgiften genom att först skapa projektet familj med de båda klasserna Familj.java och familj_prog.java i projektet kap2. Kopiera sedan in koden ovan och skriv klart metoderna. Övning 0.2.3: Nu ska du förbättra föregående program familj_prog.java (alternativt gör du ett nytt program med namnet familj_meny.java) så att metoderna anropas via en while-loopad meny, enligt nedan. Lägg även till metoden skriv_ut_parents() i klassen Familj.java, så att all utskrift sker via metoder. Observera att metoden anropar en annan metod: public void skriv_ut_parents(){ System.out.println("Föräldrarna heter "+mor_far()); } En körning av programmet familj_prog.java kan se ut på följande sätt: 1: Skriv ut föräldrar. 2: Läs in barn. 3: Skriv ut barn. 4: Läs in föräldrar. 5: Avsluta. Gör ett val: 1 Föräldrarna heter Gun och Jan 875099958 15 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Klassvariabler och fält av klasser En klassvariabel är en static-deklarerad variabel i klass-filen som är oberoende av objekten, till skillnad från instansvariablerna. Med deklarationen i klassen Familj.java… public static int antal_familj=0; …anropas klassvariabeln antal_familj med följande sats i ett javaprogram: Familj.antal_familj++; //Observera att klassnamnet anges före punktnotationen. Övning 0.2.4: Modifiera föregående övning (alternativt gör du ett nytt program med namet familjer_meny.java) ytterligare så att maximalt 10 familjer kan lagras i ett fält (register), med följande fältdeklaration i programmet familj_prog.java: Familj[] f = new Familj[10]; //skapar referenser till fältet (ej objekt) I menyvalet nummer 0 nedan skapas ett nytt objekt (familj) med följande satser: if (val==0){ Familj.antal_familj++; f[Familj.antal_familj]=new Familj(); //skapar ett nytt objekt f[Familj.antal_familj].las_in_antal_barn(); f[Familj.antal_familj].las_in_parents(); } Där klassvariabeln antal_familj är static-deklarerad i klassen Familj.java, d.v.s. behåller sitt värde i klassen oberoende av objekten. Så här ser menyn ut: 0: Skapa ny familj. 1: Skriv ut föräldrar. 2: Läs in barn. 3: Skriv ut barn. 4: Läs in föräldrar. 5: Skriv ut alla familjer. 6: Avsluta. Gör ett val: 0 Ange antal barn: 1 Ange moderns namn: ewa Ange faderns namn: jan Klassen Familj.java har fått en tom konstruktor Familj(), samt metoden: public void las_in_antal_barn() Som läser in till variabeln antal_barn. 875099958 16 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Klassmetoder och final En klassmetod är en static-deklarerad metod i klass-filen som liksom klassvariabler inte är knuten till ett objekt och kan anropas utan att ett objekt behöver skapas. I följande klassen Matte.java: import java.text.*; public class Matte { public static double sqr(double x) { //klassmetoder föregås av static return …; } public static double roten(double x) { return …; } public static final double g = 9.824; //g kan ej ändras public static String avrunda(double x, int n) { //avrund till n decimaler NumberFormat r = NumberFormat.getInstance(); r.setMaximumFractionDigits(n); return r.format(x); } } …anropas med satsen: Matte.roten(x); //Observera klassnamnet Övning 0.2.5: Nu ska du färdigställa klassen Matte.java ovan, samt skriva ett menystyrt program matteprogram.java som gör lite beräkningar. Lös uppgiften på följande sätt: Börja med att skapa klassen Matte.java i ditt projekt kap2. Kopiera in koden ovan och skriv klart metoderna. - sqr(x) beräknar kvadraten - roten(x) beräknar kvadratroten - avrrunda(x,n) avrundar x till n decimaler Skapa programmet matteprogram.java. Programmet visar följande meny: - 1: Beräkna kvadratroten (läser in tal och antal decimaler som ska skrivas ut) - 2: Beräknar fallsträcka (läser in tiden och beräknar med fysikformeln s=g∙t2/2 fallsträckan utan avrundning) - 3: Avsluta Vid beräkningarna används klassmetoder, samt gravitationskonstanten g i klassen Matte.java. *Övning 0.2.6: Lös övningen Konsol-personbilar på sidan 23 i Java-javisst! kapitel 2. *Övning 0.2.7: Lös övningen Skjortor på sidan 2 i extra övningsuppgifter. 875099958 17 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson 3. Arv (P2) I detta avsnittet ska vi se hur instansvariabler och metoder i klasser kan ärvas till ärvas till andra klasser. Begreppet arv är ett centralt begrepp i Java och modern programmering. Läs mer i kapitel 3 i JavaJavisst!. Vi inleder med ett exempe som illustrerar begreppet arv. Skapa klasser genom arv Följand klass Raknesatt innehåller metoder för de fyra räknesätten, samt en konstant för talet pi: public class Raknesatt { public static final double pi = 3.1415; public double add(double x, double y) { return x+y; } public double diff(double x, double y) { return x-y; } public double prod(double x, double y) { return x*y; } public double kvot(double x, double y) { return x/y; } } Klassen innehåller ingen deklarerad konstruktor och får då automatiskt den tomma defaultkonstruktorn: Raknesatt(){} Följande klass Fyrkant innehåller en metod för beräkning av arean hos en rektanger och ärver eventuella protected- deklarerade instansvariabler, samt övriga public-deklarerade variabler och metoder från klassen Raknesatt: public class Fyrkant extends Raknesatt {//extends: arv från superklassen Raknesatt protected String typ; //Kvadrat eller Rektangel. protected double bredd, hojd;//Instansvariabler protected i superklass public Fyrkant(String t, double b, double h) { typ=t; bredd=b; hojd=h; } public Fyrkant() {} //Tom konstruktor måste finnas för subklass Area public double yta() { //Beräknar arean av fyrkant return bredd*hojd; } public String ge_typ() {//Ger typ av fyrkant return typ; } } 875099958 18 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Följande subklass klass Area innehåller en metod som beräknar arean av en cirkel och ärver på motsvarande sätt egenskaperna från superklassen Fyrkant och därmed också från klassen Raknesatt: public class Area extends Fyrkant { private double radie; public Area(double b, double h) { //konstruktor för fyrkant typ="Fyrkant"; bredd=b; hojd=h; } public Area(double r) { //konstruktor för cirkel typ="Cirkel"; radie=r; } public double cirkel_yta() { return radie*radie*pi; //pi från superklass Raknesatt } } Slutligen kommer klassen (javaprogrammet) TestRakna som använder klasserna ovan: public class TestRakna { public static void main(String[] args){ Raknesatt p = new Raknesatt(); //Raknesatt - superklass till Fyrkant Fyrkant fyr=new Fyrkant("kvadrat",6,7); //Fyrkant - superklass till Area, men subklass till Raknesatt Area ar=new Area(2); //ar är cirkel. Area - subklass till Fyrkant Area a2=new Area(4,7); //a2 är en rektangel System.out.println(p.add(2,5)); System.out.println(fyr.kvot(2,5)); System.out.println(Raknesatt.pi); System.out.println(fyr.ge_typ()); System.out.println(Fyrkant.pi); System.out.println("Fyrkantyta: "+fyr.yta()); System.out.println(Area.pi); System.out.println(ar.kvot(1,3)); //ar och a2 når alla metoder i superklasser System.out.println(ar.cirkel_yta()); //Beräknar cirkelyta System.out.println(ar.ge_typ()); System.out.println(a2.yta()); //Beräknar rektangelyta System.out.println(a2.ge_typ()); } } Ger följande utskrift: 7.0 0.4 3.1415 kvadrat 3.1415 Fyrkantyta: 42.0 3.1415 0.3333333333333333 12.566 Cirkel 28.0 Fyrkant 875099958 19 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Klasserna ärver endast ”bakåt”, d.v.s. metoden cirkel_yta() i klassen Area är inte åtkomlig i klassen är inte åtkomlig i Fyrkant. En variant är dock att klassen Fyrkant ärver (extends) av klassen Area, som ärver (extends) av klassen Fyrkant. Fungerar detta? Sammanfattning av arvbegrepp Superklass Klass arvet sker från Subklass Klassen som ärver Extends Anger arv Override Metoder med samma namn i subklass (överskuggar). Kallas polymorfism. Default konstruktor Superklassen måste alltid innehålla en tom konstruktor. Protected Istället för private framför instansvariabler i superklass. Övning 0.3.1: Du ska skriva ett javaprogrammet Personal.java och två klasser, Person och Larare, där Larare är en subklass till klassen Person. Lös uppgiften på följande sätt: Klassen Person har de tre instansvariablern fnamn och enamn (String) för personens föroch efternamn, samt f_ar (int) för personens födelseår (typ 1995) och konstruktorn Person(fnamn, enamn, f_ar) och den tomma defaultkonstruktorn Person() {}. Metoden age(nu), som tar aktuellt årtal nu (int) och returnerar personens ålder (int). Subklassen Larare ärver från klassen Person, vilken har instansvariablern lon (int) för personens månadslön och anst_ar (int) för personens anställningsår (typ 2009), konstruktorn Larare(fnamn, enamn, f_ar, lon, anst_ar), samt metoderna skriv_ut(), som skriver ut all information om läraren (se program nedan) och visa_antsällningsar(nu), som skriver ut en ”o” för varje år läraren varit anställd (se program nedan). Programmet Personal.java har följande utseenede: public class Personal { public static void main(String[] args){ Larare l = new Larare(“Jan”,“Gran”,1976,28000,2005); l.skriv_ut(); System.out.println(”Lärarens ålder: ”+l.age(2012)); l.visa_anställningsar(2012); } } Och får då utskriften: Förnamn: Jan Efternamn: Gran Födelseår: 1976 Lön: 28000 kr/månad Anställningsår: 2005 Lärarens ålder: 36 år Antal anställningsår: ooooooo Börja med att skapa projektet kap3 i Eclipse där du sparar alla filer (klasser) och lös sedan uppgiften. System.out.println(a2); 875099958 //utan metodnamn 20 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Metoden toString() Om en metod döps till toString(), som finns i klassen Object alla klasser ärver ifrån, anropas den endast med objektreferensen. Om i programmet TestaRakna ovan metoden ge_typ() istället ges namnet toString() anropas den på följande sätt: System.out.println(a2); //Endast med objektsreferensen Övning 0.3.2: a) Du ska nu göra en klass Rat_triangel med en metod double area() som beräknar arean av en rätvinklig triangel och en metod double pyth() som beräknar triangelns hypotenusa. Klassen har de två instansvariablerna double bas, hojd, samt de tre konstruktorerna Rat_triangel(bas, hojd), Rat_triangel() och toString(), som returnerar höjden och basen (se utskrift nedan). Med programmet nedan, som du kopierar till en ny klass TestTriangel.java i projektet kap3: public class TestTriangel { public static void main(String[] args){ Rat_triangel t=new Rat_triangel(3,4); System.out.println(“Hypotenusan=”+t.pyth(3,4)); System.out.println(“Arean=”+t.area(3,4)); System.out.println(t); } } Blir utskriften: Hypotenusan=5.0 Arean=6.0 Basen=3.0 Höjden=4.0 b) Gör nu så att klassen Raknesatt ovan blir en superklass till Rat_triangel. TestTriangel modifieras sedan till: System.out.println(t.prod(5,7)); //Vad blir ur skriften? c) Gör nu istället så att Rat_triangel blir en superklass till Raknesätt. TestTriangel modifieras sedan till: Raknesatt r=new Raknesatt(); System.out.println("Hypotenusan="+r.pyth(3,4)); System.out.println("Arean="+r.area(4,6)); //Vad blir utskrifterna? d) Gör nu så att Rat_triangel ärver från TestTriangel, som ärver från Rat_triangel. Vilka felmeddelanden får du och vad händer om du försöker köra programmet? Vilken slutsats drar du av detta? *Övning 0.3.3: Lös övningen Konsol-combi-bilar på sidan 8 i Java-javisst! kapitel 3. *Övning 0.3.4: Lös övningen Klassen-person på sidan 10 i Java-javisst! kapitel 3. *Övning 0.3.5: Lös övningen Arv i flera generationer på sidan 11 i Java-javisst! kapitel 3. *Övning 0.3.6: Lös övningen Metoden toString() på sidan 12 i Java-javisst! kapitel 3. 875099958 21 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Egna paket Via import-satsen i början av javaprogrammet får vi tillgång till javas befintliga klasser genom att importera paket (package). Vi kan även skapa egna paket för klasser och metoder vi gjort och vill återanvända. Paketen kan göras tillgängliga endast i ett Eclipse projekt eller i alla mappar. Följande punkter visar hur vi skapar och använder ett eget paket: Skapa ett nytt projekt aa_test i javamappen i Eclipse. Skapa en klasses TestaRaknesatt i projektet, med koden: import java.util.*; import mittpaket.*; public class TestaRaknesatt{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); double x, y; System.out.print("Skriv ett decimaltal: "); x = sc.nextDouble(); System.out.print("Skriv ett decimaltal till:"); y = sc.nextDouble(); Raknesatt r = new Raknesatt(); System.out.println("Summan är " + r.add(x,y)); System.out.println("Differensen är " + r.diff(x,y)); } } Skapa paketet mittpaket, med projektet aa_test markerat: File --> New --> Package --> mittpaket --> Finish. Skapa klassen Raknesatt i mittpaket med koden: package mittpaket; public class Raknesatt { public static final double pi = 3.1416; public double add(double x, double y) { return x+y; } public double diff(double x, double y) { return x-y; } public double prod(double x, double y) { return x*y; } public double kvot(double x, double y) { return x/y; } } Spara allt och provkör TestaRaknesatt. Kolla i mappen aa_test i utforskaren, vilken bör ha strukturen: aa_test src TestaRaknesatt.java mittpaket Raknesatt.java bin TestaRaknesatt.class mittpaket Raknesatt.class 875099958 22 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Alla klasser som tillhör projektet aa_test kan nu använda paketet mittpaket, som endast är definierat i projektet aa_test. Vi vill nu göra klasserna och metoderna i paketet mittpaket tillgängliga via import-satsen för andra javaprogram. Detta görs på följande sätt: Skapa en ny mapp under förslagsvis C:\, t ex C:\minaklasser och kopiera dit mittpaket med Raknesatt.class. Strukturen blir där: C:\minaklasser mittpaket Raknesatt.class Skapa det nya projektet testa i javamappen. I det projektet skapas klassen TestaRaknesatt, enligt ovan. Kör programmet, vilket inte fungerar eftersom paketet mittpaket inte hittas. Lägg till C:\minaklasser i ClassPath, via Start/högerklicka Dator/Egenskaper/Avancerade systeminställningar/Miljövariabler/Redigera classpath. Kör programmet igen. Fungerar det nu? Om inte – gör följande: Högerklicka projektet testa. I menyn välj Properties/Java Build Path --> fliken Source --> Link Sourse --> browse till minaklasser --> ok – Finish. Provkör igen. Nu bör det fungera. Att testa: Fungerar det även om man tar bort ClassPath C:\minaklasser ovan? 875099958 23 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson 4. GUI-Program med Swing (P1, P2) I detta avsnitt kommer vi att börja använda GUI (Graphical User Interface) i våra program, det vill säga textobjekt, knappar och textfält för inmatning. Frame-objekt Genomgång av övning En enkel GUI-applikation på sidan 4-5 i Java-javisst! kapitel 4 som skapar ett tomt fönster (container) med klassen JFrame i paketet javax.swing. Nedan visas klassen (programmet) JFrameTest.java, som ärver (extends) från klassen JFrame. Alla klasser som tillhör paketet jawax.swing börjar på stora ’J’. import javax.swing.*; import java.awt.*; public class JFrameTest extends JFrame { public static void main(String[] args) { JFrameTest f = new JFrameTest (); f.setSize(300, 100); f.setLocation(100,100); f.setTitle("Övning 0.4.3"); f.setDefaultCloseOperation(JPanelTest.EXIT_ON_CLOSE); f.setVisible(true); } } Textklassen JLabel Genomgång av övning Lägg till en JLabel på sidan 6 i Java-javisst! kapitel 4 som skapar text med klassen JLabel i paketet javax.swing. Textobjekten placeras ut med flytande layout efterhand som de skapas med klassen FlowLayout i paketet java.awt. Kolla typsnitt, stil, textfärg etc. Observera att label-objekten skapas i klassen KnappFrames konstruktor. import javax.swing.*; import java.awt.*; public class JFrameTest extends JFrame { JLabel lbl; public JFrameTest () { //Konstruktor this.setLayout( new FlowLayout() ); lbl = new JLabel("Detta är en JLabel!"); lbl.setFont(new Font("Arial",Font.ITALIC ,20)); lbl.setForeground(Color.red); Metoder för textformatering: this.add(lbl); } lbl.setFont(new Font("Arial",Font.ITALIC ,20)); public static void main(String[] args) { lbl.setForeground(Color.yellow); JFrameTest f = new JFrameTest (); lbl.setOpaque(true); f.setSize(300, 100); lbl.setBackground(Color.blue); f.setLocation(100,100); f.setTitle("Övning 0.4.3"); f.setDefaultCloseOperation(JPanelTest.EXIT_ON_CLOSE); f.setVisible(true); } } Följande stilar finns: Font.PLAIN, Font.ITALIC, Font.BOLD eller med additionen Font.ITALIC + Font.BOLD (för kursiv + fet stil). Med följande sats tilldelas labeln lbl en text: lbl.setText("Hej " ); 875099958 24 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Övning 0.4.1: Skapa javaprojektet kap4 i din javamapp med Eclipse. Skapa sedan programmet ovn041.java med ramen och texten enligt urklippet till höger, med storleken 300 x 100 pixlar. Övning 0.4.2: Modifiera föregående uppgift så att texten får utseendet till höger, med typsnittet Arial, storlek 20p, kursiv och fetstil, samt röd text med grön bakgrund. Övning 0.4.3: Modifiera föregående uppgift genom att lägga in ytterligare ett textobjekt med storleken 100p. Ramen har måtten 300 x 200 pixlar. 875099958 25 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Knappobjektet JButton och händelser Genomgång av övning Byt färg på etikett på sidan 10, samt övning Två knappar på sidan 11 i Java-javisst! kapitel 4. Knappen knapp deklareras med klassen JButton ovanför konstruktorn: JButton knapp; Och med följande kod i konstruktorn, tillsammans med den tidigare koden för texten (JLabel): … knapp = new JButton("En knapp"); this.add(knapp); … I följande exempel byter texten färg från rött rill grönt när knappen klickas med hjälp av händelsemetoden actionPerformed(): … import java.awt.event.*; //Paket för att kolla händelser public class JFrameTest extends JFrame implements ActionListener { //Från gränssnittet ActionList… JLabel lbl; JButton knapp; public JFrameTest () { this.setLayout( new FlowLayout() ); lbl = new JLabel("Detta är en JLabel!"); lbl.setFont(new Font("Arial",Font.ITALIC ,20)); lbl.setForeground(Color.red); knapp = new JButton("Tryck här"); knapp.addActionListener(this); //Lyssnar på knappen this.add(knapp); this.add(lbl); } public void actionPerformed(ActionEvent e){ lbl.setForeground(Color.green); } //Metoden actionPerformed finns i gränssnittet … Finns flera knappar (knapp1 och knapp2) kollar följande kod vilken av knapparna som orsakat händelsen: public void actionPerformed(ActionEvent e){ if( e.getSource() == knapp1) lbl.setBackground(Color.blue); if( e.getSource() == knapp2) lbl.setBackground(Color.red); } Övning knappar: Skapa klassen Knapp och skriv ett program med tre knappar och en text, vars färg ändras när knapparna klickas. Urklippet till höger visar hur det ska se ut och programmet skall fungera som exemplet knappar.jar. När sista knappen klickas blir det ju en grön bakgrund till texten, som ligger kvar när de andra knapparna klickas. Gör så att den gröna bakgrunden försvinner när de andra knapparna klickas. 875099958 26 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Textfältet JTextField Genomgång av övningarna Skriv in en text på sidan 12, Textfältet kan lyssna och Ändra textens utseende (samma som för JLabel) på sidan 13, Mata in tal på sidan 14 i Java-javisst! kapitel 4. Textfältet t2 deklareras med klassen JTextField ovanför konstruktorn: JTextField t2; Och med följande kod i konstruktorn, tillsammans med den tidigare koden för texten (JLabel) och knappen (JButton) skapas textfältet t2: … t2 = new JTextField(15); t2 = new JTextField(“Skriv här”); this.add(t2); //Antal positioner //Alternativt med text //Textfältet adderas till framen Här följer ytterligare några metoder för textfältet t2: t2.addActionListener(this); String ss = t2.getText(); t2.setText("Anders"); t2.setForeground(Color.red); t2.setEnabled(false); t2.setEditable(false); t2.requestFocus(); t2.selectAll(); //Reagerar på Enter i textfältet och anropar actionPerformed(…) //Textfältets innehåll tilldelas strängen ss //Textfältet får strängen Anders //Textfältets text blir röd //Textfältet går ej att redigera och texten gråmarkeras //Textfältet går ej att redigera, men men texten gråmarkeras inte //Textfältet fokuseras //Textfältets innehåll markeras, om det är fokuserat Övning textfält: Skapa klassen Textfalt och skriv ett program som läser in ett föroch efternamn och som skriver ut dem i en label, enligt urklippet och exemplet inmata.jar. Inmatningen ska även fungera med Enterknappen i andra textrutan. Övning textfält2: Kopiera koden från föregående övning och skapa klassen inmata2. Ta sedan bort knappen ochh lägg till ytterligare ett textfält. Inmatningen sker nu istället med en lyssnare i textfältet för efternamn, vilken reagerar på enter-tangenten. I det tredje textfältet, med egenskapen setEditable(false), Skrivs det inmatade för- och efternamnet ut med röd text. I det fjärde textfältet, med egenskapen setEnabled(false), skrivs de inmatade namnen ut igen. Samtidigt markeras det inmatade förnamnet och efternamnet raderas. Programmet ska fungera som inmata2.jar. 875099958 27 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Aritmetik, cast och typomvandling Genomgång av aritmetik och omvandling (cast) mellan datatyper på sidorna 16-18 i Java-javisst! kapitel 4. Observera särskilt: Division mellan heltal (int) ger kvoten som heltal utan decimaler. Om variablera a=19 och b=5 är deklarerade som int blir a/b=3. Om däremot variablerna är deklarerade som double blir a/b=3,8. Om a och b är heltal ger a%b resten vid division. Om variablera a=19 och b=5 är deklarerade som int blir a%b=4, d.v.s. resten är 4. Vid exempelvis uppdelning av ett belopp i olika valörar (sedlar och mynt) kan man ha nytta av detta: … int belopp, femti, tjugo, tio, fem, rest; System.out.print("Ange ett belopp i kronor (mindre än 100 kr)?: "); belopp = sc.nextInt(); femti = belopp / 50; rest = belopp % 50; tjugo = rest / 20; rest = rest % 20; tio = rest / 10; rest = rest % 10; fem = rest / 5; rest = rest % 5; System.out.println("Valörer - sedlar och mynt"); System.out.println("Femtio: " + femti); … Om x är ett decimaltal blir (int)x ett heltal. Om a är ett heltal blir (double)a ett decimaltal. Detta kallas cast (omvandling) av datatyper. Klassmetoderna Integer.parseInt(s) och Double.parseDouble(s) omvandlar strängen s (om den är ett tal!) till ett hel- respektive decimaltal. Övning 0.4.4a: Skriv ett program som läser in två heltal och beräknar som skriver ut kvoten, heltalskvoten, och resten med följande utskrift: Ange två heltal: 19 5 Kvoten: 3.8 Heltalskvoten: 3 Resten: 4 Övning 0.4.4b: Skriv ett program som läser in ett belopp i kronor och som sedan delar upp det i befintliga valörer av sedlat och mynt. Använd koden i exemplet ovan. Programmet ska ha följande utskrift: Ange ett belopp i kronor: 748 Valörer: 500:1, 100: 2, 50:0, 20:2; 10:0, 5:1, 1:3 *Övning 0.4.4c: Skriv ett program som omvandlar ett decimalt tal till ett binärt tal. Exempelvis är det binära talet 101 det decimala talet 5, samt 11011 det decimala talet 27. Från höger är varje talposition värd 1, 2, 4, 8, 16, 32, 64 o.s.v. Programmet har följande utskrift: Ange ett decimaltal: 27 Omvandlat till binärt tal: 11011 875099958 28 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Övning 0.4.4: Skapa klassen InmataTal i Eclipse. Skriv sedan ett program som beräknar med de fyra räknesätten för heltal, enligt urklippet till höger. Övning 0.4.5: Modifiera föregående övning så att den även fungerar för decimaltal. Övning 0.4.6: Skriv ett program som skriver ut heltalskvoten och resten vid division mellan två heltal, enligt urklippet till höger. 875099958 29 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson ASCII-standard och Unicode Varje tecken (a, b, 2, %...) var i datorns barndom förknippat med ett nummer mellan 0 och 127, d.v.s. en 7-bitars ASCII-kod. Detta räckte så länge endast bokstäverna a-z användes. Senare fler tecken behövdes utökades detta till en 8-bitars kod (1 byte) som omfattar 256 (0-255) olika tecken. I Java används 16-bitars Unicode, som alltså kodar för 65 536 olika tecken, där de första 255 är samma som i ASCII-standarden. Följande javakod omvandlar mellan Unicode och och tecken: (int)t; //ger Unicoden för tecknet som är lagrat i char-variabeln t (char)h; //ger tecknet med Unicoden som är lagrad i int-variabeln h Eftersom inläsning från textrutor (.getText()) alltid görs som strängar (String-typ), måste man kunna ange ett visst tecken i strängen s. Detta gös med javakoden: s.charAt(0); //som ger första (nollte) tecknet i strängen s Övning 0.4.7: Skriv ett program som läser in ett tecken och en Unicode i två textrutor och skriver ut motsvarande Unicode respektive tecken i två lablar, enligt urklippet till höger. Övning 0.4.8: Skriv ett program som skriver ut Unicoden 50-127 och motsvarande tecken i en tabell, enligt urklippet intill. Använd förslagsvis klassen JTextArea, som fungerar som en textruta, men som har ett antal rader och kolumner och kan bryta rad. Detta deklareras på följande sätt: JTextArea tt; tt = new JTextArea(5,20); //5 rader och 20 kolumner, lägger till fler rader vid behov tt.setLineWrap(true); //bryter rad add(tt); Ledning: Addera strängen i for-loopen innan den skrivs ut i textarean: s=s+" "+i+":"+(char)i; 875099958 30 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Klassen Math Klassen Math och dess klassmetoder sammanfattas i kapitel 1 i detta dokumentet, samt på sidan 18 i kapitel 4 i Java-javisst!. Övning 0.4.9a: Skriv ett program som skriver ut tio slumptal mellan 1 och 10, men följande utskrift i konsollen: Tio slumptal: 3 1 5 4 10 2 2 3 7 8 Övning 0.4.9b: Modifiera föregående program så det läser in det högsta slumptalet (heltal), samt antalet slumptal som ska genereras och som sedan beräknar medelvärdet av slumptalen. Det lägsta slumptalet är 1. Utskriften i konsollen är följande: Ange det högsta slumptalet: 100 Ange antal slumptal: 150 Medelvärdet av slumptalen är 51.306666666666665 Övning 0.4.9c: Skriv om föregående program så att inmatning av högsta och antal slumptal görs i textrutor och utskriften i en label, enligt urklippet till höger. Programmet ska fungera som slumpmedel.jar. Övning 0.4.9d: Skriv ett program som läser in två kateter och beräknar hypotenusan med Pythagoras sats. Övning 0.4.9: Skriv ett program som slumpar två heltalsfaktorer mellan 1 och 10 och som sedan kollar om det inmatade talet är produkten av faktorerna. Antal försök, rätt och fel skrivs ut. Inmatning görs med Enter-tangenten. Efter tio försök går det inte att göra fler inmatningar i textrutan. Detta åstadkoms med satsen: tf1.setEnabled(false); //tf1 är textfältet Programmet ska fungera som multi.jar. 875099958 31 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Felhantering med try-catch Vi går igenom try-catch-konstruktionen för att ta hand om fel vid inmatning. Om exempelvis en bokstav matas in istället för en siffra i föregående uppgift kan vi med hjälp av try-catch undvika att exekveringen avbryts. Läs om detta på sidan 20 i kapitel 4 i Java-javisst!. Övning 0.4.10: Modifiera föregående multiplikationsövning på följande sätt: Så att den ger ett felmeddelande i andra etiketten om en bokstav matas in. Matas en bokstav in ska Antal försök inte ökas. Så att det minsta värdet på faktorerna är 2 och inte 1 som i förra exemplet (för enkelt!). Antalet försök räknas ner från 10 till 0. Lägg in en knapp som blir klickbar när antal kvarvarande försök är 0. Lägg in lyssnaren b.addActionListener(this); för knappen och händelsehanteraren if(e.getSource()==b) ny(); //se nedan i metoden actionPerformed(ActionEvent e) När knappen klickas initieras en ny omgång via den egna metoden ny(): public void ny(){ ratt=0; fel=0; antal=10; lbl2.setText("Antal försök kvar: 10 Antal rätt: 0 tf1.setEnabled(true); b2.setEnabled(false); x =1+ (int)Math.ceil(Math.random()*9); y = 1+(int)Math.ceil(Math.random()*9); lbl1.setText(x+" x "+y+" = "); Antal fel: 0"); } Programmet ska fungera som mult_ovn2.jar. 875099958 32 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Avrundning och utskriftsformatering Vi går igenom avrundning på sidan 21 i Java-javisst! kapitel 4 med metoden String.format(…), samt i detta dokument på sidan 76 i detta dokumentet med metoden NumberFormat i paketet java.text.*. Följande satser gäller: System.out.println(String.format("%10s","kalle")); //strängen kalle på 10 positioner System.out.print(String.format("%4d",n)); //heltalet n på 4 positioner System.out.println(String.format("%7.3f",x)); //decimaltalet x med 3 decimaler på 7 poitioner Övning 0.4.11: Skriv ett program som i konsolen läser in ett tal och som sedan skriver ut talets kvadratrot utan avrundning och med avrundning till tre decimaler på sju positioner (högerjusterat), enligt utsktiften: Skriv ett tal: 2 Kvadratroten är 1.4142135623730951 Roten är 1,414 Övning 0.4.12: Lös övning Cirkel på sidan 18 i Java-javisst! kapitel 4, som skriver ut area och omkrets avrundat till två decimaler med String.format(…). Programmet ska fungera som cirkeln.jar. Ledning: Utskriften görs förslagsvis med satsen: lbl_area.setText("Area= " + String.format("%1.2f", area)+" cm2"); Övning 0.4.13: Modifiera uppgift 0.4.9d ovan om Pythagoras så att svaret avrundas till en decimal med NumberFormat. Programmet ska fungera som hypotenusa.jar. *Övning 0.4.14: Gör ett program tabell.java som i konsolen skriver ut värdetabellen för kvadratroten ur x, x2, x3 och x4 nedan. Observera att alla utskrifter görs på åtta positioner: x 0 1 2 3 4 5 rot 0,000 1,000 1,414 1,732 2,000 2,236 875099958 x2 0 1 4 9 16 25 x3 0 1 8 27 64 125 x4 0 1 16 81 256 625 33 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson 5. Grafik, bilder och ljud (P2) Avsnittet bygger vidare på avsnitt 4 och fördjupar konskaperna om grafiska objekt och komponenter. Innehållet anknyter till kapitel 5 i Java-javisst!. Klassen JPanel Här här grundkoden för ett program med klassen JPanel som skapar panelen till höger på en JFrame som grundplatta. JFrame-objektet har BorderLayout (inte FlowLayout) som standard, varför panelen fyller ut hela JFramen: import javax.swing.*; import java.awt.*; public class MinJPanel extends JPanel { public MinJPanel () { this.setBackground(Color.red); } public static void main(String[] args) { JFrame f = new JFrame(); f.setSize(400, 300); //Storlek f.setLocation(100,100); //Placering f.setTitle("Min JPanel!"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); MinJPanel p = new MinJPanel (); f.add(p); f.setVisible(true); } } Panelen kan nu användas som grundplatta för olika typer av objekt. JPanel som rityta Klassen Graphics innehåller många olika typer av ritbojekt såsom linjer, rektanglar, cirklar, polygoner och text som kan ritas på panelen. Följande kod visar ett exempel på en yta ritar en rektangel och en text i metoden paintComponent(Graphics g): import javax.swing.*; import java.awt.*; public class MinJPanel extends JPanel { public MinJPanel () { this.setBackground(Color.yellow); } public void paintComponent(Graphics g){ super.paintComponent(g); g.drawRect(50,75,100,50); g.drawString("Text på panelytan",20 , 30); } public static void main(String[] args) { JFrame f = new JFrame(); f.setSize(300, 200); f.setLocation(100,100); f.setTitle("Min JPanel!"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); MinJPanel p = new MinJPanel (); f.add(p); f.setVisible(true); } } 875099958 34 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Färger, text och figurer Det finns både klasser och metoder för inställnig av RGB-färg och text. Följande ändringar i metoden paintComponent(Graphics g) justerar texten, samt ger olika färg på texten och den fyllda cirkeln: public void paintComponent(Graphics g){ super.paintComponent(g); Color c=new Color(255,0,255); g.setColor(c); g.fillOval(100,50,100,100); Font f=new Font("Arial",Font.BOLD,24); g.setFont(f); c=new Color(255,0,0); g.setColor(c); g.drawString("Text på panelytan",20,30); } Följande metoder finns för klassen Graphics: drawLine(x1,y1,x2,y2); //Ritar en linje mellan koordinaterna (x1, y1) och (x2, y2) drawRect(x,y,b,h); //Ritar en rektangel med övre vänstra hörnet i (x, y), bredd b och höjd h fillRect(x,y,b,h); //Fyller rektangeln drawRoundRect(x,y,b,h,m,n) //Rektangel med rundade hörn, där m och n anger rundning fillRoundRect(x,y,b,h,m,n) //Fyller rundad rektangel draw3DRect(x,y,b,h,upp) //Tredimensionell rektangel, upp är true eller false fill3DRect(x,y,b,h,true/false) //Ger en (svag) tredimensionell effekt false/true=upp/ner drawOval(x,y,b,h) //Ritar en oval fillOval(x,y,b,h) //Fyller en oval drawArc(x,y,b,h,s,l) //Ritar en båge, där s är startpunkt ock I slitpunkt I grader drawPolygon(xp,yp,n) //Ritar en polygon. Koordinaterna (n st) ligger i fälten xp och yp fillPolygon(xp,yp,n) //Fyller polygonen drawString(”Lite text”,x,y) //Skriver ut ”Lite text” till höger om koordinaten x,y this.getWidth(), this.getHeight() //Ger panelens bredd respektive höjd fillArc( x,y,b,h,u,v); //Fyller en sektor med centrumvinkeln v med början vid vinkeln u (grader) repaint(); //Ritar om panelen (utan g. framför) Övning 2.1-Övning 2.8: Övningarna finns här på s.44 nedan. Visa bilder Med klassen ImageIcon kan följande kod visa bilder (.jpg, .gif) i originalstorlek i javaprogram: public class VisaBild extends JPanel { ImageIcon jumbo; public VisaBild () { jumbo = new ImageIcon("jumbo.gif"); this.setBackground(Color.white); } public void paintComponent(Graphics g){ super.paintComponent(g); jumbo.paintIcon(this, g, 50, 50); //Bildens vänstra hörn har koordinaten (50, 50) } 875099958 35 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Rekursion Med begreppet rekursion i datasammanhang menas en procedur eller funktion som anropar sig själv. Rekursion användas för att åtstadkomma upprepningar där det är svårt att använda loopar, exempelvis används det ofta vid beräkning och uppritning av s k fraktaler (mer om detta senare). I följande exempel beräknas summan 1+2+3+4+5 först på ett traditionellt iterativt sätt med en for-loop och sedan med en rekursiv funktion: import java.util.Scanner; public class reksum{ public static int summa(int n) { int sum=0; for (int i=1;i<=n;i++) sum=sum+i; return sum; } //metod summa(n) för summering med iteration public static void main(String[] args){ Scanner sc = new Scanner(System.in); int n; System.out.print("Ange ett heltal: "); n = sc.nextInt(); System.out.print("Summan="+summa(n)); } } Samma summering görs igen, men med den rekursiva metoden rsumma(n); import java.util.Scanner; public class reksum{ public static int rsumma(int n) { if (n==1) return 1; else return n+rsumma(n-1); } //rekursiva metoden rsumma(n) för summering //Förklara hur funktionen fungerar! //Funktionen anropar sig själv (=rekursion) public static void main(String[] args){ Scanner sc = new Scanner(System.in); int n; System.out.print("Ange ett heltal: "); n = sc.nextInt(); System.out.print("Summan="+reksumma(n)); } } Övning 0.5.1: Talföljden 1, 1, 2, 3, 5, 8, 13, 21…är de första åtta talen i Fibonaccis talföljd. Skriv ett program (det ovan i exemplet) med en metod fib(n) som beräknar det n:te fibonaccitalet med en: a) Iterativ metod. b) Rekursiv metod. Programmet ska i båda fallen ha utskrifterna: Ange ett heltal: 7 Motsvarande fibonaccital är 13 875099958 36 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Övning 0.5.2: Skriv en funktion fak(n) som beräknar produkten 1234… n. Produkten kallas fakultet. Funktionen skall anropas rekursivt och sakna loopar. Programmet har utskriften: Ange ett heltal: 4 Fakulteten är 24 Övning 0.5.3: Skriv en metod roten(x1, x2) som beräknar en funktions nollställe (skärning med x-axeln) med intervallhalvering. Det fungerar på följande sätt: Proceduren roten(x1, x2) anropas med två värden, ett x-värde till vänster (x1) om nollstället och ett x-värde (x2) till höger om nollstället (se figuren). Metoden räknar sedan ut x-värdet (xmitt) mitt emellan x1 och x2, och kollar därefter om funktionen skär xaxeln mellan x1 och xmitt eller mellan xmitt och x2. Funktionen skär x-axeln emellan x1 och xmitt om produkten av funktionsvärdena för x1 och xmitt är negativ. Då anropas proceduren rekursivt: y y x1 x x2 xmitt roten(x1, xmitt) Skär funktionen i det andra intervallet blir anropet: roten(xmitt, x2) Detta pågår tills intervallet är godtyckligt litet, t ex när differensen abs(x2 - x1) < 0,00001 om man vill ha fem siffrors noggrannhet i roten. Metoden returnerar då xmitt. Förslagsvis beräknas funktionsvärdet i en separat metod f(x). Programmet skall fungera som exemplet I detta och följande två exempel används funktionen y = 2 - x2, som har rötterna 2 1,41421... Prova gärna med andra funktioner. Vilka rötter har t ex funktionen y = sin(x) ? Programmet har utskriften: Ange ett intervallgränserna x1 och x2: 1 5 Kvadratroten ur 2 är 1.4142112731933594 Rätt värde är 1.414213562 Övning 0.5.4: Intervallhalvering har dålig konvergens vid rotberäkning, d v s det krävs många beräkningar (intervallhalveringar) för att få fram ett bra värde på roten Modifiera föregående program så att det skriver ut xmitt-värdet vid varje intervallhalvering i metoden roten(…). *Övning 0.5.5: Newton-Raphsons metod för rotberäkning är betydligt effektivare än intervallhalvering. Om roten x söks i ekvationen: 0 f ( x) Beräknas roten med följande iterationsformel: f ( x1 ) , x2 x1 f ( x1 ) Iterationen pågår tills tillräcklig noggrannhet erhålls, exempelvis när följande villkor är uppfyllt: x1 x 2 0,000001 y y x1 x2 Newton-Raphsons metod bygger på att tangenten f´(x1):s skärning med x-axeln (x2) beräknas upprepade gånger. Skriv ett program med en metod raphson(x1, x2) som skriver ut x-värdet vid varje intervallhalvering. 875099958 37 Brogårdsgymnasiet x LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Grafik med rekursion Grafik kan ibland vara enklare att rita med rekursiva metoder än med iterativa. Viss typ av grafik, exempelvis s.k. fraktaler, är nästan bara möjlig att rita med rekursiva metoder, som vi ska se nedan. Inledningsvis ett programexempel med en enkel rekursiv grafisk metod rita(Graphics g,int n,int x, int y) som skriver ut värdet av en variabel n diagonalt i en panel. Observera att metoden inte returnerar något värde (void): import javax.swing.*; import java.awt.*; public class rekfyrkant extends JPanel { public rekfyrkant () { this.setBackground(Color.white); } public void rita(Graphics g,int n,int x, int y){ if (n>=1){ g.drawString("Nr="+n,x,y); rita(g,n-1,x+50,y+50); } } public void paintComponent(Graphics g){ super.paintComponent(g); rita(g,4,20,20); } public static void main(String[] args) { JFrame f = new JFrame(); f.setSize(250, 250); f.setLocation(200,100); f.setTitle("Bengt"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); rekfyrkant p = new rekfyrkant (); f.add(p); f.setVisible(true); } } Strukturer och mönster som i någon mening upprepar sig förekommer på många ställen i naturen, t ex strukturen hos ormbunksbladet, snöflingan och grenverket hos ett träd. Även mönstret hos kustlinjen på en karta upprepar sig på ett regelbundet sätt om kartan studeras i olika skalor. Dessa upprepande eller självliknande mönster kallas alltså fraktaler. 875099958 38 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Cantor-mängden Ett enkelt fraktalt mönster är den s.k. Cantormängden (se figur), efter den rysk-tyske matematikern Georg Cantor. Det är en linje som ritas upprepade gånger, men där 1/3 av linjen plockas bort för varje ritning. I figuren är linjen ritad tio gånger, men redan efter sex uppritningar begränsar upplösningen bildkvaliteten. Fraktala mönster ritas nästan uteslutande med rekursiva metoder och kan därför ofta ritas med relativt enkel programkod, trots att mönstren förefaller komplicerade. Cantormängden ovan är ritad med följande programkod: public void rita(Graphics g,double x1,double x2, int y,int n){ double x3, x4; g.drawLine((int)Math.round(x1),y,(int)Math.round(x2),y); if (n > 1){ x3 = x1+(x2-x1)/3; x3 x1 x4 = x2-(x2-x1)/3; rita(g,x1,x3,y+10,n-1); rita(g,x4,x2,y+10,n-1); } } public void paintComponent(Graphics g){ super.paintComponent(g); rita(g,10,400,10,7); } x4 x2 Figuren ovan förklarar variablerna i programmet. Linjen x1-x2 är den första (understa) linjen som ritas i cantormängden ovan. Linjerna x1-x3 och x4-x2 är den andra linjen som ritas med tredjedelen i mitten borttagen. Linjerna ritas via 7 rekursiva anrop av proceduren rita, d v s proceduren anropar sig själv. Övning 0.5.6: Kopiera koden ovan och rita cantormängden. Programmet skall fungera som exemplet cantor.jar. n=2 n=0 Övning 0.5.7: n=1 Gör ett program som ritar Sierpinski-triangeln, efter den polske matematikern Waclav Sierpinski, d.v.s. en triangel som delar upp sig i ett antal mindre trianglar genom att mittpunkterna på triangelns sidor förbinds med linjer. I figuren till höger visas de tre första trianglarna. Programmet skall fungera som exemplet sierpinski.jar, där n=5. Övning 0.5.8: Modifiera föregående program så att trianglarna istället fylls med slumpmässiga färger, enligt exemplet sierpinski_fylld.jar. Vid uppstarten ritas två delningar (n=2). Sedan väljs antal delningar i inmatningsrutan. Omritning sker med metoden repaint(); i metoden: public void actionPerformed(ActionEvent e) 875099958 39 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Koch-kurvan Ett annan relativt enkel fraktal kurva är Koch-kurvan, efter den svenske matematikern Helge von Koch. Den skapas med en generatorfigur (exempelvis hattfunktionen i urklippet nedan) som upprepas på sig själv, d v s varje rak linje blir en ny mindre hatt. I urklippet till höger visas kurvan för olika värden på antal upprepningar. Följande rekursiva metod rita ritar Koch-kurvan, dock upp och ned vänd, eftersom y-axeln pekar nedåt i vårt koordinatsystem: public void rita(Graphics g,double x1,double y1,double x2,double y2,double hf,double ff, double v, int n){ double x3, y3, x4, y4, x5, y5, x6, y6, s, f, h; if (n == 1) g.drawLine((int)Math.round(x1),(int)Math.round(y1),(int)Math.round(x2),(int)Math.round(y2)); else{ s = Math.sqrt((x2 - x1)*(x2 - x1) + (y2 - y1)*(y2 - y1)); f = ff * s; (x4, y4) (x5, y5) h = hf * s; h x3 = x1 + f * Math.cos(v); y3 = y1 + f * Math.sin(v); f (x2, y2) f (x1, y1) x6 = x2 - f * Math.cos(v); (x6, y6) (x3, y3) y6 = y2 - f * Math.sin(v); x4 = x3 + h * Math.cos(v+ Math.PI/2); y4 = y3 + h * Math.sin(v + Math.PI/2); x5 = x6 + h * Math.cos(v + Math.PI/2); y5 = y6 + h * Math.sin(v + Math.PI/2); rita(g,x1, y1, x3, y3, hf, ff, v, n-1); rita(g,x3, y3, x4, y4, hf, ff, v + Math.PI/2, n-1); rita(g,x4, y4, x5, y5, hf, ff, v, n - 1); rita(g,x5, y5, x6, y6, hf, ff, v - Math.PI/2, n-1); rita(g,x6, y6, x2, y2, hf, ff, v, n-1); } } public void paintComponent(Graphics g){ super.paintComponent(g); rita(g,10,50,400,50,0.3,0.4,0,3); } Beteckningarna visas i figuren, där s är avståndet mellan ändpunkterna 1 och 2. Parametrarna hf och ff anger hur stor andel av s sträckan f (flanken) respektive h (höjden) skall vara (testa med olika värden!). Parametern v (som här endast kan anta vinkelvärdena 0 och ±/2) anger hur en linje skall ritas (lodrät eller vågrät). Övning 0.5.9: Kopiera koden ovan och rita Koch-kurvan. Programmet skall fungera som exemplet kochkurva.jar. Urklippet till höger är ritat för n=5. Rita för olika värden på n, hf och ff. Vad händer om ff=0,5? Modifiera gärna så att n kan anges via inmatningsruta. 875099958 40 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson *Övning 0.5.10: Modifiera koden i föregående uppgift så, att Koch-kurvan istället ritas med en trekantig ’hattfunktion’ (se bild). Sätt hf=ff=0,333, samt vridningsvinkeln till ±/3 istället för ±/2. Programmet skall fungera som exemplet kochtri.jar. Ormbunksblad Utseendet hos blad och träd är i viss mån fraktalt. Mönstret hos den ormbunksliknande figuren till höger upprepas i sina detaljer och är därför enkel att rita med en rekursiv funktion. Programmet nedan visar koden: public void rita(Graphics g,double x1,double y1,double d,double vinkel,double delta) { double x2, y2, v; 60o v = Math.PI*vinkel/180; 60o x2 = x1 + d * Math.cos(v); x2, y2 y2 = y1 + d * Math.sin(v); if (Math.abs(x1 - x2) > delta || Math.abs(y1 - y2) > delta) { d g.drawLine((int)x1,(int)y1,(int)x2,(int)y2); vinkel rita(g,x2,y2,d * 0.83,3 + vinkel,delta); rita(g,x2,y2,d * 0.3,vinkel - 60, delta); rita(g,x2, y2, d * 0.3, 3 + vinkel + 60, delta); x1, y1 } } public void paintComponent(Graphics g){ super.paintComponent(g); rita(g,200,10,90,90,0.1); } Genom att variera värdet på vinklarna, reduceringsfaktorerna (0,83 och 0,3) och delta (upplösningen) kan utseendet på figuren förändras. ’Starrstrået’ till höger är ritat med reduceringsfaktorerna 0,5; 0,35; 0,35 och de fasta vinklarna 0 och 30 grader, samt parametrarna i anropet är d=250 och delta=0,4. Övning 0.5.11: Kopiera koden ovan och rita bladet. Programmet skall fungera som enligt exemplet blad.jar. Parametrarna d och delta kan anges i inmatningsrutorna. Observera startvärdena. Gör gärna även inmatningsrutor för reduceringsfaktorerna och de fasta vinklarna. 875099958 41 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Mandelbrotmängden Benoi Mandelbrot är en fransk matematiker som på 1970-talet upptäckte den nu s.k. mandelbrotmängden. Mängden konstrueras genom att upprepade gånger beräkna z n 1 z n2 c tills beloppet på det komplexa talet z blir stort (>100000) för slumpmässiga värden på talet c. När och om villkoret är uppfyllt avbryts iterationen. En svart pixel ritas i koordinaten för c om (en variant är att välja en färg utifrån värdet på n) villkoret inte uppfylls innan n<200. Då avbryts beräkningen och talet tillhör mandelbrotmängden. Talen z och c är alltså komplexa tal, d.v.s. z = x+iy respektive c = cx+icy, där i2 = -1. Startvärdena för x och y är 0, och de slumpmässiga värdena på c:s imaginär och realdel ligger i intervallen -2<cx<2 respektive -2<cy<2. För att få med hela ’päronfiguren’ räcker dock om -2,03<cx<0,52 respektive 1,2<cy<1,2, enligt koden nedan. Provkör programmet som ritar figuren ovan, mandelbrot.jar. Programkoden är här, som inte är rekursiv: public void paintComponent(Graphics g){ super.paintComponent(g); double x1, y1, x2, y2,s,x,y,cx=-2.03,cy=-1.2; int n; boolean go = true; while (cx < 0.52){ cx = cx + 0.002; cy = -1.2; while (cy < 1.2){ x1 = 0; y1 = 0; cy = cy + 0.002; n = 0; s = 0; while (s < 100000 && n <= 200){ x2 = x1*x1 - y1 *y1 + cx; y2 = 2 * x1 * y1 + cy; x1 = x2; y1 = y2; s = x1*x1 + y1*y1; n = n + 1; } if (n >= 8 && n <= 200 && n%2==0){ //Villkor för att pixel ritas, endast vitt och svart. x=800/2.55*(cx+2.03); //Skalning i x-led y=600/2.4*(cy+1.2); //Skalning i y-led g.drawLine((int)x,(int)y,(int)x,(int)y); //Ritar en punkt } } } } Övning 0.5.12: Kopiera koden ovan och rita mandelbrotmängden ovan. Modifiera gärna programmet så att det blir olika färger för olika maxvärden på n, d.v.s. antal iterationer innan det konvergerar. I exemplet ritas endast svarta punkter för jämna värden på n. En annan variant är också att ändra intervallet på det imaginära c för att zooma. 875099958 42 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Övning 0.5.13: Skriv ett program som ritar sektorer med vinklar inmatade i tre textrutor, enligt urklippet till höger. Vinklarna ska skrivas ut i respektive sektor. Programmet ska fungera som exemplet sektor.jar. Övning 0.5.14: Skriv ett program som ritar ut en jpg-bild på tio slumpmässiga ställen på panelen. De slumpmässiga koordinaterna anpassar till panelens storlek när den ändras med hjälp av metoderna this.getWidth() och this.getHeight(). Välj förslagsvis en egen bild med förslagsvis storleken 100x100 pixlar. Programmet skall fungera som exemplet icon.jar, som anropar bildfilen aa.jpg. Fullskärmsläge Följande tre rader i main-metoden öppnar fönstret i fullskärmsläget: public static void main(String[] args) { JFrame f = new JFrame(); GraphicsEnvironment localEnvironment =GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice defaultDevice = localEnvironment.getDefaultScreenDevice(); defaultDevice.setFullScreenWindow(f); //f.setSize(700, 700); //f.setLocation(300,100); … 875099958 43 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Ljud Med följande kod kan ljudfiler av formatet .wav och .au startas och spelas en gång. Filerna läggs i projektmappen. import javax.swing.*; import java.applet.*; public class SpelaLjud extends JPanel { AudioClip ac; public SpelaLjud() { try{ ac = Applet.newAudioClip(new java.net.URL("file:horn.wav")); } catch(Exception exc){ System.out.println("Hittar ej"); } ac.play(); } Uppspelningen loopas med ac.loop() och stoppas med ac.stop(). Övning 0.5.15: Skriv ett program med två knappar som byter färg på bakgrunden och samtidigt startar respektive stoppar ett ljud, förslagsvis au.laser på Java-javisst! hemsida. Layouten kan se ut som urklippet till höger. Programmet skall fungera som exemplet ljud.jar, som anropar en fil med namnet horn.wav. 875099958 44 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Egna grafiska klassen Cirkel Ibland är det praktiskt att göra en egen klass för ett grafiskt objekt, vilket illustreras med följande exempel. Först visas ett program EnCirkel som ritar en cirkel. Sedan ritas cirkeln igen av programmet VisaCirkel, men då definierad som ett objekt via den egna klassen Cirkel. Här är programmet EnCirkel som ritar cirkeln: import javax.swing.*; import java.awt.*; public class EnCirkel extends JPanel { int xpos, ypos, diam; public EnCirkel () { xpos = 40; ypos = 50; diam = 60; this.setBackground(new Color(0,0,255)); } public void paintComponent(Graphics g){ super.paintComponent(g); g.setColor( new Color(255,225,0) ); g.fillOval(xpos, ypos,diam, diam ); } public static void main(String[] args) { JFrame f = new JFrame(); f.setSize(230, 230); f.setLocation(100,100); f.setTitle("EnCirkel"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); EnCirkel p = new EnCirkel(); f.add(p); f.setVisible(true); } } Här är programmet VisaCirkel som ritar ut två cirklar med hjälp av klassen Cirkel, i rutan till höger om programmet: import javax.swing.*; import java.awt.*; public class VisaCirkel extends JPanel { private Cirkel c1, c2; public VisaCirkel () { c1 = new Cirkel(20, 40, 60); c2 = new Cirkel(110, 100, 80); this.setBackground(new Color(0,0,255)); } public void paintComponent(Graphics g){ super.paintComponent(g); c1.visa(g); c2.visa(g); } public static void main(String[] args) { //Samma kod som föregående program … } } //klassen Cirkel import java.awt.*; public class Cirkel { private int xpos, ypos, diam; public Cirkel( int x, int y, int d ) { xpos = x; ypos = y; diam = d; } public void visa(Graphics g) { g.setColor( new Color(255,225,0) ); g.fillOval(xpos, ypos,diam, diam ); } } Klassen Cirkel innehåller instansvariabler för cirkelns hörnkoordinat och diameter (sida), en konstruktor för klassen, samt en metod visa(g) som ritar en cirkel. Fördelen med att använda klassen Cirkel är att det förenklar om flera cirklar ska ritas, samt att den som använder programmet VisaCirkel inte behöver förstå hur 875099958 45 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson de grafiska metoderna fungerar. Följande program VisaCirklar ritar ut tio slumpmässigt placerade cirklar med hjälp av klassen Cirkel ovan: import javax.swing.*; import java.awt.*; public class VisaCirklar extends JPanel { public VisaCirklar () { this.setBackground(new Color(0,0,255)); } public void paintComponent(Graphics g){ super.paintComponent(g); Cirkel[] c=new Cirkel[10]; for (int i=0;i<=9;i++) c[i]=new Cirkel((int)(200*Math.random()), (int)(200*Math.random()),60); for (int i=0;i<=9;i++) c[i].visa(g); } public static void main(String[] args) { JFrame f = new JFrame(); f.setSize(250, 250); f.setLocation(100,100); f.setTitle("VisaCirklar"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); VisaCirklar p = new VisaCirklar(); f.add(p); f.setVisible(true); } } I exemplet ovan skapas tio unika cirkelobjekt via en vektor. Ett enklare sätt är att skriva klassen Cirkel utan konstruktor och istället läsa in koordinaterna via visametoden. Uppgiften med gubben nedan ska göras så. Övning 0.5.16: Lägg till metoden visa(g, f) till klassen Cirkel, där parametern f är ett heltal (0-3) som anger en färg: 0: röd, 1: grön, 2: gul och 3: blå. Cirkeln fylls sedan med den färgen. Programmet skall fungera som exemplet VisaCirklarCol.jar. Övning 0.5.17: Skriv en klass Gubbe som med metoden visa(Graphics g, int x, int y, int diam) ritar ut en gubbe med en fylld cirkel med diametern diam som huvud, samt kropp, armar och ben med streck. Koordinaterna x och y anger huvudets övre vänstra punkt. Kroppen har samma längd som huvudets diameter, medan benens och armarnas ändpunkter ligger en radie utanför kroppen i x- och y-led. Klassen saknar konstruktor. Skriv även ett program visaGubbe.java som med klassen Gubbe ritar ur 10 slumpmässigt placerade gubbar med slumpmässigt värde på diametern. Programmet skall fungera som exemplet visagubbe.jar. 875099958 46 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Lite om animering och tangenthändelser När vi nu kan göra grafiska klasser och objekt är det ju roligt om objekten även kan röra på sig, samt om objekten kan styras på något sätt. Med gränssnittet KeyListener får man tillgång till några metoder som lyssnar på tangenterna: import java.awt.event.KeyEvent; import java.awt.event.KeyListener; Klickas på den röda markeringen i vänsterkanten infogas både ovanstående paket och följande tre tomma tangentmetoder: @Override public void keyPressed(KeyEvent e) { //Tom metod } @Override public void keyReleased(KeyEvent e) { //Tom metod } @Override public void keyTyped(KeyEvent e) { } Med metoden e.getKeyCode() fås tangentens kod (heltal), som för bokstavstangenterna är ASCIIkoden för motsvarande versal. För piltangenterna gäller följande koder: KeyEvent.VK_LEFT, KeyEvent.VK_RIGHT, KeyEvent.VK_UP och KeyEvent.VK_DOWN. Animeringen görs i mainmetoden med en oändlig loop och en fördröjning. Programmet till höger får en cirkel av klassen Boll att stanna när den når den högra fönsterkanten eller när tangenten ’S’ trycks ned. import javax.swing.*; import java.awt.*; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; public class VisaRektangel extends JPanel implements KeyListener { Boll b1; int x=200,y=400; static int xboll=100, steg=1; public void paintComponent(Graphics g){ super.paintComponent(g); b1.visa(g,xboll,100); } public static void main(String[] args) { JFrame f = new JFrame(); f.setSize(500, 500); f.setLocation(100,100); f.setTitle("Visa Rektangel"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); VisaRektangel p = new VisaRektangel(); f.add(p); f.setVisible(true); f.addKeyListener(p); //Lyssnar på panelen while (true) { f.repaint(); //Ritar om f xboll=xboll+steg; if (xboll+20>=p.getWidth()) steg=0; try { Thread.sleep(16); } catch (InterruptedException e) { e.printStackTrace(); } } } @Override public void keyPressed(KeyEvent e) { int tt = e.getKeyCode(); switch (tt) { case 'S': x=200; steg=0; break; } } } Övning 0.5.18: Skapa klassen Boll med klass-metoden visa(g,x,y), som ritar ut en grön cirkel med diametern 20 pixlar, samt kopiera in programmet VisaRektangel till höger så att det fungerar. 875099958 47 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Övning 0.5.19: Modifiera föregående program så att det har följande finesser: Bollen studsar mellan fönstrets höger och vänstersida. Bollens fart (steglängden) ökar åt höger med Htangenten och åt vänster med V-tangenten. Med S-tangenten stannar bollen. Programmet skall fungera som exemplet boll.jar. Övning 0.5.20: Modifiera föregående program ytterligare så att bollen studsar mot alla fyra ’väggarna’. Bollen fart uppåt (vertikalt) ökar med U-tangenten och minskat N-tangenten. Programmet skall fungera som exemplet studsboll.jar. Övning 0.5.21: Modifiera föregående program ytterligare så att bollen studsar mot den röda rektangeln som styrs med höger- och vänsterpilen. Rektangeln är ett objekt av klassen Rektangel och ritas med klassmetoden visa(g,x,y). Rektangeln har måtten 50x5 pixlar. Spelet har följande finesser: Missar rektangeln bollen så att den studsar mot nedre kanten räknas en miss. Tid och missar skrivs ut i panelen Programmet startar på 30 s och räknar ner till noll när det stoppas. Programmet kan omstartas med Stangenten. Bollens startläge i x-led slumpas, liksom hastigheten (steglängden). Programmet skall fungera som exemplet bollspel.jar. Övning 0.5.22: Skriv ett program som simulerar fritt fall med studs. Accelerationen fås genom att variera steglängden. Det ska även finnas en variabel för studskoefficienten, d.v.s. kvoten mellan farten före och efter studs. Börja med bollen, som anvävder klassen Boll. Lägg sedan gärna till gubben, som använder klassen Gubbe. Programmet omstartas med en tangenttryckning. Programmet skall fungera som exemplet frittfall.jar. 875099958 48 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Förslag på repetitionsuppgifter inför prov 2 i Programmering C (P2) Provet omfattar kapitel 5 (Grafik, bilder och ljud), rekursion och kapitel 6 (Applets). Repetera förslagsvis följande tidigare gjorda uppgifter: Kapitel 5: 2.3, 2.4, 2.5, 2.7, 2.8, 0.5.1, 0.5.3, 0.5.7, 0.5.13, 0.5.14, 0.5.15, 0.5.17, 0.5.20 Kapitel 6: 3.2 (s. 73) 875099958 49 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson 7. Mest om loopar och val (P1) I detta avsnittet fördjupar vi kunskaperna från avsnitt 1 om urval och loopar. Även klassen String tas upp. Avsnittet anknyter till kapitel 7 i Java-javisst!. Nästlade if-satser Vi vill ha ett program som automatiskt ger betyget när poängen på ett prov matas in. Antag att betygsgränsernas är följande: A: ≥30 poäng C: ≥20 poäng E: ≥10 poäng Följande program med nästlade if-satser matar ut rätt betyg: import java.util.*; public class nastlad{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); int x; System.out.print("Ange poängen: "); x = sc.nextInt(); //läser in heltal if (x>=30) System.out.print("Betyget är A"); else if (x>=20) System.out.print("Betyget är C"); else if (x>=10) System.out.print("Betyget är E"); else System.out.print("Betyget är F (ej godkänd)"); } } Utskrift och inmatning blir då: Ange poängen: 22 Betyget är C Övning 0.7.1: Skriv ett program som beräknar arean för en kvadrat, rektangel eller triangel. Programmet frågar vilken beräkning som ska göras, enligt följande utskrifter: Ska arean för en kvadrat (k), rektangel (r) eller triangel (t) beräknas? t Ange bas och höjd: 5 8 Triangelns area är 20 Övning 0.7.2: Skriv ett program som anger provbetyget för följande poänggränser: A: ≥60 poäng B: ≥50 poäng C: ≥40 poäng D: ≥30 poäng E: ≥20 poäng Poäng lägre än 20 ger betyget F. Programmet frågar vilken beräkning som ska göras, enligt följande utskrifter: Ange poängen: 32 Provbetyg: D 875099958 50 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Övning 0.7.3: Skriv ett frågeprogram (nastlad2) med fyra frågor som låter dig fortsätta så länge du svarar rätt, samt som räknar antal rätt svar, med följande utskrifter: Heter tredje största stad Malmö (j/n)? j Rätt! Antal poäng: 1 Är Sveriges högsta berg högre än 3000 m (j/n)? n Rätt! Antal poäng: 2 Heter Värmlands högsta berg Granberget (j/n)? j Rätt! Antal poäng: 3 Heter Sveriges tredje största sjö Hjälmaren (j/n)? n Rätt - du vann! Antal poäng: 4 Eller: Heter tredje största stad Malmö (j/n)? j Rätt! Antal poäng: 1 Är Sveriges högsta berg högre än 3000 m (j/n)? j Fel! Slutpoäng: 1 Hitta gärna på egna frågor och utöka antalet. Jämförelseoperatorer och logiska operatorer Olika typer av jämförelseoperatorer används bl a vid urval med if-satser. Operatorerna är desamma som i C++: < > <= >= == != && || ! Mindre än Större än Mindre än eller lika med Större än eller lika med Lika med Inte lika med (skiljt ifrån) Och Eller Icke Sammansatta villkor Om vi vill kolla om ett tal är större än 5 men mindre än 20 måste vi ha ett sammansatt villkor, enligt följande programrader: … System.out.print("Ange ett heltal: "); a = sc.nextInt(); if (a>5 && a<20) System.out.print("Talet ligger mellan 5 och 20 "); else document.write("Talet är mindre än 5 eller större än 20"); … 875099958 51 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Övning 0.7.4: Skriv klart programmet som kollar om ett heltal x ligger i intervallet 5 ≤ x ≤ 20, med följande utskrifter. OCH-operator && ska användas: Ange ett heltal x: 15 Talet ligger i intervallet Eller: Ange ett heltal x: 23: Talet utanför intervallet Övning 0.7.5: Skriv ett program som kollar om din längd x är kortare än 160 cm eller om du är längre än 190 cm, d.v.s. om x < 160 eller x >190, med följande utskrifter. ELLER-operator || ska användas: Ange din längd i cm: 195 Du är kortare än 160 eller längre än 195 cm Eller: Ange din längd i cm: 179 Din längd ligger mellan 160 och 190 cm Övning 0.7.6: Skriv ett program som läser in tre tal och som sedan skriver ut det största av talen. Om inget ensamt tal är störst skrivs detta ut, med följande utskrifter: Ange tre heltal: 7 8 3 Störst tal: 8 *Övning 0.7.7: Skriv ett program som läser in tre heltal och som sedan skriver ut talen i storleksordning med det minsta först, med följande utskrifter: Ange tre heltal: 7 8 3 I ordning: 3 7 8 *Övning 0.7.8: Skriv ett program som läser in tre heltal och som sedan kollar om något av talen är lika, alla lika eller alla olika. Ange tre heltal: 7 8 3 Alla olika Eller Ange tre heltal: 7 8 7 Två lika Eller Ange tre heltal: 7 7 7 Alla Lika 875099958 52 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Urval med Switch Genomgång av Switch-satsen på sidan 7 i kapitel 7 i Java-javisst!. Övning 0.7.9: Skriv ett program som läser in olika heltal och som ger följande utskrifter med switch-satser: 1: Du matade in en etta. 2: Du matade in en tvåa. 3: Du matade in en trea. Övriga heltal: Du matade in ett annat heltal. Exempel på inläsning: Ange ett heltal mellan 1 och 3: 2 Du matade in en tvåa. Eller Ange ett heltal mellan 1 och 3: 7 Du matade in ett annat heltal. Loopar I Java finns tre typer av loopar för upprepning: while do for Vi illustrerar de tre looparna med passande uppgifter. Vi börjar med while-loopen, som vi använt tidigare. Eftersom avbrottsvillkoret ligger före satserna som upprepas passar loopen för uppgifter där man i förväg inte vet antal upprepningar: double x=0; while(x<=5){ x=x+0.02; System.out.println("x=”+x); } I detta exempel skrivs x ut så länge x ≤ 5. I följande do-loop ligger avbrottskriteriet efter satserna som upprepas, : int i=1; do { i++; System.out.println("Detta är en do-loop"); } while (i<=5); do-loopen, som genomlöps minst en gång, används ofta i menyer. Följande for-loop används när antal varv i loopen är känt i förväg. Här skrivs delsumman ut fem gånger: int sum=0; for (i=1;i<=5;i++){ sum=sum+i; System.out.println("Summan är "+sum); } 875099958 53 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Övning 0.7.10: Skriv ett program som läser in en mening och som sedan skriver ut den fem gånger på egna rader, med följande utskrift: Ange en mening: Programmering är kul Programmering är kul Programmering är kul Programmering är kul Programmering är kul Programmering är kul Uppgiften ska lösas med en: a) while-loop b) do-loop c) for-loop Övning 0.7.11: Skriv ett program som med en for-loop beräknar summan av 1+2+3+4+…+n, där n matas in. Programmet har följande utskrifter: Ange n: 4 Summan är 10 Övning 0.7.12: Skriv ett program som med en for-loop beräknar produkten av 1∙2∙3∙4∙…∙n, där n matas in. Programmet har följande utskrifter: Ange n: 4 Produkten är 24 *Övning 0.7.13: Talföljden 1, 1, 2, 3, 5, 8, 13, 21…är de första åtta talen i Fibonaccis talföljd. Skriv ett program med en for-loop som beräknar det n:te fibonaccitalet med följande utskrifter: Ange n: 7 Motsvarande fibonaccital är 13 Övning 0.7.14: Skriv följande menystyrda program som låter dig välja mellan att addera, subtrahera, multiplicera och dividera decimaltal. Menyn ska ligga i en do-loop och urvalen göras med Switch-satser. --------------------------1: Addera 2: Subtrahera 3: Multiplicera 4: Dividera 5: Avsluta Ange en siffra: 2 Ange x och y: 8 3 Differensen är: 5.0 --------------------------1: Addera 2: Subtrahera 3: Multiplicera 4: Dividera 5: Avsluta Ange en siffra: 875099958 54 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Datatypen boolean Villkorssatsen i if eller while innehåller ofta villkor av typen if (x==5) eller while (x<10). Beroende på om villkoret är sant eller falskt händer något. Villkoret har faktiskt datatypen boolean som endast kan anta värdena true eller false. Följande rader för utskrift av fem Anders är ekvivalenta: int i=1; while(i<=5){ System.out.println("Anders"); i++; } Lite längre, men med den booelska variabeln go: int i=0; boolean go=true; while(go){ System.out.println("Anders"); i++; if (i==5) go=false; } Eller något kortare utan if-sats: int i=0; boolean go=true; while(go){ System.out.println("Anders"); i++; go=i==5; //Villkoret ger ett booelskt värde true eller false } De två exemplen visar hur en booelsk variabel används. Övning 0.7.15: Skriv ett program med en while-loop som läser in en ålder och som sedan skriver ut om du är myndig eller inte. Programmet avbryts om du matar in siffran 0, med följande utskrifter: Ange din ålder (avsluta med 0): 3 Du är inte myndig. Ange din ålder (avsluta med 0): 19 Du är myndig. Ange din ålder (avsluta med 0): 0 Programmet avslutat! Lös uppgiften med: a) Med åldern i while-villkoret. b) Med en booelsk variabel i while-villkoret. 875099958 55 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Övning 0.7.16: Skriv ett program som beräknar summan av två tal och som sedan frågar om en ny beräkning ska göras, med följande utskrift. Skriv ett tal: 4 Skriv ett tal till: 6 Summan är 10 Ny beräkning? j Skriv ett tal: 4 Skriv ett tal till: 2 Summan är 6 Skriv ett tal: 6 Antal inmatade tal: 1 Summan är 6.0 Största talet är 6 Minsta talet är 6 Medelvärdet är 6.0 Ny beräkning? N OK – hej då! Lös programmet med en do-loop. Radframmatning görs med "\n" i Skriv ett tal: 3 Antal inmatade tal: 2 Summan är 9.0 Största talet är 6 Minsta talet är 3 Medelvärdet är 4.5 System.out.println. Övning 0.7.17: Skriv ett program som läser in heltal > 0 och som skriver ut antal inmatade tal, summan av talen som matats in, största och minsta talet, samt medelvärdet av de inmatade talen. Inmatningen avbryts när talet 0 matas in. Programmet har utskrifterna till höger. Lös uppgiften på följande sätt: a) Skriv ett program som läser in heltal tills talet 0 matas in. Då skrivs ”Slut!” ut. Använd en do-loop. b) Skriv ut antalet inmatade tal. c) Skriv ut summan av de inmatade talen. d) Skriv ut det största inmatade talet. e) Skriv ut det minsta inmatade talet. f) Skriv ut medelvärdet av de inmatade talen. Även en radframmatning ska göras efteråt. 875099958 56 Skriv ett tal: 10 Antal inmatade tal: 3 Summan är 19.0 Största talet är 10 Minsta talet är 3 Medelvärdet är 6.333333333333333 Skriv ett tal: 3 Antal inmatade tal: 4 Summan är 22.0 Största talet är 10 Minsta talet är 3 Medelvärdet är 5.5 Skriv ett tal: 0 Slut! Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson 9. Arrayer, sortering och strängar Hittills har vi deklarerat en ny variabel för varje tal eller tecken som lagras i våra program. Ska programmet hantera många variabler är det mer praktiskt att deklarera en array, som i princip kan lagra hur många värden (tal, tecken eller strängar) som helst. I detta kapitlet ska vi först lära oss att hantera arrayer, som även kallas vektorer och fält, och sedan använda dem för att sortera stora mängder tal och strängar. Array Antag att vi vill lagra fyra heltal i ett program. Hittills har vi gjort detta genom att deklarera fyra heltalsvariabler: int t1, t2, t3, t4; Ett enklare sätt är att lagra dem är i en array, som kan liknas vid en byrå med många lådor som är numrerade från 0, 1, 2,… Numren kallas ’lådans’ index. Eftersom varje index (låda) motsvarar ett heltal (eller ett tecken, sträng…) kallas en array för en indexerad variabel. En array x kan initieras på två sätt i Java: int[] x={100, 200, 255, 187}; //Kallas hakparenteser och klamrar, krullparanteser eller måsvingar. Eller så här: index: 0 int[] x=new int[4]; //Anger antalet tal i arrayen. x[0]=100; //Det första indexet är alltid noll. x[1]=200; x[2]=285; x[3]=187; x: 100 1 2 3 200 285 187 Följande program läser in fem heltal och skriver sedan ut talen på en rad utan mellanslag: import java.util.Scanner; public class avrundning { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int[] x = new int[5]; System.out.println("Ange fem heltal:"); for (int i = 0; i <= 4; i++) x[i] = sc.nextInt(); for (int i = 0; i <= 4; i++) System.out.print(x[i]); } } Med utskriften: Ange fem heltal: 3 5 2 1 6 35216 875099958 57 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Övning 0.9.1: Kopiera och modifiera exemplet ovan som läser in fem heltal så att det får följande utskrifter: Ange fem heltal: Ange tal 1: 2 Ange tal 2: 7 Ange tal 3: 9 Ange tal 4: 23 Ange tal 5: 12 Du matade in följande tal: Tal 1=2 Tal 2=7 Tal 3=928 Tal 4=23 Tal 5=12 Övning 0.9.2: Modifiera föregående program så att det går att läsa in och skriva ut decimaltal. Övning 0.9.3: Modifiera föregående program så att det går att läsa in och skriva ut tecken: Ange fem tecken: Ange tecken 1: t Ange tecken 2: q Ange tecken 3: w Ange tecken 4: b Ange tecken 5: h Tecken 1=t Tecken 2=q Tecken 3=w Tecken 4=b Tecken 5=h Övning 0.9.4: Modifiera föregående program så att det går att läsa in och skriva ut strängar: Ange fem meningar: Ange en mening 1: Verbet gör något. Ange en mening 2: Adjektiv är något. Ange en mening 3: Substantiv är namn. Ange en mening 4: Predikat är vad som händer. Ange en mening 5: Subjekt är vem som händer. Mening 1: Verbet gör något. Mening 2: Adjektiv är något. Mening 3: Substantiv är namn. Mening 4: Predikat är vad som händer. Mening 5: Subjekt är vem som händer. Övning 0.9.5: Skriv ett program som genererar 4 slumptal mellan 0 och 1. Samma slumptal ska sedan användas för att beräkna 4 hela slumptal mellan 0 och 10, respektive mellan 1 och 6, med följande utskrifter: 0-1: 0.8806355145001596 0.322825002066638 0.6216970739588585 0.3003654222227192 0-10: 9 3 6 3 1-6: 6 2 4 2 875099958 58 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson *Övning 0.9.6: Du ska nu skriva ett program Minnestest.java som slumpar sex heltal mellan 1 och 9. Efter att talen visats i fem sekunder försvinner de från konsolen, d.v.s. matas fram 25 rader, och du ska komma ihåg dem och mata in dem med enter-tangenten. Efter att det sista talet matats in jämförs de slumpade med de inmatade talen för att kolla om du matat in rätt tal. Utskrifterna är följande: 9 5 5 1 1 2 (Visas i 5 sekunder) Mata in talen med Enter emellan! 9 5 5 1 1 2 Rätt svar :) Alternativt: Fel svar :( Rätt svar: 9 5 5 1 1 2 En fördröjning på fem sekunder (5000 ms) åstadkomms med följande program Minnestest: public class Minnestest { public static void main(String[] args) throws Exception { System.out.println("Vänta!"); Thread.sleep(5000); System.out.print("Nu har det gått tre sekunder"); } } Kopiera och provkör programmet med fördröjningen. Lös sedan uppgiften genom att modifiera programmet. Öka gärna till fler än sex tal att komma ihåg. Övning 0.9.7: Föregående övning förenklas något om följande färdiga metod för att jämföra de två vektorer a och b används: Arrays.equals(a,b) Är vekorerna lika har metoden värdet true, annars false. Den färdiga klassen Arrays finns i paketet import java.util.Arrays. Gör ändringen och provkör. Övning 0.9.8: Även objekt som knappar (JButton) kan läggas i en array. Skriv ett program som skapar tio knappar och en label. När en knapp klickas skrivs knappens nummer ut i labeln, enligt exemplet knappar2.jar. Knapparna skapas som vektorobjekt med följande referensdeklaration… JButton b[]=new JButton[10]; … i början av programmet. I programmets konstruktor skapas de fem knappobjekten med satsen: for (int i=0;i<=9;i++) b[i] = new JButton("Knapp "+i); Skriv även koden för utskriften i metoden actionPerformed(ActionEvent e). 875099958 59 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Programmets lösning visas på följande sida, utan de importerade paketen: public class Knappar extends JFrame implements ActionListener { JButton b[] = new JButton[10]; JLabel lbl; String namn; public Knappar() { this.setLayout(new FlowLayout()); lbl = new JLabel("Detta är en JLabel!"); for (int i = 0; i <= 9; i++) b[i] = new JButton("Knapp " + i); for (int i = 0; i <= 9; i++) { add(b[i]); b[i].addActionListener(this); } add(lbl); } public void actionPerformed(ActionEvent e) { for (int i = 0; i <= 9; i++) if (e.getSource() == b[i]) lbl.setText("Du klickade på knapp " + i); } public static void main(String[] args) { Knappar f = new Knappar(); f.setSize(200, 250); f.setLocation(100, 100); f.setTitle("Knappar"); f.setDefaultCloseOperation(Knappar.EXIT_ON_CLOSE); f.setVisible(true); } } Övning 0.9.9: Nu ska föregående uppgift modifieras så att bakgrundsfärgen ändras via fem knappar, enligt exemplet knappfarg.jar. För att framens bakgrundsfärg ska kunna ändra måste följande variabel deklareras som en global klassvariabel: static Container fc; I main-metoden får variabeln sitt värde: fc = f.getContentPane(); Det inledande ordet static måste anges eftersom variablen finns med i main-metoden, som exekveras först när programmet startas. Färgen ändras sedan i actionPerformed-metoden med följande sats: fc.setBackground(Color.yellow); 875099958 60 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Sortering Vi har tidigare (kapitel 7) sorterat tal i storleksordning och namn i bokstavsordning. Om ni minns så var det ganska krångligt att göra det med endast tre tal eller namn. När vi nu skall sortera fem och kanske hundra tal måste vi därför använda oss av en vektor och en enkel sorteringsalgoritm. Följande algoritm, kallad bubbelsort, sorterar här innehållet i heltalvektorn x[i] med fem heltal i stigande ordning: for (int i = 0; i <= 3; i++) { for (int j = i + 1; j <= 4; j++) { if (x[i] > x[j]) { temp = x[i]; x[i] = x[j]; x[j] = temp; } } } Den klassiska bubbelsort-algoritmen fungerar på följande sätt: 1. Vektorns första tal (i=0) järmförs med med de övriga talen i vektorn från indexet i=1 till det största indexet. 2. Om det första talet är större vid en jämförelse byts talen. 3. När det första talet jämförts med alla talen ligger det minsta talet först i vektorn. 4. Därefter jämförs det andra talet (i=1) i vektorn med de övrigs talen i vektorn från indexet i=2 till det största indexet. 5. När vektorns andra tal jämförts med de övriga talen ligger det näst lägsta talet i vektorns andra position. 6. När processen ovan upprepats för de övriga talen ligger talen sorterade i vektorn med det lägsta först och högsta sist. Algoritmen fungerar även för decimaltal och strängar. Övning 0.9.10: Skriv med hjälp av sorteringsalgoritmen ovan programmet Sortering.java som genererar fem slumptal mellan 1 och 10 och som skriver ut slumptalen både osorterasde och sorterade, med följande utskrift: Slumptal: 1 8 3 7 8 Sorterade: 1 3 7 8 8 Övning 0.9.11: Modifiera programmet så att tio slumptal mellan 1 och 10 skrivs ut osorterade och sorterade med följande utskrift: Slumptal: 9 1 10 2 9 5 7 1 5 3 Sorterade: 1 1 2 3 5 5 7 9 9 10 875099958 61 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Mer om strängar Vi har tidigare använt strängar (datatypen String). För att kunna sortera strängar (exempelvis namn), måste vi dock känna till följande metoder för strängar: str.length() str.charAt(n) str.compareTo(str2) //ger antalet tecken i str //ger tecknet i position n //ger 0 om str = str2 , <0 om str kommer före str2, annars >0 Det går attså inte att jämföra två strängar med olikstecken (<, > eller =). I kapitel 1 nedan finns fler metoder för strängar. Övning 0.9.12: Skriv ett program Stringrader.java som läser in ett ord och som sedan skriver ut bokstäverna på egna rader: Ange ett namn: kalle k a l l e Övning 0.9.13: Skriv ett program som läser in två namn och som skriver ut namen i stigande bokstavsordning, med följande utskrift: Ange ett namn: kalle Ange ett namn till: anders I stigande ordning: anders kalle Övning 0.9.14: Skriv ett program som läser in fem namn och som skriver ut namen i stigande bokstavsordning, med följande utskrift: Hur många namn ska matas in: 4 Ange namn 1: kalle Ange namn 2: eva Ange namn 3: anna Ange namn 4: linda I bokstavsordning: anna eva kalle linda 875099958 62 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson 13. Animering och trådar Här bygger vi vidare på animeringar, som vi berörde i kapitel 5. I slutet på kapitlet kommer vi även att animera med trådar. Innehållet bygger på kapitel 13 i Java-javisst!. Timer En timer är här klassen Timer(tid, this) som i konstruktorn anropar metoden actionPerformed(ActionEvent e) upprepade gånger efter en viss angiven tid i millisekunder. Klassen har även metoderna start() och stop() för att starta respektive stoppa timern. Följande kod flyttar en fyrkant över skärmen. Kopiera och kör den! import java.awt.Color; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.Timer; public class Fyrkant extends JPanel implements ActionListener { Timer t; //t är referens till klassen Timer int x=10, y=10; public Fyrkant() { t= new Timer(100,this); //Ett nytt Timer-objekt t skapas, som anropar metoden t.start(); //actionPerformed var 100:e millisekund. Startas här. setBackground(Color.white); } public void paintComponent(Graphics g) { super.paintComponent(g); //Vad händer om super.paintComponent kommenteras bort? //g.setColor(Color.cyan); x++; y++; g.fillRect(x, y, 30, 30); } public void actionPerformed(ActionEvent e) { repaint(); } public static void main(String[] args) { JFrame f = new JFrame(); f.setSize(200, 220); f.setLocation(100, 100); f.setTitle("Fyrkant"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Fyrkant p = new Fyrkant(); f.add(p); f.setVisible(true); } } Övning 0.13.1: Gör projektmappen kap13 i Eclipse och ladda ner de sex elefantbilderna från hemsidan för Java-javisst! dit. Gör/kopiera sedan programmet JumboFilm.java på s.4 som ’animerar’ elefantens rörelse när knappen klickas. Programmet ska fungera som exemplet JumboFilm.jar. För att jar-filen ska fungera måste den 875099958 63 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson laddas ned till en mapp där de sex elefantbilderna finns. Övning 0.13.2: Kopiera föregående program och klistra in det under namnet JumboFilm2.java. Elefanten ska nu röra sig när markören flyttar sig över panelen. Detta görs med gränssnittet MouseMotionListener och genom att lägga mousemotion-lyssnaren på panelytan med koden addMouseMotionListener(this), samt ’klicka in’ metoderna mouseMoved() och mouseDragged() och skriva in satsen repaint() i mouseMoved(). Programmet ska fungera som exemplet JumboFilm2.jar. Ta gärna bort knappen. Övning 0.13.3: Du ska nu skriva ett program så att elefanten tycks röra sig utan att knappen klickas. Detta åstadkoms med en Timer. Kopiera åter första övningen och klistra in den under namnet JumboFilmTimer.java, och modifiera den enligt koden på s. 5. Programmet ska fungera som exemplet JumboFilmTimer.jar. Ta gärna bort knappen. Övning 0.13.4: Modifiera föregående program så att elefantens rörelse kan stoppas och startas med en knapp, samt att dess fart kan ökas och minskas med två knappar, enligt urklippet till höger. Uppritningshastigheten ändras med fördröjningsmetoden t.setDelay(tid). Programmet ska fungera som exemplet JumboFilmTimerKnapp.jar. Observera att knapptexten Starta/Stopp ändrar sig när knappen klickas, vilket görs med metoden butt.setText("Stopp"). Övning 0.13.5: Skriv ett program som ritar en slumpmässig linje (myrans vandring), enligt exemplet Myran.jar. Rörelsen är slumpmässig uppåt, neråt, till vänster och höger och ritas från föregående linjes slutkoordinat. Linjen får inte ’rymma’ utanför ritytan. Timerns anropstid är 100 ms och ritytan har måtten 200 x 200 pixlar. Vad händer om den överskuggade (override) metoden super.paintComponent(g) kommenteras bort? Övning 0.13.6: Modifiera föregående övning så att en elefant (jumbo0.gif) rör sig slumpmässigt, enligt exemplet Elefanten.jar. 875099958 64 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Övning 0.13.7: Gör ett program som simulerar en sekundvisare på en klocka, enligt exemplet klockan.jar. Sekundvisaren ska alltså gå ett varv på 60 sekunder. Förse urtavlan med siffrorna 1-12 omedelbart utanför cirkeln, samt med en något kortare minutvisare som rör sig på lämpligt sätt. Övning 0.13.8: Modifiera föregående program så att klockan även har en minutvisare, samt gradering för timmarna, enligt exemplet klocka2.jar. I en senare övning gör vi om detta programmet till en egen klasss. 875099958 65 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Klasser och Timer I första programexemplet ovan flyttades en svart kvadrat diagonalt över panelen. Vi vill nu flytta ytterligare en kvadrat, men med en annan färg och hastighet. Då är det lämpligt att göra om programmet till en klass med instansvariabler för färg, och uppritningstid. Vi vill även att uppritningen ska börja i olika koordinater. För att åstadkomma detta gör vi en metod som anger startpunktens x- och y-koordinat. Här är klassen Fyrkantklass.java för en kvadrat: import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JPanel; import javax.swing.Timer; public class Fyrkantklass extends JPanel implements ActionListener { private Timer t; private int x, y, diam, tid; private Color farg; public Fyrkantklass(int panelbredd, Color f, int timetid) { diam = panelbredd; farg = f; tid = timetid; t = new Timer(tid, this); t.start(); setBackground(Color.white); this.setPreferredSize(new Dimension(diam, diam)); //Anger panelens storlek } public void set_xy(int xstart, int ystart) { x = xstart; y = ystart; } public void paintComponent(Graphics g) { super.paintComponent(g); g.setColor(farg); x++; y++; g.fillRect(x, y, 20, 20); } public void actionPerformed(ActionEvent e) { repaint(); } } Programmet som skapar två objekt av klassen Fyrkantklass visas nedan. Observera att varje objekt adderas till programmets panel liksom knappar och och textrutor, men att kvadraternas koordinater anges relativt deras egna paneler: 875099958 66 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson import java.awt.*; import javax.swing.*; public class Program_fyrkant extends JPanel { private Fyrkantklass k1, k2; public Program_fyrkant() { k1 = new Fyrkantklass(50, Color.green, 100); k2 = new Fyrkantklass(100, Color.red, 200); k1.set_xy(0, 0); k2.set_xy(0, 30); add(k1); add(k2); } public static void main(String[] args) { JFrame fr = new JFrame(); fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); fr.setSize(300, 200); fr.setLocation(100, 100); fr.setTitle("Program_fyrkant"); Program_fyrkant gr = new Program_fyrkant(); fr.add(gr); fr.setVisible(true); } } Övning 0.13.9: Skapa klasssen Elefantklass.java(tid) av programmet i uppgift 0.13.3. Konstruktorn ska ha parametrar för elefantens gånghastighet och färgen på den bakomliggande cirkeln. Skapa sedan programmet Elefantprogram.java som ritar upp 3 elefanter med olika gånghastigheter och färger. Övning 0.13.10: Skapa klasssen Klock_klass.java av programmet i uppgift 0.13.8. Konstruktorn ska ha parametrar för klockan gånghastighet och färgen på den bakomliggande cirkeln. Skapa sedan programmet Klockprogram.java, som ritar upp 4 klockor med olika gånghastigheter, enligt exemplet klockprogram.jar. 875099958 67 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Datorns tid Nu ska vi bli lite modernare och göra en digital klocka. Den första klockan använder sig av datorns tid med hjälp av Calender-metoden (se Javajavisst! kapitel 8): String tiden = Calendar.getInstance().getTime().toString(); Följande String-metod ’klipper ut’ positionerna start till slut (ingår ej!) av strängen tiden: kalle = tiden.substring(start, slut); Om exempelvis strängen tiden=“andersson” och start=2 och slut=5 får strängen kalla värdet ”der”. Den andra digitala klocka skapar vi med egna lablar. Övning 0.13.11: Kopiera klassen Digitalur.java på sidan 11 i Javajavisst! kapitel 13, vilken ärver egenskaper från JLabel. Modifiera konstruktorn så att den får fler parametrar: Digitalur(Color farg1, Color farg2, int fontsize, int start_pos, int slut_pos) Parametrarna start_pos och slut_pos anger start- och slutposition för datorna tidsangivelse med Calender-metoden ovan. Skapa sedan klassen Digitalprogram.java genom att kopiera och modifiera Klockprogram.java ovan. Skapa sedan fyra objekt för tidsangivelser med följande konstruktoranrop: k1 = new Digitalur(Color.red,Color.yellow,10,0,29); k2 = new Digitalur(Color.yellow,Color.blue,20,5,29); k3 = new Digitalur(Color.yellow,Color.blue,40,0,19); k4 = new Digitalur(Color.black,Color.white,60,11,19); Det färdiga programmet fungerar som Digitalprogram.jar. Övning 0.13.12: Nu ska du skapa en digital klocka som skriver ut timmar, minuter, sekunder, tiondelar och hundradelar, enligt urklippet till höger och som fungerar som Digitalklocka.jar. Skapa klassen Digitalklass.java genom att kopiera och modifiera klassen Digitalur.java i förra uppgiften. Använd här en vanlig Timer som vi använt tidigare. Beräkna timmarna, minuterna, sekunderna och tiondelarna genom att tillämpa heltalsdivision och begreppet modulus (%) på hundradelarna. Konstruktorn har följande inparametrar: Digitalklass(Color farg, int fontsize, int h, int min, int sek) Parametrarna h, min och sek är klockans starttid i timmar, minuter och sekunder. Skriv även programmet Digitalklocka.java som anropar Digitalklass.java. Urklippet ovan är skapat med följande tre objekt (hur många sekunder gick det innan skärmdumpen gjordes?): k1 = new Digitalklass(Color.red,20,2,20,30); k2 = new Digitalklass(Color.black,50,12,37,43); k3 = new Digitalklass(Color.blue,100,0,0,0); 875099958 68 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Grafik och animering I animeringarna vi hittills gjort i detta kapitel har timerobjektet legat i en klass och animeringarna har varit varit av varandra oberoende objekt som skapats i programmet i form av exempelvis animerade elefanter eller klockor. Vill vi skapa många föremål som på något sätt rör sig i förhållnade till varandra är de lämpligt att lägga timerobjektet i programmet. Föremålen kan dock vara egna klasser. Följande klass Cirkel.java ritar ut en cirkel: public class Cirkel { private int xpos, ypos, diam, dx = 6, dy = 2; public Cirkel(int x, int y, int d) { //Skapar cirkel i koord x och y med diameter d xpos = x; ypos = y; diam = d; } public void visa(Graphics g) { //Ritar ut cirkel g.setColor(Color.red); g.fillOval(xpos, ypos, diam, diam); } public void nyPosition() { //Ändrar cirkelns position dx och dy xpos = xpos + dx; if (xpos + diam + 20 > 300 || xpos < 0) dx = -dx; ypos = ypos + dy; if (ypos > 300) // y börjar om när det är > 300. ypos = -diam; } } I följande program Animera_cirkel.java skapas ett objekt av klassen Cirkel och animeras av timerobjektet. Av utrymmesskäl utelämpas importerade paket: public class Animera_cirkel extends JPanel implements ActionListener { Cirkel c = new Cirkel(20,20,50); // Referens till array med 10 asteroider Timer t; public Animera_cirkel() { setBackground(Color.black); t = new Timer(30, this); t.start(); } public void paintComponent(Graphics g) { super.paintComponent(g); c.visa(g); // Ritar ut asteroiderna } public void actionPerformed(ActionEvent arg0) { //Anropas av Timer c.nyPosition(); //Ger asteroiderna ny position repaint(); //Ritar om via paintComponent } public static void main(String[] args) { JFrame f = new JFrame(); f.setSize(300, 300); f.setLocation(100, 100); f.setTitle("Visa_cirkel"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Animera_cirkel p = new Animera_cirkel(); f.add(p); f.setVisible(true); } } 875099958 69 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Övning 0.13.13: I exemplet ovan kommer det fram en ny cirkel upptill när den andra försvinner nedtill. Modifiera programmet så att cirkeln även studsar mot den nedre och övre kanten, enligt exemplet Animera_cirkel.jar. Övning 0.13.14: Modifiera föregående klass Cirkel.java så att cirkeln startar i en slumpad koordinat (1-240), har slumpmässig diameter (5-50) och en slumpmässig färg. Konstruktorn Cirkel() anropas alltså från programmet Animera_cirkel.java utan parametrar, eftersom dessa nu slumpas i Cirkel.java. Programmet fungerar enligt exemplet Animera_cirkel2.jar. Övning 0.13.15: Modifiera föregående program Animera_cirkel.java så att det ritar ut fem cirklar, enligt exemplet Animera_cirkel3.jar. Cirklarna skapas som vektorobjekt med följande referensdeklaration… Cirkel c[] = new Cirkel[5]; … i början av programmet. I programmets konstruktor skapas de fem cirkelobjekten med satsen: for (int i = 0; i <= 4; i++) c[i] = new Cirkel(); Modifiera metoderna paintComponent och actionPerformed så att de fem cirklarna ritas ut. Övning 0.13.16: Vi ska nu göra astroidspelet i Javajavisst kapitel 13 som börjar med övningen Astroiderna rör sig på sidan 7. Kopiera de existerande filerna Asteroid.java och VisaAsteroider.java från Javajavisst kapitel 5 sidan 23 respektive kapitel 9 sidan 23 och klistra in dem i projektet kap13. Gör sedan modifieringarna på sidorna 7 och 8 så att programmet fungerar som exemplet VisaAsteroider.jar. Övning 0.13.17: Vi ska nu göra ett rymdskepp med laserfunktion. Kopiera klasserna Rymdskepp.java och VisaRymdskepp.java i kapitel 9. Modifiera sedan klasserna enligt sidan 19 kapitel 11 så att rymdskeppet går att flytta i sidled med vänster och höger piltangent. När mellanslagstangenten trycks ned avfyras en laserstråle, enligt exemplet VisaRymdskepp.jar. Glöm inte att lägga f.addKeyListener(p) i main-metoden. 875099958 70 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Övning 0.13.18: Nu ska du göra ett spel som med rymdskeppet från förra övningen som skjuter ned astroidern i den förförra övningen. Skapa programmet Astroidspel.java genom att kopiera och byta namn på VisaAsteroider.java. Infoga även koden från programmet VisaRymdskepp.java så att programmet Astroidspel.java både visar de fallande asteroiderna och hanterar rymdskeppet och laserkanonen med tangenterna. Programmet använder klasserna Rymdskepp.java och Asteroid.java. Lös nu uppgiften enligt följande punkter: Modifiera programmet och klasserna enligt sidan 14 i JavaJavisstPlus kapitel 13. Modifiera programmet så att att tiden och antal kvarvarande asteroider skrivs ut. När alla tio asteroiderna är nedskjutna stannar tiden och det står Slut!. När laserkanonen avfyras hörs ett ljud, liksom när en asteroid träffas. Ljudfilerna laser.au och traff.au finns på Javajavists hemsida http://www.sectordata.se/laromedel/index.php Programmet fungerar enligt exemplet Asteroidspel.jar. För att ljudeffekterna ska höras måste jarfilen ligga i samma mapp som de båda ljudfilerna ovan. Mushändelser Nedan löser vi att några grafikuppgifter där mushändelser används. Vi inleder därför med att kolla hur följande sju mushändelser fungerar: mousePressed, mouseClicked, mouseReleased, mouseEntered, mouseExited, mouseDragged, mouseMoved Övning 0.13.19: På sidan 7 i kapitel 11 i Javajavisst finns programmet Mustest2.java, som illustrerar mushändelserna ovan. Kopiera och impementera koden i Eclipse och ändra den så att programmet fungerar som exemplet Mustest.jar, enligt följande: Samma text skrivs ut i labeln som i grafiktexten. Texten anger marköresns koordinat. När en musknapp klickas flyttas grafiktexten till markören. Hålls en musknapp intryckt flyttas grafiktexten med markören. Kommer markören in på labeln anger texten detta. Lämnar makören panelen anger texten detta. 875099958 71 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Övning 0.13.20: Nu ska vi skriva ett program som spränger ballonger med musknappen genom att modifiera programmet Animera_cirkel.java och dess klass Cirkel.java. Kopiera först både dessa filer och klistra in dem som Klicka_cirkel.java respektive Cirkel3.java. Från programmet Astroidspel.java kan sättet att kolla träffar, utskrifter och koden för ljudet vid träff återanvändas. Använd musmetoden mousePressed för att klicka på ballongerna och registrera koordinaten. Observera att två gränssnitt måste implementeras: public class Klicka_cirkel extends JPanel implements ActionListener, MouseListener {… Programmet fungerar som exemplet Klicka_cirkel.jar. Förslag till lösningar till de båda klasserna finns längst ner i detta dokumentet. Övning 0.13.21: Här ska du skriva ett program med med många kompassnålar som med sin nordände pekar mot markören när den rör sig och musknappen är nedtryckt, enligt exemplet Kompass_program.jar. Lös förslagsvis programmet enligt nedanstående punkter: Skapa programmet Kompass_program.java. Konstruera en kompasspil i form av två streck, ett rött och ett vitt. Lägg kompassnålens mittpunkt i koordinaten (x0, y0). Gör så att kompassens röda del pekar mot koordinaten (x, y). Använd likformighet för att räkna ut till vilka koordinater de det röda och vita strecket ska ritas. Kompassnålens totala längd är 60 pixlar. När programmet startas pekar kompassnålen mot origo, alltså övre vänstra hörnet. När musknappen trycks ned och rör sig ska kompassnålens röda del peka mot markören. Modifiera nu programmet och skapa klassen Kompass_klass.java, som ritar upp kompassnålen som skapas i programmet Kompass_program.java. Klasen har inga parametrar. Ritningen av kompassen görs med metoden visa(g,x,y), där x och y är markörens koordinat. Skapa slutligen en vektor med 20 kompassnålar som alla pekar mot markören när musknappen är nedtryckt. I början pekar alla nordändar mot origo. 875099958 72 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson 18. Appar för Android Smartphones blir vanligare och ersätter allt oftare datorer. Bortsett från att de är lätta och portabla är nog det främsta skälet till populariteten den lavinartade framväxten och användningen av appar, d.v.s. mobilapplikationprogram för nästan vad som helst som kan laddas ner till telefonen. I denna kursen kommer vi att lära oss grunderna i att göra appar för Googles mobila operativsystem Android, som tillsammans med Apples operativsystem iOS är de mest spridda plattformarna för appar. Android har fördelen att Java och Eclipse används för att göra apparna, samt att det är billigare (engångskostnad $25) att lägga ut apparna för nedladdning på Google Play (tidigare Andriod Market) jämfört med på Apples App Store ($99/år). I denna kursen görs apparna för Android. Kursen förljer till stora delar kapitel 18 i Java-javisst! Installation av verktyg För att kunna göra apparna måste vi ha följande verktyg – program: Android Software Development Kit (SDK) – program för utveckling av appar i Java. Fordrar JDK6 eller 7 och en sen variant av Eclipse. Android Development Tools (ADT) – ett pluginprogram för Eclipse. Android Virtual Device (AVD) – en virtuell, simulerad, emulerad telefon på datorskärmen där apparna kan köras. Typ av telefon (Nexus s15) väljs vid installationen. Spelar dock ingen roll vilken telefon som väljs. Testa apparna på din androidtelefon I kapitel 21 i Java-javisst! beskrivs utförligt hur ovanstående fyra installationer görs, vilket tar omkring en timme. Och här är den officiella sidan för apputvecklare: http://developer.android.com/index.html Övning 0.18.1: Kolla vilka AVD:er som är installerade på din dator genom att i Eclipse kolla detta i menyvalet Window/Android Virtual Device Manager. 875099958 73 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Androidprojekt Ett Androidprojekt består av tre delar: Application name – appnamnet som användares ser, ungefär som taggen Title i html-sidor. Project name – namnet på mappen med projektfilerna, ungefär som i Java. Package name – ett unikt namn för varje app, ofta företagets webbadress baklänges, exempelvis för www.andersandersson.nu blir det nu.andersandersson.minapp, om appen har namnet minapp. Androidprojektet består av tre filer. Om Package name ges namnet com.example.andtest1 erhålls följande filer: Andtest1.java: innehåller javakoden för appen och körs som en javafil i Eclipse. Filens sökväg är: AndroidProjekt1/src/com/example/andtest1/Andtest1.java activity_andtest1.xml: innehållr beskrivningen av sidans layout, dels grafiskt, dels med xml-kod. I grafikläget kan denna filen layoutas med komponenter (label, textruta och knapp), typsnitt och bakgrundsfärger. Filens sökväg är: AndroidProjekt1/res/layout/activity_andtest1.xml strings.xml: innehåller värdena för olika komponenterna (label, textruta och knapp) och färger med xmlformatering. <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">Android test 1</string> <string name="hello_world">Hej Världen, Anders!</string> <string name="menu_settings">Settings</string> <string name="mitt_namn">Jag heter Ville</string> <string name="alder">Jag är 19 år</string> <string name="ort">Jag bor i Skoghall</string> <color name="blue">#0000FF</color> <color name="yellow">#FFFF00</color> </resources> Om Androidprojektet ges namet AndroidProjekt1 och Package-namnet (exempelvis com.example.andtest1) slutar på andtest1, får de tre filerna följande sökvägar i Eclipse mappstruktur: AndroidProjekt1/src/com/example/andtest1/Andtest1.java AndroidProjekt1/res/layout/activity_andtest1.xml AndroidProjekt1/res/values/strings.xml Övning 0.18.2: Skapa ett nytt Androidprojekt i Eclipse via menyvalet File/New/Android Application Project alternativt File/New/Project, i fönstret New Project expandera Android och klicka Android Application Project. Följ sedan anvisningarn på sidan 3 i kapitel 21 i Java-javisst! 875099958 74 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Övning 0.18.3: Lägg till raderna i filen string.xml, enligt urklippet ovan. I nästa uppgift ska detta används för att formatera sidan. TextView, typsnitt, färger och bakgrundsbild Komponenten TextView i Android motsvarar en textlabel i java. I detta avsnitt ska vi formatera text och hatera färger. Observera att text- och färgelementens namn, samt text och färger lagras i filen strings.xml. Övning 0.18.4: Gå till grafikläget i filen activity_andtest1.xml och för följande inställningar med hjälp av kapitel 18 t.o.m sidan 14 i Java-javisst!: a) Lägg in en TextView genom att dra den från lagret till vänster in till skärmytan, samt infoga texten Hej Världen, Anders! från filen string.xml. Texten är kursiv, har storleken 30 dpi och är gul (från filen string.xml). b) Lägg in ytterligare en TextView, infoga texten Jag heter Ville från filen string.xml. Texten har stoleken 30 dpi och har seriffer (vid Typeface). c) Lägg in ytterliggare en TextView och infoga namnet jag är 19 år från filen string.xml. Texten har storleken 20 dpi. d) Prova att lägga i en blå bakgrundsfärg (från filen string.xml). Bakgrunds e) Lägg in en bakgrundsbild. Välj en egen bild att lägga in eller en bil från Java-javisst! 875099958 75 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Händelsehantering – via ett exempel Skapa app-projektet namnrutor som läser in för- och efternam i två rutor och sedan skriver ut namnen i en TextView när en knapp klickas. Knapparna Röd och Grön ger röd respektive grön bakgrund, medan knappen Vit+24p+gul ger vit bakgrund, textstorlek 24p och gul text. Lösning: package com.example.namnrutor; import android.app.Activity; import android.graphics.Color; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.RelativeLayout; import android.widget.TextView; //Ctrl-Shift-o infogar nödvändiga bibliotek public class MainActivity extends Activity implements OnClickListener { private String f,e; //Här deklareras variabler och objekt private EditText tf,te; private TextView lbl; private Button b4,b3; private RelativeLayout bb; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Delar av filen activity_main.xml: setContentView(R.layout.activity_main); <RelativeLayout xmlns:android="http://sche..." tf = (EditText) findViewById(R.id.editText1); xmlns:tools="http://schemas.and..." te = (EditText) findViewById(R.id.editText2); android:layout_width="match_parent" lbl = (TextView)findViewById(R.id.textView3); android:layout_height="match_parent" b3 = (Button)findViewById(R.id.button3); tools:context=".MainActivity" b4 = (Button)findViewById(R.id.button4); android:id="@+id/layout" > b3.setOnClickListener(this); //Som i ’vanlig’ Java … <Button b4.setOnClickListener(this); android:id="@+id/button1" bb = (RelativeLayout)findViewById(R.id.layout); android:layout_width="wrap_content" } //Här skapas de olika objekten. bb är layotens android:layout_height="wrap_content" //bakgrund. android:layout_alignLeft="@+id/editText2" public void klickhanterare(View v) { android:layout_below="@+id/editText2" f = tf.getText().toString(); android:layout_marginTop="28dp" e = te.getText().toString(); android:onClick="klickhanterare" lbl.setText("Du heter " + f +" "+e); android:text="@string/knapp1" /> } //Metoden som skriver ut texten. klickhaterare är en … <Button //händelsehanterare i xml-filen kopplad till knapp1. android:id="@+id/button2" public void rott(View v) { … bb.setBackgroundColor(Color.RED); android:onClick="rott" } //Den röda bakgrundsfärgen är kopplad till knapp2 android:text="@string/knapp2" /> //på samma sätt via händelsehanteraren rott. @Override public void onClick(View view) { //Ett annan överskådligare händelsehantering är att lägga all switch(view.getId()){ //kod i java-filen utan att använda händelsehanterare. case R.id.button4: //i xml-filen. Knapphändelserna hanteras av metoden onClick. bb.setBackgroundColor(Color.WHITE); //Bakgrundsfärg lbl.setTextSize(24); //Textstorlek lbl.setTextColor(Color.YELLOW); //Textfärg break; case R.id.button3: bb.setBackgroundColor(Color.GREEN); break; … 875099958 76 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Övning 0.18.5: Följande exempel inneåller de tre form widgetskomponenterna TextView (label), Button och TextFields. I övningen nedan skapas en app som skriver ut texten som matas in i en textruta i en label när en knapp klickas. Samtidigt skrivs även texten ut i en Toast, d.v.s meddelanderuta. Du ska nu göra app-projektet MataIn. Lös uppgiften enligt handledningen på sidorna 15-22 i kapitel 18 i Java-javisst!. Förklaringarna av olika klasser behöver inte läsas för att uppgiften ska kunna lösas. Urklippet till höger visar hur den färdiga appen ska se ut. När knappen klickas ska dessutom texten bli gul och bakgrunden röd. Detta görs med följande kod i metoden klickhanterare i filen MainActivity.java: lbl.setBackgroundColor(Color.RED); lbl.setTextColor(Color.YELLOW); Övning 0.18.6: Gör app-projektet textapp med följande funktioner: Knappen Grön bak ger grön bakgrundsfärg och skriver ”Grön bakgrund” i övre texten. Knappen Röd bak, 25, gul ger röd bakgrund, skriver Röd bakgrund i övre texten, textstorlek 25 p och ger gul text. Nästa knapp ger texten storlek 15 p med blå text. Knappen + text ökar övre textstorleken med 1 p för varje klickning. Knappen - text minskar övre textstorleken med 1 p för varje klickning. Försök att få komponenterna all ligga still när textstorleken ändras och knapparna klickas (se Beräkningar och layout nedan). 875099958 77 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Beräkningar och layout Inläsningar från textrutor och beräkningar gör på liknande sätt som java. Inläsning från textrutorna tf1 och tf2 till en hel- respektive decimaltalsvariabel görs med följande satser: x = Double.parseDouble(tf1.getText().toString()); y = Integer.parseInt(tf2.getText().toString()); I xml-koden ska anges vilken typ av tal, hel- eller decimaltal, som textrutan hanterar: android:inputType="numberSigned" android:inputType="numberDecimal" I förra uppgiften påverkades knapparnas lägen på appen av textstorleken på TextView. Detta beror på att layouten är relativ (mer om RelativeLayout senare) och att komponenterna automatiskt placeras i förhållande till <Button varandra när de skapas. Placeras en android:id="@+id/button4" komponent i förhållande till en android:layout_width="wrap_content" komponent vars storlek ändras kommer android:layout_height="wrap_content" den att förflyttas. Därför är det ju android:layout_alignBaseline="@+id/button3" lämpligt att komponenterna placeras i android:layout_alignBottom="@+id/button3" android:layout_alignRight="@+id/editText2" förhållande till komponenter med android:text="@string/div" konstant storlek. I xml-koden till höger är android:onClick="klickat" /> knappen högerjusterad i linje med textrutan editText2:s högerkant. Övning 0.18.7: Gör app-projektet MataInTal enligt övningen på sidan 23 i kapitel 18 i Java-javisst!. Appen ska dessutom ha följande funktioner. I den övre inmatningsrutan ska det gå att mata in decimaltal. Ändra till: android:inputType="numberDecimal" i filen activity_main.xml för textrutan, samt att ändra till double i javafilen för inläsningen från textrutan, samt på några variabler. Koppla ytterligare två knappar för multiplikation respektive division till händelsehanteraren klickat. När appen körs rör sig troligen knappen multiplicera i sidled när olika beräkningar görs. Justera layouten i filen activity_main.xml så att Addera- och Multipliceraknapparnas vänsterkant ligger i linje men den andra textrutans vänsterkant och Subtrahera- och Divisionsrutornas högerkant ligger i linje med den andra textrutans högerkant genom att sätta: android:layout_alignLeft="@+id/editText2" android:layout_alignRight="@+id/editText2" för de vänstra respektive högra knapparna. 875099958 78 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Radio- och bildknappar När radioknapparna av klassen RadioButton skapas ligger det tre stycken i en gruppruta. Vill man ha färre är det bara att radera en och vill man ha fler är det bara att lägga till en i xml-filen. Endast en radioknapp i gruppen kan vara markerad åt gången. En radioknapp deklareras på följande sätt i javafilen: RadioButton Knapp0; Kopplingen till knappobjektet i xml-filen görs med följande sats i javafilen: Knapp0=(RadioButton) findViewById(R.id.radio0); Följande sats är sann om radioknappen är markerad: Knapp0.isChecked() Övning 0.18.8: Gör app-projektet Temperatur enligt övningen på sidan 27 i kapitel 18 i Java-javisst!. Appen ska dessutom ha följande funktioner. Lägg till ytterligare två radioknappar för omvandling mellan Celsius- och Kelvingrader. Vid omvandlinf från Fahrenheit till Celsius blir det ofta många decimaler. Alla temperaturer ska dock avrundas till en decimal (se avsnitt 0.4 för avrundning). När omvandlingen görs ska innehållet i textrutan markeras så att innehåller raderas när ny temperatur matas in (se avsnitt 0.4 för markering av innehåll i textruta). Lägg i efterhand in en ikon för appen. Övning 0.18.9: Gör app-projektet Test enligt övningarna Hint och En knapp med bild på sidan 30 i kapitel 18 i Java-javisst!. Appen ska dessutom ha följande funktioner. Lägg in två bildknappar (ImageButton). Gör två bilder med storleken 70x50 pixlar för knapparna. Beskär förslagsvis bilderna i Paint och ändra storleken. Lägg in knapparna i bilderna. Textrutan och knapparna ska ligga still oavsett hur TextViews storlek ändras. Detta görs genom att ange deras läge till appytans överkant till: android:layout_marginTop="300dp" (textrutan) android:layout_marginTop="400dp" (Knapparna) När den vänstra knappen klickas skrivs den inmatade texten ut i TextView och ökar storleken med 1 pixel. Den högra knappen skriver ut och minskar storleken med 1 pixel. 875099958 79 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Övning 0.18.10: Gör spelet och app-projektet HiLo där användare ska försöka att gissa ett slumpat heltal mellan 1 och 100. Vid varje gissning anger programmet och det är för lågt, för högt eller om det är rätt gissat. Programmet (appen) ska ha följande funktionalitet: Appen innehåller två TextView, två knappar och en textruta för inmatning av endast heltal, som formateras med följand sats i xml-filen: android:inputType="numberSigned" När programmet startas slumpas automatiskt ett nytt tal, den andra TextViewn anger ”Antal gissningar=0”, knappen Nytt spel går ej att klicka (sätt b2.setEnabled(false);), hinttexten i editrutan är Heltal mellan 1 och 100, bakgrundsfärgen är grön, samt textrutan är fokuserad. När knappen Mata in klickas markeras det inmatade talet, antal gissningar skrivs ut, samt om det är för lågt, högt eller rätt. Markering av texten görs med följande satser: tf.requestFocus(); tf.selectAll(); //Fokuserar textrutan tf //Markerar innehållet Matas rätt tal in blir knappen Mata in ej klickbar, knappen Nytt spel klickbar, samt bakgrundsfärgen röd. När knappen Nytt spel klickas slumpas ett nytt tal att gissa på, knappen blir ej klickbar, knappen mata in blir klickbar, bakgrunden blir grön och proceduren från punkt två ovan upprepas. Layouter Hittills har vi använt RelativeLayout, vilket är det layoutalternativ som erhålls om inga val görs. Komponenterrna placeras här relativt varandra efter hand som de skapas. Nackdelen med detta, som vi sett i några av exemplen ovan, är att komponenter som skapats senare kan ändrar sina placeringar om en storleken hos en komponent som skapats tidigare ändras. Placeringen kan dock ändras via xml-filen. Följande layouter finns tillgängliga: RelativeLayoute – komponenter placeras i förhållande till varandra (se ovan). LinearLayout – komponenterna placeras efter varandra, antingen horisontellt eller vertikalt beroende på vilket man väljer. De kan även höger- eller vänster vänsterjusteras eller centreras. TableLayout – komponenterna placeras i rader och kolumner (se övning nedan). FrameLayout – komponenterna hamnar längst upp i vänstra hörnet. Layouten används främst för grafik. 875099958 80 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Övning 0.18.11: Gör app-projektet KeyPad enligt övningen på sidan 32 i kapitel 18 i Java-javisst!. Appen ska dessutom ha följande funktioner. Lägg även in knappar för +, -, = och C (radera). Gör så att ett tal matas in i textrutan när knapparna klickas. Använd metoderna från gränssnitter OnClickListener. Inläsningen från en knapp till textrutan görs förslagsvis med följande kod för i metoden onClick(View view): switch (view.getId()) { case R.id.button1: str = str + "1"; tf.setText(str); break; Räknesätten fungerar lite bakvänt: case R.id.button11: if (str=="") str="0"; sum=sum+Integer.parseInt(str.toString()); str=""; tf.setText(str); break; o Första talet matas in. o Sedan anges talets tecken (+/-). o Andra talet matas in. o Räknesättet anges case R.id.button13: tf.setText(""+sum); break; o Knappen för = ger resultatet. o Vill man fortsätta att räkna matas ett nytt tal in. break; o Ange räknesätt. Koden till höger visar knappen (11) för addition. Koden för ”=” visas ovan för knappen 13. o Knappen för ”=” ger resultatet, o.s.v. Detta sättet att räkna kallas omvänd polsk notation och användes av de äldre HP-räknare (1980-talet). Gör så att knappen C raderar textruta och ’minne’. Koden för Cknappen (14) visas till höger. 875099958 case R.id.button14: sum=0; str=""; tf.setText(""); break; 81 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Grafik I Android användsgrafikrutiner på ett liknande sätt som i Java. Layouten FrameLayout används för grafiken, som hanteras i en egen javaklass, som i sin tur anropas och körs av den vanliga javaklassen MainActivity. Hur dessa kopplingar görs beskrivs med början på sidan 35 i kapitel 18 i Java-javisst!. Övning 0.18.12: Påbörja app-projektet Figurer med FrameLayout, enligt övningen på sidan 34 i kapitel 18 i Java-javisst!, utan att lägga in någon TextView. Fortsätt sedan med övingen Rita grafik på sidan 35 och lös den så att appen får samma utseende som urklippet till höger. Observera att alla objekt skapas i konstruktorn MinView(Context cxt) i klassen MinView.java, medan grafiken utförs i klassens metod onDraw(Canvas cvs). Appen körs med klassen MainActivity.java. Lös uppgiften på följande sätt: Gul bakgrund fås med följande kod i konstruktorn MinView: cvs.drawColor(Color.YELLOW); Skapa Paint-objektet stil med följande koder i konstruktorn MinView: stil = new Paint(Paint.ANTI_ALIAS_FLAG); stil.setColor(Color.RED); stil.setTextSize(30); Skapa fontobjektet typ av klassen Typeface för kursiv stil med seriffer (fötter) med följande kod: typ = Typeface.create(Typeface.SERIF, Typeface.ITALIC); stil.setTypeface(typ); Skriv in texten Några olika canvasfigurer överst på sidan med koden i metoden onDraw: cvs.drawText("Några olika canvasfigurer", 0,30,stil); Lägg in en fylld cirkel med centrum i (150, 100) och radien 100 och texten med följande kod i metoden onDraw: cvs.drawCircle(150, 200, 100, stil); cvs.drawText("Fylld cirkel",150,200,stil2); Skapa Paint-objektet stil2 med följande kod i konstruktorn MinView: typ2 = Typeface.create(Typeface.SANS_SERIF, Typeface.NORMAL); stil2 = new Paint(Paint.ANTI_ALIAS_FLAG); stil2.setColor(Color.BLUE); stil2.setStyle(Paint.Style.STROKE); //Stroke ger ej fylld figur stil2.setTypeface(typ2); Lägg in en ofylld rektangel och text med koden i metoden onDraw: cvs.drawRect(150,350,250,450,stil2); cvs.drawText("Ofylld rektangel (stroke)",100,400,stil2); 875099958 82 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Lägg in en fylld röd rektangel och text med koden i metoden onDraw: cvs.drawRect(150,500,450,600,stil); cvs.drawText("Fylld rektangel", 150,550,stil2); Spara en egen bild i mappen Figurer/res/drawable-ldpi. Om bilden har filnamnet bb.jpg läggs den in med följande kod i metoden MinView: Bitmap minBild; //Skapa bildobjektet minBild av klassen Bitmap utanför MinView minBild = BitmapFactory.decodeResource(getResources(),R.drawable.bb); Följande kod för bilden läggs i metoden onDraw: minBild = Bitmap.createScaledBitmap(minBild,200,400,false); //Bildmått 200x400 cvs.drawBitmap(minBild, 260, 70, null); //Bildens övre högra hörn i (260,70) cvs.drawText("Bild", 300,60,stil2); //Texten Bild läggs in i (300,60) Övning 0.18.13: Kopiera förra app-projektet Figurer i Eclipse och klistra in en kopia som och döps till Figurer2. Modifiera sedan appen så att den får utseendet som utklippet till höger. Lös uppgiften på följande sätt: Rita ut 1000 fyllda cirklar med diametern 25 pixlar med slumpmässig placering och slumpmässiga färger. Cirklarna ska ligga 25 pixlar från högerkanten. Använd följande metoder på lämpligt sätt: (int)(Math.floor(Math.random()*256)) //Slumptal stil.setColor(Color.rgb(r,g,b); //Ger rgb-färg cvs.getWidth(); //Ger skärmens pixelbredd cvs.getHeight(); //ger skärmens pixelhöjd Rita en cirkel med fyllning enligt klassen RadialGradient, enligt den översta cirkeln i urklippet. Cirkeln har radien 100 pixlar. Använd exakt följande metoder: RadialGradient radGrad = new RadialGradient(250, 100, 100, Color.GREEN, Color.RED,Shader.TileMode.MIRROR); stil.setShader(radGrad); cvs.drawCircle(250,100,100,stil); Rita en cirkel med fyllning enligt klassen SweepGradient, enligt den ’koniska’ cirkeln i mitten i urklippet. Använd exakt följande metoder: SweepGradient swepgrad= new SweepGradient(250,300, new int[] {Color.RED,Color.YELLOW,Color.GREEN,Color.BLUE,Color.MAGENTA},null); stil.setShader(swepgrad); cvs.drawCircle(250,300,100,stil); Rita en cirkel med fyllning enligt klassen LinearGradient, enligt den ’randiga’ cirkeln nederst i urklippet. Använd exakt följande metoder: LinearGradient linGrad = new LinearGradient(0,0,25,25,Color.RED,Color.BLACK,Shader.TileMode.MIRROR); stil.setShader(linGrad); cvs.drawCircle(250,500,100,stil); Observera att de tre större cirklarna tangerar varandra. 875099958 83 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Animering I detta exemplet visas animering av grafiska objekt och touchhändelser på skärmen. I den färdiga appen rör sig en röd cirkel på en grön bakgrund samtidigt som cirkelns koordinater visas i övre vänstra hörnet, enligt urklippet. Även läget hos en blå rektangel påverkas av var på skärmen man trycker. Övning 0.18.14: Skapa projektet Pong och följ sedan exemplet på sidan 38 i kapitel 18 i Java-javisst!. Den färdiga koden för de tre javafilerna finns länkad nedan. Klassen boll.java beskriver den röda cirkeln och dess läge på skärmen. Här är klassen MainActivity.java. Gränssnitten Runnable och OnTouchListener innehåller metoden run för animering (trådar) respektive touchmetoden onTouch för skärmen. Klassen Handler hanterar tråden. Klassen Racket.java beskriver den ljusblå racketen och dess läge på skärmen. *Gör klart Pong-spelet. Bilderväxlingar ImageViews Komponenten ImageViews är en behållara för bilder. I följande övning skapar vi en app som låter oss byta mellan fyra bilder på några olika sätt med sex knapper, enligt urklippet med gojorna till höger, samt tonar bildbyten. Övning 0.18.15: Skapa projektet ImageTest och följ sedan exemplet på sidan 43 i kapitel 18 i Java-javisst! t.o.m. knappen OFF. Fortsätt sedan med att lägga in övriga knappar: Hämta de två bilderna goja.jpg och pingvin.jpg från JavaJavisst och lägg dem i mappen drawable-ldpi. Hämta ytterligare två egna bilder och beskär dem till 200x200 i Paint innan de läggs i mappen ovan. Byt bilder kopplas till egna metoden klicka. Varje klick på knappen byter bild. Efter fyra klick visas första bilden igen. De nedersta fyra knapparns kopplas alla till den egna metoden klick4. Klickas på en knapp visas respektive bild. De ligger dessutom i en linjär layout. Bildspel startar en tråd som slumpar en ny ny bild varje sekund. Byt bilder tonar fram bilderna. Här är appens MainActivity.java. 875099958 84 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Menyer Ska våra appar bli användbara bör de byggas upp med menyer. Följande exempel består av en startsida i form av en huvudmeny med två knappar, rubricerad Menysidan, varifrån två val kan göras för addition respektive subtraktion. package com.example.menyer; Klickas knapparna öppnas två sidor import android.app.Activity; rubricerade Addera respektive Minus. import android.content.Intent; import android.os.Bundle; Dessa båda sidor innehåller knappen import android.view.Menu; Tillbaka, som öppnar huvudmenyn. Appen import android.view.View; är skapad på följande sätt: public class MainActivity extends Activity { Menysidan @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } 1) Skapa först projektet Menyer. Då skapas samtidigt det som ska bli startsidans javaklass MainActivity.java och layoutfil activity_main.xml. public void addera(View v) { Intent myIntent = new Intent(this, AdderaKlass.class); startActivity(myIntent); } 2) xml-filens innehåll raderas och den ges en linjär vertikal layout med centrerad text och två knappar. public void minus(View v) { Intent myIntent = new Intent(this, MinusKlass.class); startActivity(myIntent); } 3) onClick-metoderna addera och minus skapas för respektive knapp i xmlfilen. @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } } 4) Lägg in metoderna addera respektive minus i klassfilen för att öppna de andra menyerna med klasserna AdderaKlass.class och MinusKlass.class, som skapas nedan. Adderasidan 5) Nu skapar vi xml-filen activity_addera.xml i mappen res/layout för menyvalet Addera. Kopiera föslagsvis in xml-koden från startsidan och ändra text och färg. package com.example.menyer; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.Menu; import android.view.View; public class AdderaKlass extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_addera); } 6) onClick-metoderna tillbaka skapas för knappen Tillbaka i xml-filen. 7) Skapa klassfilen AdderaKlass.java i mappen src/com.exemple.menyer som hanterar koden för Adderasidan. Klassfilen måste deklareras i filen AndroidManifest.xml via valen Application/Add/Activity, samt därefter välja filen AdderaKlass.java vid Name till höger. 875099958 public void tillbaka(View v) { Intent myIntent = new Intent(this, MainActivity.class); startActivity(myIntent); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } } 85 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson 8) Lägg in metoden tillbaka i klassfilen som öppnar startsidan. Minussidan 9) Skapa filerna activity_minus.xml och MinusKlass.java på motsvarande sätt som för Adderasidan, vars kod förslagsvis kopieras och ändras på lämpligt sätt, enligt urklippet till höger. package com.example.menyer; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.Menu; import android.view.View; public class MinusKlass extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_minus); } Ändra startsida Vilken sida (klassfil) som ska vara startsida anges i filen AndriodManifest.xml i activity-delen. I början anges startsidans klassfil och längre ner klassfilerna som tillhör projektet, enligt urklippet nedan. Är den första java-filen som skapas startsidan behöver man inte tänka på detta. public void tillbaka(View v) { Intent myIntent = new Intent(this, MainActivity.class); startActivity(myIntent); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } } Del av filen AndroidManifest.xml … <activity android:name="com.example.menyer.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="AdderaKlass"></activity> <activity android:name="MinusKlass"></activity> … 875099958 86 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA Ljud av Anders Andersson package com.example.ljud; Vi ska nu se ett ett exmpel på hur ljudfiler (.mp3) anropas. Skapa först app-projektet ljud. Skapa sedan foldern raw i mappen …res/raw där ljudfilen placeras. I detta exempel heter filen kali.mp3. xmlfilen innehåller de två knapparna Start 1 och Stopp 1, enligt urklippet, som startar och pausar mp3-filen. Knapparna är kopplade till onClickmetoden starta(View v), i kodexemplet till höger. Provkör ljudexemplet. Gruppuppgift – turistapp import android.app.Activity; import android.media.MediaPlayer; import android.os.Bundle; import android.view.Menu; import android.view.View; public class MainActivity extends Activity { MediaPlayer Song; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Song=MediaPlayer.create(MainActivity.this,R.raw.kali); } public void starta(View v) { switch (v.getId()) { case R.id.button1: Song.start(); break; case R.id.button2: Song.pause(); break; } } Android är ett väldigt stort operativsystem med många möjligheter, av vilka vi nu lärt oss @Override en liten del. Dock tillräckligt många public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); för att vi ska kunna göra en return true; funktionell turistapp för } } Kristinehamn, vilken med text, ljud och bild berättar om kommunens historia och sevärdheter. Appen kan ha följande menyer: Startmenyn (meny 1) – här väljs språken svenska, engelska eller tyska via knappar mot en bakgrundsbild av Kristinehamn. När ett språk valts visas en ny meny (meny 2) med text (TextView) och små bilder (ImageButton) för alla sevärdheter i en vertikal LinearLayout. Klickas en bildknapp kommer man till en meny (meny 3) för just den sevärdheten, som innehåller ett bildspel med några bilder, en knapp som öppnar en ny meny (meny 4) som med text berättar om sevärdheten, samt en knapp som startar en mp3-fil som med en röst berättar det som texten beskriver. Ljudinspelningen görs förslagsvis med datorns Ljudinspelaren till en wma-fil, som sedan konverteras till mp3-format. Varje meny innehåller en knapp som backar till föregående meny. Meny 1 finns endast i en version, medan menyerna 2-4 finns för varje språk. Börja förslagsvis med att göra i ordning menystrukturen med de fyra menynivåerna för den svenska versionen på en dator under projektnamnet Kristinehamnsapp. Kopiera sedan projektet till gruppmedlemmarnas alla datorer och utvecka menyerna 3 och 4. När den svenska versionen är klar kan den kopieras och ändras till övriga språk. För att appens funktionalitet ska framgå föreslår jag att ni inledningsvis fokuserar på fem sevärdheter som redovisas på alla tre språken. Kristinehamns sevärdheter beskrivs under http://www.kristinehamn.se/turism-kulturfritid/sevardheter Välj förslagsvis Picassoskulpturen, Ölme Diversehandel, Familjen Fröding, Kristinehamns kyrka, samt runstenen i Järsberg. När dessa fungerar kan ni utöka med fler. När de fem sevärdheterna är klara överför vi appen till mitt konto på Google play. 875099958 87 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Publicera appar på Google Play Nu är det dags att publicera den färdiga andriodappen på Google play, vilket görs i två steg: 1. Först skapas en apk-fil (som är en slags komprimering av alla filer som ingår i projektet) av app-projektet. Filmen http://thenewboston.org/watch.php?cat=6&number=199 visar hur det görs i Eclipse. Det är viktigt att package namnet inte börjar på com.example…, som våra appar hittills gjort, för då fungerar inte överföringen till Goggle play senare. apk-filen i bin-mappen kan inte överföras direkt, utan följannde steg måste göras: a. Högerklicka på app-projektet (t.ex. ljud) och välj Export/Android/Export Android Application. b. Välj projekt att exportera. c. Skapa en keystore om det inte gjorts tidigare (t.ex. anderskeystore). Skapa även en mapp där för keystore (t.ex. Androidappar) där apk-filerna och keystore sparas. d. Hitta på ett lösenord. e. Skapa ett alias (anders). f. Spara apk-filen (t.ex. ljud.apk). g. Avsluta 2. Överföringen av apk-filen till Google Play görs på sidan Google Play Developer Console https://play.google.com/apps/publish. Här görs också registreringen till en kostnad av 25 dollar (betala via kontokort) för att kunna distribuera appar till användare av Androidmobiler via Google play. Filmen ovan vid punkt 1) visar hur överföringen görs i den äldre versionen Android Market, men det påminner om det nyare Google play. När betalningen är gjord är man registrerad och kan överföra sina apk-filer (exempelvis mappen androidmappar), beskriva sin app i text, samt överföra åtminstone två skärmdumpar av appen i angivna upplösningar. Sen tar det några timmar innan appen syns på Google play. I Developer Console syns även inlagda appar, enligt bilden ovan. Kolla om ni hittar min app HiLo Spelet (sök eventuellt på Brogårdsgymnasiet Kristinehamn Sweden eller [email protected]). Att lägga ut appar är lite mer tids- och arbetskrävande jämfört med att överföra html-filer i en webbserver. 875099958 88 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson 1. Vi börjar programmera Inledning Denna kurs i Java-programmering bygger på goda kunskaper i språket C++ och på att begrepp som variabler, urval, loopar, objekt etc. är kända. Kan man C++ är det dock relativt enkelt att lärar sig Java, eftersom Java till härstammar ifrån och till stor del har samma syntax som C++. Språket Java skapades 1991 av den kanadensisk-amerikanske programmeraren James Gosling vid dataföretaget Sun Microsystem och blev allmänt tillgängligt 1995. Ursprungligen var Java tänkt som ett språk för konsumentartiklar (typ tvättmaskiner), men kom i början främst att användas för bla grafiska effekter med s k applets på Internet. Java har emellertid nu slagit igenom stort och i viss mån ersatt traditionella språk som C++. Java har många fördelar: Syntaxen är i stort sett identisk med C++. Java är därför relativt enkelt att lära sig för den som redan kan C eller C++. Det är plattformsoberoende, d v s ett program kan köras i olika operativsystem (Windows 2000, Unix etc.) utan att ändras. Det innehåller grafiska verktyg såsom knappar och textrutor (som VB) även om programmeringen görs i en texteditor. Det stödjer s k trådar (threads). Exempelvis kan det rita upp en bild samtidigt som det gör en inläsning. Det kan användas på Internet för att skapa dynamiska funktioner på webbsidor. Detta görs med javaapplets. Det saknar pekare, vilket innebär att ett program i Java ofta är enklare att förstå än i C++. Java har också några nackdelar: Det är ett s k interpreterande (d v s översätter kod vid varje exekvering) språk och därför långsammare än t ex C++. Detta kompenseras dock av att dagens datorer är så pass snabba att detta ofta inte är något hinder. Det är ett innehållsrikt språk med väldigt många färdiga standardklasser (bl a för grafik) som kan vara svåra att få grepp om. Man behöver dock inte lära sig allt på en gång. I denna javakurs berörs främst syntax och begrepp som skiljer sig från C++, som tas upp i kursdokumentet http://hem.passagen.se/anderskristerandersson/data/Cplus_lektioner.doc. Nedladdning och installation av Java En av fördelarna med Java är att utvecklingsmiljön JDK (Java Development Kit, som bl a innehåller kompilatorn) är gratis. Programmet (52 MB) j2sdk-1_4_2_07-windows-i586-p.exe laddas ner från företaget Suns hemsida http://java.sun.com/j2se/1.4.2/download.html till din dator. När programmet installeras skapas mappen c:/ j2sdk1.4.2_07, där programmet packas upp. Javaprogrammen utvecklade med JDK och körs sedan i konsollmiljö, d v s programmen skrivs i en textredigerare typ Anteckningar och de kompileras och exekveras i MS-DOS via Kommandotolken i Tillbehör. I mappen c:/ j2sdk1.4.2_07/bin finns bl a filen javac.exe, som används för att kompilera javaprogram. Väljer vi att spara våra javaprogram i en annan mapp än 875099958 89 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson mappen bin ovan, vilket är det vanligaste, måste sökvägen anges till bin-mappen så att filen javac.exe hittas. Detta är krångligt. För att slippa ange sökvägen kan vi istället lägga in en sökväg (path) till mappen bin via Kontrollpanelen/System/Avancerat/Miljövaria bler. Markera Path i den undre rutan och klicka på knappen Redigera. Skriv där in sökvägen C:\j2sdk1.4.2_07\bin, enligt urklippet intill. Javaprogram kan nu kompileras och köras (exekveras) via kommandotolken. Java med TextPad För att slippa skriva javaprogrammen i Anteckningar och kompilera och exekvera i DOS-miljön skall vi använda oss av editeringsprogrammet TextPad. Programmet (2Mb) laddas ner från http://www.download.com. Installera programmet och öppna det sedan via Start/Alla program. Programmet TextPad är en mer avancerad editor än Anteckningar, bl a görs automatisk indentering och färgning av texten. Dessutom kan javaprogrammen kompileras och köras i TextPad, utan att sökvägen till bin-mappen i Miljövariabel behöver anges (som i förra stycket). Programmet kompileras och körs via menyvalet Tools/Compile Java (Ctrl+1) respektive Tools/Run Java Application (Ctrl+2). Javadokumentation Java är ett stort språk med väldigt många standardklasser och metoder. Detta finns samlat i en dokumentation som kan laddas ner som ett zippat dokument (30 MB) från Suns hemsida http://java.sun.com/j2se/1.4.2/download.html. Uppackat blir dokumen knappt 200 MB stort. Dokumentet finns även uppackat i j:/Anders_A/java/javadokumentation/index.html. 875099958 90 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Första programmet i Java - utmatning Skriv in följande program i TextPad: class test1{ public static void main(String args[]){ System.out.println("Det funkar i textpad!"); System.out.println("Deta är andra raden"); System.out.print("Tredje raden"); System.out.print("Fjärde raden"); } } //Klamrar på samma rad (ej som i C++) //main-metoden börjar //Ger utskrift //println, ny rad efter utskrift //print, ej ny rad efter utskrift //main-metoden slutar Programmets enda klass heter test1, som kan ses som programmets namn. Källkodfilen skall ha samma namn som programmet. Spara därför programmet som test1.java i mappen java, där du i fortsättningen sparar alla dina javaprogram. Filslutet .java anger att det är en källkodfil för ett javaprogram. Kompilera nu programmet till bytekod (andra program kompilerar direkt till maskinkod). Då skapas klassfilen test1.class, som är plattformsoberoende. När klassfilen sedan körs med en javatolk interpreteras den till maskinkod. Ordet public anger att main-metoden (som i C++) är åtkomlig utifrån klassen (programmet) test1, vilket den måste vara för att den skall kunna anropas av av interpretatorn. Ordet static anger att main-metoden är en s k klassmetod (eller statisk metod), d v s en metod som inte hör till ett visst objekt. Parametern String args[] i main-metoden skall alltid vara med för att main-metoden skall kunna anropas med en parameter, vilket dock sällan görs. Följande program illustrerar variabeldeklaration och addition. Observera likheterna med C++: class test3{ public static void main(String args[]){ int a,b=5; double c=3.33; a=7; System.out.println("Summan är " + (a+b) +" och decimaltalet " + c); } } Utelämnas parentesen runt additionen (a+b) i utskriften blir värdet 75. 875099958 91 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Inmatning med standardklasser Som du såg i förra exemplen är utskrift i textfönstret i Java relativt enkelt. Inläsning från tangentbordet är krångligare. Främsta skälet till detta är att Java oftast använder grafiska gränssnitt och därför saknar bra standardklasser för konsollprogrammering. String och tecken Följande program läser in och skriver ut två textsträngar: import java.io.*; //Standardpaketet java.io.* innehåller metoder för in- och utmatning. class test3{ public static void main(String args[]) throws IOException{ //Tar hand om fel i readLine() String fnamn, enamn; //Klassen String används (jämför med C++) BufferedReader in=new BufferedReader(new InputStreamReader(System.in));//krångligt System.out.print("Ange ett förnamn: "); fnamn=in.readLine(); //Förnamnet läses in System.out.print("Ange ett efternamn: "); enamn=in.readLine(); //Efternamnet läses in System.out.println("Du matade in namnet " + fnamn + " " + enamn); } } Vad den krångliga raden som skapar (objekt-) strömmen in för inläsning egentligen innebär bryr vi oss inte om. Enskilda tecken (char) plockas enklast ur en inläst string: System.out.print("Ange en tecken: "); String s=in.readLine(); System.out.println("Du matade in tecknet " + s.charAt(0)); //Ger strängens första tecken String-metoden s.charAt(n) plockar ut n:te tecknet ur strängen s. Följande metoder finns för hantering av strängar, d v s metoder i klassen String: str.length() str.charAt(n) str.substring(n) str.substring(n,m) str.compareTo(str2) str.equals(str2) str.equalsIgnoreCase(str2) str.startsWith(str2) str.startsWith(str2,n) str.endsWith(str2) str.indexOf(c) str.indexOf(c,n) str.lastIndexOf(c) str.lastIndexOf(c,n) str.indexOf(str2) str.indexOf(str2,n) str.lastIndexOf(str2) str.lastIndexOf(str2,n) str.trim() str.replace(c1,c2) str.toUpperCase() str.toLowerCase() String.valueOf(x) 875099958 //ger antalet tecken i str //ger tecknet i position n //ger den delsträng som börjar i position n //ger den delsträng som börjar i position n och slutar i m-1 //ger 0 om str = str2 , <0 om str kommer före str2 annars >0 //true om str och str2 är lika, annars false //samma som ovan, men skiljer inte på stora och små bokstäver //true om str inleds med strängen str2, annars false //true om strängen str2 börjar i position n i str, annars false //true om str avslutas med strängen str2, annars false //ger första positionen om tecknet c finns i strängen str, annars -1 //letar från position n efter första platsen för tecknet c //ger sista positionen om tecknet c finns i strängen str //letar från position n efter sista platsen för tecknet c //ger första positionen för delsträngen str2 i str //letar från position n efter första platsen för strängen str2 //ger sista positionen om delsträngen str2 finns i strängen str //letar från position n efter sista platsen för delsträngen str2 //returnerar str utan inledande och avslutande blanktecken //ersätter alla tecken c1 med tecken c2 (å, ä och ö går ej att ersätta) //ändrar till enbart stora bokstäver //ändrar till enbart små bokstäver //omvandlar x till en sträng (x är enkel taltyp: int , double osv) 92 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Heltal och decimaltal All inläsning görs som strängar och omvandlas sedan till t ex integer eller double. Följande program läser in och skriver ut hel- och decimaltal: import java.io.*; class test3{ public static void main(String args[]) throws IOException{ int i; double d; String s; BufferedReader in=new BufferedReader(new InputStreamReader(System.in)); System.out.print("Ange ett heltal: "); s=in.readLine(); i=Integer.parseInt(s); //Omvandlar sträng till heltal System.out.println("Du matade in heltalet " + i); System.out.print("Ange ett decimaltal: "); s=in.readLine(); d=Double.parseDouble(s); //Omvandlar sträng till decimaltal System.out.println("Du matade in decimaltalet " + d); } } Metoderna parseInt(s) och parseDouble(s) tillhör klasserna Integer respektive Double. Inläsning till heltal direkt kan göras med följande sats: int antal=Integer.parseInt(in.readLine()); Avrundning Även avrundning är ganska krånkligt i Java. Följande program avrundar till tre decimaler: import java.io.*; import java.text.*; //Klassen NumberFormat finns i detta paket class test3{ public static void main(String args[]) throws IOException{ double d=3.823456; NumberFormat r = NumberFormat.getInstance(); //Instans av redigerare r r.setMaximumFractionDigits(4); //Formaterar utrskrift till högst 4 decimaler System.out.println("Med fyra decimaler: " + r.format(d) ); //Omvandlar decimaltalet d till //en sträng med 4 decimaler } } Heltalsdivision Fungerar på samma sätt som i C++, d v s är båda termerna heltal blir kvoten ett heltal. Problemet löses med casting, d v s omtypning. ASCII-kod ASCII-koden erhålls i Java liksom i C++ genom omtypning av ett tecken: String s="Anders"; System.out.println("ASCII-koden för femte tecknet: " + (int)s.charAt(4)); Tecknet för motsvarande ASCII-kod fås på omvänt sätt: int i=232; System.out.println("Tecknet är: " + (char)i); 875099958 93 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Matematiska funktioner Klassen Math i Java har några metoder (funktioner) som C++ saknar. Följande program visar vilka: import java.io.*; import java.lang.*; //Innehåller klassen Math. Paketet behöver inte importeras, finns alltid med. class test3{ public static void main(String args[]) throws IOException{ System.out.println(Math.PI); //Ger pi med 15 decimaler System.out.println(Math.pow(5,2)); //25.0 System.out.println(Math.sqrt(49)); //7.0 System.out.println(Math.random()); //Slumptal mellan 0-1. ’Blandas’ automatiskt. System.out.println(Math.max(5,8)); //8 System.out.println(Math.min(5,8)); //5 System.out.println(Math.round(5.5)); //6 } } Observera att klassnamnet Math måste föregå metodanropet. Nedan följer en sammanställning av de matematiska metoderna: Math.abs(a) Math.max(a,b) Math.min(a,b) Math.PI Math.E Math.exp(x) Math.log(x) Math.sqrt(x) Math.ceil(x) Math.floor(x) Math.pow(x,y) Math.round(x) Math.random() Math.sin(x) Math.cos(x) Math.tan(x) Math.asin(x) Math.acos(x) Math.atan(x) //absolutvärdet eller beloppet av talet a //ger det största av talen a och b //ger det minsta av talen a och b //talet //talet e = 2,7… //ger ex //ger naturliga logaritmen av x //ger kvadratroten av x //rundar av uppåt till heltal //rundar av nedåt till heltal //ger xy //avrundar till heltal av typ long //ger slumptal mellan 0 och 1 //x anges i enheten radianer //arcsin(x), motsvarar miniräknarens sin-1. Returnerar ett värde i radianer. Urval och loopar Urval med if och case, samt looparna for och while har samma syntax i Java som i C++. 875099958 94 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Fält (array) Ett fält (vektor, array) kan initieras på två sätt i Java: 0 1 2 3 100 200 255 187 int[] x={100, 200, 255, 187}; Eller så här: X: int[] x=new int[4]; x[0]=100; x[1]=200; x[2]=285; x[3]=187; Följande sats innebär att x och y refererar till samma fält: y=x; Vill man istället kopiera innehållet i fältet x till ett nytt fält y görs detta med standardmetoden clone: y=(int[]) x.clone(); I Java är fält dynamiska så till vida att storleken kan anges vid exekveringen (jämför med pekare i C++). Dessutom innehållet klassen Arrays metoder för bl a sortering, sökning och jämförelse av fält. Följande program illustrerar hur en vektor fylls med hela slumptal mellan , sorteras i stigande ordning, samt slutligen skrivs ut igen: import java.io.*; import java.lang.Math; import java.util.Arrays; //Importerar klassen Arrays för att kunna sortera fältet nedan class test3{ public static void main(String args[]) throws IOException{ int [] a=new int[10]; //Deklarerar fältet med new (påminner om pekare i C++) for (int i=0;i<10;i++) a[i]=(int)(Math.random()*5)+1; //Fyller fältet med slumptal mellan 1 och 5 Arrays.sort(a); //Sorterar fältet i stigande ordning for (int i=0;i<10;i++) System.out.println(a[i]); } } Sortering av strängar görs på liknande sätt. Sorteringen fungerar dock endast om hela det deklarerade fältet är fyllt. Deklarationen av fältet görs därför efter inläsningen av fältets storlek: System.out.print("Ange hur många namn som skall matas in: "); int antal=Integer.parseInt(in.readLine()); //Omvandling till heltal görs direkt String [] a=new String[antal]; Klassen Arrays innehåller bl a följande användbara metoder: a.length Arrays.equals(a,b) Arrays.fill(a,b) Arrays.fill(a,m,n,b) Arrays.sort(a) Arrays.sort(a,m,n) binarySearch(a,b) //Ger antalet komponenter i a (tillhör ej klassen Arrays) //Returnerar true om fälten a och b är lika (komponenter och antal) //Ger alla komponenterna i fältet a värdet b //Returnerar komponenterna nr m till n-1 I fältet a värdet b //Sorterar komponenterna i a i stigande ordning //Sorterar komponenterna nr m till n-1 i a i stigande ordning //Söker efter variabeln b i fältet a. Returnerar b:s index om den finns, annars -1 Övning 1.1: Skriv ett program som skriver ut följande textsträng på skärmen: Detta är kul. Detta är kul. Detta är kul. 875099958 95 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Övning 1.2: Skriv ett program som läser in ett namn och sedan skriver ut det på skärmen på tre rader: Vad heter du: Anders Andersson Var bor du? Skoghall Du heter Anders Andersson och bor i Skoghall Du heter Anders Andersson och bor i Skoghall Du heter Anders Andersson och bor i Skoghall Övning 1.3: Skriv ett program som beräknar resten vid division mellan två heltal. Programmet skall ha följande utskrift: Ange taljare: 16 Ange namnare: 6 Rest vid division: 4 Heltalsdivision: 2 Kvot med alla decimaler: 2.6666666666666665 Kvot med tre decimaler: 2.667 Övning1.4: Skriv ett program som läser in en textrad och antal gånger som den skall skrivas ut och som sedan skriver ut texten, med följande utskrift: Ange en text: Jag gillar Java Antal gånget texten skall skrivas ut: 4 1: Jag gillar Java 2: Jag gillar Java 3: Jag gillar Java 4: Jag gillar Java Övning 1.5: Skriv ett program som läser in en sträng och som sedan skriver ut antal tecken, texten med versaler, ersätter alla mellanslag (’ ’) med bokstaven ’a’, samt skriver ut texten baklänges, enligt följande exempel: Ange en text: Jag gillar Java Antal tecken: 15 JAG GILLAR JAVA JagagillaraJava avaJ rallig gaJ Övning 1.6: Skriv ett program som läser in två namn och som sedan skriver ut dem i bokstavsordning med en if-sats, med följande utskrifter: Ange första namnet: kalle Ange andra namnet: anders I bokstavsordning: anders kalle Övning 1.7: Skriv ett program som läser in namn och som sedan sorterar dem och skriver ut dem i bokstavsording, med följande utskrifter: Hur många namn skall läsas in: 4 Skriv in namn 1: kalle Skriv in namn 2: eva Skriv in namn 3: anna Skriv in namn 4: bengt 875099958 96 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson I bokstavsordning: anna, bengt, eva, kalle, Övning 1.8: Skriv ett program som beräknar hypoteunsan med Pythagoras sats avrundad till ett heltal, med följande utskrift: Ange ena kateten: 12 Ange andra kateten: 19 Hypotenusan avrundad till heltal: 22 Övning 1.9: 1 1 1 1 1 1 för olika värden på N. Vad blir summan om man ... 2 4 8 16 32 N tar med många termer? Beräkna summan 875099958 97 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson 2. Grafiska metoder Hittills har programmen körts i konsollfönstret. Java har dock stora grafiska möjligheter. Vi skall inledningsvis skapa ett fönster. Sedan fyller vi detta med linjer, polygoner och texter via grafiska metoder. Därefter lär vi oss att hantera grafiska komponenter som knappar och textrutor. Fönster (frame) I Java API (Application Programming Interface) finns paketet java.awt (Abstract Window Toolkit), som innehåller många klasser för hantering av grafik, text, färger och komponenter som knappar och textrutor. Ur detta paket behöver vi strax klasserna Graphics, Font och Color. Vi importerar dem därför med följande satser: import java.awt.Graphics; import java.awt.Font; import java.awt.Color; Eller kortare: import java.awt.*; Paketet java.awt innehåller en klass Frame, som automatiskt öppnar ett fönster när man skapar ett objekt av klassen. Eftersom vårt program skall ha samma egenskaper som klassen Frame, måste det ärva Frame:s egenskaper. Följande program skapar ett fönster: import java.awt.*; import java.awt.event.*; //Krävs för stängning av fönster class anders extends Frame //extends anger att klassen anders ärver av Frame { anders() //Konstruktor för klassen anders { setBackground(Color.yellow); //Anger fönstrets bakgrundsfärg setSize(400,150); //Anger fönstrets storlek addWindowListener(new WindowAdapter() //Kryptisk kod som krävs... { public void windowClosing(WindowEvent e) //...för att kunna stänga fönstret... { System.exit(0); //...via systemknappen. } }); } public static void main(String args[]) //Main-funktionen { anders d=new anders(); //Skapar objektet d av klassen anders (fönstret skapas) d.setTitle("Min första frame"); //Text i titelraden d.setVisible(true); //Fönstret görs synligt med Frame-metoden setVisible } } Färger Färgen kan även anges mer fritt på RGB-format. Ett ”färgobjekt” av klassen Color måste då först skapas: Color c=new Color(200,0,0); setBackground(c); //Skapar objektet c av klassen Color med RGB-färgen (200,0,0) d v s röd Följande färger finns fördefinierade (anges med Color.): black, blue, cyan, gray, darkGray, lightGray, green, magenta, orange, pink, red, white, yellow 875099958 98 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Övning 2.1: Kopiera och modifiera ovanstående programexempel så att bakgrunden får en slumpmässig färg varje gång fönstret öppnas. Ledning: (int)(255*Math.random()). Programmet fungerar som http://web.kristinehamn.se/skola/anders/java/ovn2_1.jar. Övning 2.2: Modifiera föregående övning ytterligar så att även fönstrets storlek öppnas med slumpmässig storlek med maximalt 700 pixlar i båda riktningarna. Programmet fungerar som http://web.kristinehamn.se/skola/anders/java/ovn2_2.jar. Linje i fönster med metoden paint Klassen Graphics innehåller grafiska metoder som bl a ritar streck och polygoner, samt text. Följande program bygger vidare på förra exemplet och ritar en linje i fönstret: import java.awt.*; class test4 extends Frame{ test4() { setBackground(Color.yellow); setSize(400,400); } public void paint(Graphics g){ //Metoden paint anropas automatiskt när fönstret skapas g.setColor(Color.red); //Grafikfärg g.drawLine(100,100,300,300); //Linjen ritas mellan koordinaterna (100, 100) och (300, 300) } public static void main(String args[]) { test4 d=new test4(); d.setVisible(true); } } Observera att metoden paint anropas automatiskt när fönstret skapas eller ändras. Metoden paint kan inte anropas, men omritning av fönster sker med anropet repaint(). Skapa körbar JAR-fil i Eclipse 1. File -> Export. 2. Java -> JAR file. 3. Markera hela projektet. 4. Välj "Export destination", alltså var JAR-filen kommer hamna efter exportering. 5. Tryck Next två gånger. 6. Välj klass som ska exporteras till JAR-fil i fältet "Main Class" . 7. Tryck på Finnish. Övning 2.3: Skriv ett program som ritar 1000 slumpmässigt långa och färgade linjer i ett fönster med storleken 400x400 pixlar. Fönstrets bakgrundsfärg ska vara vit, enligt urklipp till höger. Programmet fungerar som http://web.kristinehamn.se/skola/anders/java/ovn2_3.jar. Svårare uppgift: Rita ut 1000 linjer som är 50 pixlar långa. 875099958 99 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Text i fönster Följande program ritar en linje och lägger in text: import java.awt.*; class test4 extends Frame{ test4() { setBackground(Color.yellow); setSize(400,400); } public void paint(Graphics g){ g.setColor(Color.red); g.drawLine(100,100,300,300); g.drawString("Det funkar!",200,200); //Skriver ut en textsträng o koordinaten (200, 200) } public static void main(String args[]) { test4 d=new test4(); d.setVisible(true); } } Texten som skriv ut är oformaterad, men kan formateras med klassen Font. Följande rad visar ett exempel på hur texten kan formateras med Font-variabeln f (objektet f av klassen Font): Font f=new Font("Arial",Font.BOLD,24); //Typsnitt (ett fåtal stöds), stil, storlek För stilen finns även Font.ITALIC och Font.PLAIN. Kombinationer av olika stilar anges med: Font.BOLD+Font.ITALIC Följande programexempel illustrerar hur det fungerar genom att modifiera föregående exempel: import java.awt.*; class test4 extends Frame{ Font f=new Font("Arial",Font.BOLD,24); //Objektet f av klassen Font deklareras test4() { setBackground(Color.yellow); setSize(400,400); } public void paint(Graphics g){ g.setColor(Color.red); g.drawLine(100,100,300,300); g.setColor(Color.green); //Grafikfärgen ändras för texten g.setFont(f); //Den valda fonten sätts g.drawString("Det funkar!",200,200); } public static void main(String args[]) { test4 d=new test4(); d.setVisible(true); } } 875099958 100 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Följande metoder finns för klassen Graphics: drawLine(x1,y1,x2,y2); drawRect(x,y,b,h); fillRect(x,y,b,h); drawRoundRect(x,y,b,h,m,n) fillRoundRect(x,y,b,h,m,n) draw3DRect(x,y,b,h,upp) fill3DRect(x,y,b,h,upp) drawOval(x,y,b,h) fillOval(x,y,b,h) drawArc(x,y,b,h,s,l) drawPolygon(xp,yp,n) fillPolygon(xp,yp,n) drawString(”Lite text”,x,y) //Ritar en linje mellan koordinaterna (x1, y1) och (x2, y2) //Ritar en rektangel med övre vänstra hörnet i (x, y), bredd b och höjd h //Fyller rektangeln //Rektangel med rundade hörn, där m och n anger rundning //Fyller rundad rektangel //Tredimensionell rektangel, upp är tru elle false //Fyller en tredimensionell rektangel //Ritar en oval //Fyller en oval //Ritar en båge, där s är startpunkt ock I slitpunkt I grader //Ritar en polygon. Koordinaterna (n st) ligger i fälten xp och yp //Fyller polygonen //Skriver ut ”Lite text” i koordinaten x,y Övning 2.4: Modifiera föregående övning så att fönstret fylls med 1000 slumpmässigt utritade och färglagda cirklar med diametern 20 pixlar i ett 400x400 pixlar stort fönster, enligt bilden till höger. Övning 2.5: Skriv ett program som fyller ett 700x700 pixlar stort fönster med 50 trianglar med slumpmässig storlek, placering och färg, enligt urklippet till höger. Programmet fungerar som http://web.kristinehamn.se/skola/anders/java/ovn2_5.jar. *Övning 2.6: Modifiera föregående övning så att fönstret fylls med 10 slumpmässigt utritade och färglagda lika stora pentagoner (femhörningar). Välj själv polygonens antal hörn och utseende i programkoden. Fönstrets bakgrundsfärg skall vara grå. *Övning 2.7: Skriv ett program som fyller en 255x255 pixlar stort fönster med en övertonad gråskala i x-led från svart till vitt, enligt urklppet. En gråskala erhålls om färgkomponenterna R=G=B. 875099958 101 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson *Övning 2.8: I förra övningen bestämde x-koordinaten gråskalan. Gör en liknande övertoning, men där funktionen f x y bestämmer gråskalan. Eftersom RGB-färgen f maximalt är 255 måste funktionen normeras för detta. Om x y x och y är maximalt 255 blir f 255 Programmet fungerar som http://web.kristinehamn.se/skola/anders/java/ovn2_8.jar. 875099958 102 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Instansvariabler med konstruktor och objekt I förra exemplet var linjens ändpunkter i paint-metoden fixerade. Vi vill kunna variera ändpunkternas koordinater är det lämpligt att tilldela dem i main-metoden. Eftersom Java bygger på klasser måste klassen test4 först få instansvariabler (samma som datamedlemmar i C++) för ändpunkterna (x1, y1) och (x2, y2), som kan tilldelas antingen via en konstruktor eller via ett objekt. Nedan visas båda varianterna. Först med konstruktor: import java.awt.*; import java.awt.event.*; class test4 extends Frame{ Font f=new Font("Arial",Font.BOLD,24); int x1,y1,x2,y2; //Instansvariabler test4(int a1,int b1,int a2,int b2) { //Variablerna tilldelas via konstruktorn x1=a1; y1=b1; x2=a2; y2=b2; setBackground(Color.yellow); setSize(400,400); } public void paint(Graphics g){ g.setColor(Color.red); g.drawLine(x1,y1,x2,y2); //Instansvariablerna används i metoden paint g.setColor(Color.green); g.setFont(f); g.drawString("Det funkar!",200,200); } public static void main(String args[]) { int x=0, y=50, v=200, w=250; test4 d=new test4(x,y,v,w); //Konstruktorn anropas d.setVisible(true); } } Följande exempel gör samma sak, men här tilldelas instansvariablerna via objektet d: import java.awt.*; import java.awt.event.*; class test4 extends Frame{ Font f=new Font("Arial",Font.BOLD,24); int x1,y1,x2,y2; test4() { setBackground(Color.yellow); setSize(400,400); } public void paint(Graphics g){ g.setColor(Color.red); g.drawLine(x1,y1,x2,y2); g.setColor(Color.green); g.setFont(f); g.drawString("Det funkar!",200,200); } public static void main(String args[]) { test4 d=new test4(); d.x1=100; //Instansvariablerna tilldelas via objektet d d.y1=50; d.x2=200; d.y2=350; d.setVisible(true); } } 875099958 103 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Inläsning av variabler Följande exempel visar hur koordinaterna läses in i main-metoden. Observera att inläsning och omvandling från string- till int-typ görs i en sats: import java.awt.*; import java.io.*; class test4 extends Frame{ Font f=new Font("Arial",Font.BOLD,24); int x1,y1,x2,y2; test4() { setBackground(Color.yellow); setSize(400,400); } //Objektet f av klassen Font deklareras public void paint(Graphics g){ g.setColor(Color.red); g.drawLine(x1,y1,x2,y2); g.setColor(Color.green); //Grafikfärgen ändras för texten g.setFont(f); //Den valda fonten sätts g.drawString("Det funkar!",200,200); } public static void main(String args[]) throws IOException { BufferedReader in=new BufferedReader(new InputStreamReader(System.in)); test4 d=new test4(); System.out.print("Ange första x-värdet: "); d.x1=Integer.parseInt(in.readLine()); //Inläsning och omvandling görs i en sats. System.out.print("Ange första y-värdet: "); d.y1=Integer.parseInt(in.readLine()); System.out.print("Ange andra x-värdet: "); d.x2=Integer.parseInt(in.readLine()); System.out.print("Ange andra y-värdet: "); d.y2=Integer.parseInt(in.readLine()); d.setVisible(true); } } Övning 2.9: Skriv ett program som läser in övre vänstra hörnets koordinat för en oval, samt ovalens länd och bredd och som sedan ritar den, enligt exemplet till höger. 875099958 104 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Övning 2.10: Skriv ett program som läser in diametern på en cirkel och antal fyllda cirklar som ska ritas ut, enligt urklippet till höger. Övning 2.11: Skriv ett program som frågar efter hur många hörn en polygon skall ha och som sedan läser in x- och y-koordinater och ritar/fyller polygonen. Exemplet till höger visar en plygon i form av en triangel. Ledning: Läs in antal hörn och koordinaterna i main-metoden i en for-loop: test4 d=new test4(); System.out.print("Ange antal hörn: "); d.ant_horn=Integer.parseInt(in.readLine()); for (int i=0;i<d.ant_horn;i++) { System.out.print("Ange x-värdet: "); d.xp[i]=Integer.parseInt(in.readLine()); System.out.print("Ange y-värdet: "); d.yp[i]=Integer.parseInt(in.readLine()); } Samt deklarera tre instansvariabler i klassen test4: int [] xp=new int[10]; int [] yp=new int[10]; int ant_horn; 875099958 //Maximalt tio hörn //Anger antal hörnpunkter 105 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson 3. Applets och grafiska komponenter På följande Youtubelänkar finns bra lektioner (tutorials) i Java. Följande länk innehåller grunderna och denna fortsättningen, där kurs 20 inleder med Java Applets. Han som gjort detta heter thenewboston och har även andra kurser. Hittills har vi skrivit fristående javaprogram, främst för att lära oss grunderna i språkets syntax. Ofta används dock javaprogram i samband med webbsidor och då behövs inte JDK:s javatolk för att köra/interpretera det kompilerade programmet (class-filen), eftersom de vanligaste webbläsarna kan köra javaprogram – s k javaapplets. En applet (förkortning av applikation) är alltså ett fristående javaprogram som kan köras av en webbläsare. Detta innebär att konsolmiljöns inläsningar inte fungerar i applet, där inläsningar istället görs via bl a textrutor. Detta återkommer vi till senare. Applets Koden nedan visa utskrift av klassen Jlabel, som vi gick igenom i kapitel 4 i JavaJavisst: import javax.swing.*; import java.awt.*; public class test4 extends JFrame { JLabel lbl; public test4() { this.setLayout( new FlowLayout() ); lbl = new JLabel("Detta är en JLabel!"); this.add(lbl); lbl.setFont(new Font("Arial",Font.ITALIC ,20)); lbl.setForeground(Color.yellow); lbl.setOpaque(true); lbl.setBackground(Color.blue); } public static void main(String[] args) { test4 f = new test4(); f.setSize(220, 200); f.setLocation(100,100); f.setTitle("Med JFrame"); f.setDefaultCloseOperation(test4.EXIT_ON_CLOSE); f.setVisible(true); } } I följande kod görs samma sak igen, men nu med en javaapplet. För att det ska fungera säkrare i webbläsaren använder vi inte swing-klasserna, utan endast awt-klasserna. De är här ingen större skillnad, men än att versalen ’J’ framför komponenterna JLabel, JButton o.s.v. försvinner: import java.applet.Applet; importeras import java.awt.*; public class testApplet extends Applet{ klassen Applet //Klassen Applet i paketet applet //Klassen testApplet ärver från Label lbl; public void init() { //Metoden init anropas när testApplet skapas I början lbl = new Label("Detta är en JLabel!"); this.add(lbl); lbl.setFont(new Font("Arial",Font.ITALIC ,20)); lbl.setForeground(Color.yellow); lbl.setBackground(Color.blue); } } 875099958 106 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Observera att programmet körs i AppletViewer. Det finns tre huvudsakliga skillnader mellan ett fristående program och en applet: 1. Istället för från standardklassen Frame ärver klassen testApplet sina egenskaper från standardklassen Applet, som har liknande egenskapre som Frame. Fönstret som klassen Applet skapar kan dock inte visas fristående utan webbläsaren. 2. En applet saknar en main-metod. Istället är det webbläsaren som skapar första objektet av klassen testApplet. 3. Klassen testApplet saknar konstruktor. Initieringar görs istället i metoden init. Fönstrets storlek anges i webbläsaren. Programmet kompileras som förut till en class-fil, som exekveras av webbläsaren (se nedan). Appleten kan dock enkelt testköras med programmet AppletViewer, som körs automatiskt i Eclipse (eller via Run/Run As/Java Applet). I TextPad körs den via menyvalet Tools/Run Java Applet. Under menyvalet Applet i AppletViewer finns några funktioner. I webbläsaren körs appleten med följande HTML-kod: <html> <head> <title> Min hemsida </title> </head> <body> Detta är min hemsida. <applet code="testApplet.class" width=”500” height=”300”> </body> </html> Attributet code får filnamnet för appleten, och attributen width och height ger fönstrets storlek. Spara HTML-koden i editeringsprogrammet Anteckningar eller NotePad++ i bin-mappen där class-filen ligger med filändelsen .html (eller .htm) och öppna filen i webbläsaren genom att klicka på filen i bin-mappen. Ett bättre alternativ är att spara HTML-koden på motsvarande sätt i det fria Notepad++, vari webbsidan kan sedan visas via menyvalet Kör/Launch in Firefox/IE/Chrome. Programmet Notepad++ laddas ner från http://notepad-plus-plus.org. Prfogrammet ovan är ganska händelselöst. Läggs till följande paint-metod till ritas även grafik. Paint-metoden anropas när html-filen laddas: public void paint(Graphics g) { g.setFont( new Font("Arial",Font.BOLD, 15)); g.setColor( Color.red ); g.drawString("Min applet!", 50, 70); g.drawOval(10,10,150,150); g.setColor( new Color(255,100,0)); g.fillOval((int)(100*Math.random()),(int)(100*Math.random()),40,40); } Provkör testApplet.class igen i html-filen. 875099958 107 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Övning 3.0: a) Kopiera koden ovan så att den ritar 100 slumpmässiga linjer. Spara som ovn3_1.java. b) Kör appleten. Appletviwer visas. c) Skapa en HTML-fil (webbsida) som kan köra appleten. Spara filen under namnet hemsida.html i binmappen där class-filen ligger. d) Prova att öppna webbsidan i de tre olika webbläsarna. Öppnas appleten i alla tre? e) Experimentera med några olika värden på width och height för appletfönstrets storlek. Övning 3.1: Gör på motsvarande sätt appletar och webbsidor som rita slumpmässigt: a) 100 linger b) 100 cirklar. c) 50 trianglar. d) *som tonar fönstret horisontellt. e) *som tonar fönstret diagonalt. Övning 3.2: a) Gör om några uppgifter till javaapplets du gjort tidigare i avsnitten 0.4 och 0.5 ovan som innehåller knappar, textrutor och fraktaler. Kolla gärna i kapitel 6 i JavaJavisst. b) Skapa en html-sida och länka src-filen. c) Överför html-sidan och src-filen till en webbserver och öppna sidan på Internet med en webbläsare. Nu kan alla i hela världen köra din applet! 875099958 108 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Parametrar i HTML-koden Parametrar (variabler) i appleten kan anges i HTML-koden. I följande exempel anges texten som skall skrivas ut i appleten, samt textens storlek i HTML-koden. Först visas HTML-koden: <html> <head> <!--Kommentar i HTML--> <title> Min hemsida </title> </head> <body> Detta är min hemsida. <applet code="test4.class" width=500 height=300> <param name="t" value="Anders sida"> <!--parametern t får värdet ”Detta är texten”--> <param name="storlek" value="20"> <!--parametern storlek får värdet 80--> </body> </html> Javaprogrammet läser in värdet på parametrarna t och storlek från HTML-filen: import java.applet.Applet; import java.awt.*; public class test4_app extends Applet{ Font f; String text, textstorlek; int storlek; public void init() { textstorlek=getParameter("storlek"); //Värdet på parametern storlek hämtas till textstorlek storlek=Integer.parseInt(textstorlek); f=new Font("Arial",Font.BOLD,storlek); text=getParameter("t"); //Värdet på parametern t hämtas till variabeln text setBackground(Color.yellow); } public void paint(Graphics g){ g.setColor(Color.blue); g.drawLine(100,100,300,300); g.setColor(Color.red); g.setFont(f); g.drawString(text,50,100); } //Grafikfärgen ändras för texten //Den valda fonten sätts //Texten skrivs ut via variabeln text } All hantering av grafik läggs alltså i metoden paint. Övning 3.3: Skriv och provkör en applet som ritar ut ett antal slumpmässigt placerade fyllda cirklar med slumpmässig färg. Antalet cirklar och cirklarnas storlek skall anges som parametrar i HTML-koden. Modifiera förslagsvis uppgift 2.4. I det förminskade urklippet till höger är det fem cirklar med diametern 40 pixlar. 875099958 109 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Grafiska komponenter Kommunikationen med javaprogram sker ofta via grafiska komponenter av samma typ som i Visual Basic. Java har för detta ett antal standardklasser för grafiska komponenter, såsom t ex knapp, label (etikett), kryssruta, alternativknapp, listruta, textruta och rullningslist. Samtliga klasser finns i paketet java.awt.*. Vi kommer nedan att ta upp dessa standardklasser och hur olika händelser hanteras, t ex knapp- och tangenttryckningar och musklickningar. Knapp Knappar skapas av klassen Button. Programmet nedan innehåller två knappar, som byter till röd respektive grön färg på bakgrunden: import java.applet.Applet; import java.awt.*; public class test4 extends Applet{ public void init() { setBackground(Color.yellow); Button knappA=new Button("Röd"); add(knappA); Button knappB=new Button("Grön"); add(knappB); } public boolean action(Event evt,Object arg) { String text=(String)arg; if (evt.target instanceof Button) { if (text.equals("Röd")) setBackground(Color.red); if (text.equals("Grön")) setBackground(Color.green); } return true; } //Objektet knappA skapas med texter Röd //Knappen läggs ut i webbfönstret //Motsvarande för knapp med text Grön //action reagerar på en händelse //arg innehåller knappens (komponentens) text //evt kollar typ av komponent (klass) } Observera att knapparna centreras i fönstret från vänster i den ordning de skapas. Senare kommer vi att placera ut dem på ett sätt vi själva väljer. Vi modifierar programmet så att en slumpmässig färg används när knappB aktiveras. Koden för detta läggs lämpligen i en egen metod slumpfarg. Programmet får då följande utseende: import java.applet.Applet; import java.awt.*; public class test4 extends Applet{ public void init() { setBackground(Color.yellow); Button knappA=new Button("Röd"); add(knappA); Button knappB=new Button("Slumpfärg"); add(knappB); } public void slumpfarg(){ int r=(int)Math.round(255*Math.random()); 875099958 110 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson int g=(int)Math.round(255*Math.random()); int b=(int)Math.round(255*Math.random()); Color c=new Color(r,g,b); setBackground(c); } public boolean action(Event evt,Object arg){ String text=(String)arg; if (evt.target instanceof Button){ if (text.equals("Röd")) setBackground(Color.red); if (text.equals("Slumpfärg")) slumpfarg(); } return true; } } Klassen Button har två konstruktorer för knappen k: Button k=new Button(); Button k=new Button(”Tryck”); //Ger en textlös knapp //Ger knappen texten Tryck Nedan visas några användbara metoder för knappen k: k.setLabel(”Text”); String texten=k.getLabel(); //Placerar texten Text på knappen //Returnerar knapptexten till variabeln texten Textruta Textrutor skapas av klassen TextField. I programmet nedan färgas bakgrunden av den färg (r, g, b, y) som matas in i textrutan: import java.applet.Applet; import java.awt.*; public class test4 extends Applet{ TextField rutan1; //rutan1 global public void init() { setBackground(Color.yellow); Button knappA=new Button("Textfärg"); add(knappA); Button knappB=new Button("Slumpfärg"); add(knappB); rutan1=new TextField("Skriv här",10); add(rutan1); } //Objektet rutan1 skapas //Placerar textrutan I fönstret public void slumpfarg(){ int r=(int)Math.round(255*Math.random()); int g=(int)Math.round(255*Math.random()); int b=(int)Math.round(255*Math.random()); Color c=new Color(r,g,b); setBackground(c); } public void textfarg(){ if (rutan1.getText().equals("g")) setBackground(Color.green); if (rutan1.getText().equals("r")) setBackground(Color.red); if (rutan1.getText().equals("b")) 875099958 111 //Metoden getText() returnerar texten i textrutan Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson setBackground(Color.blue); if (rutan1.getText().equals("y")) setBackground(Color.yellow); } public boolean action(Event evt,Object arg){ String text=(String)arg; if (evt.target instanceof Button){ if (text.equals("Textfärg")) textfarg(); if (text.equals("Slumpfärg")) slumpfarg(); } return true; } //Metoden textfärg anropas } Klassen TextField har några olika konstruktorer för en textruta t: TextField t=new TextField(); TextField t=new TextField(10); TextField t=new TextField("Skriv här"); TextField t=new TextField("Skriv här",n); //Ger ett tomt textfält //Ger ett textfält med plats för 10 tecken //Ger ett textfält med texten ”Skriv här” //Ger ett textfält med texten ”Skriv här” och med n positioner Nedan visas några användbara metoder för textrutan t: t.SetColumns(n) String texten=t.getText(); t.SetText(”Detta står i textrutan”); t.setEchoChar(’*’); t.selectAll(); t.select(i,j); texten=t.getSelectedText(); //Antal teckenpositioner sätts till n //Textrutans innehåll returneras alltid som typen String //Tilldelar textrutan en text //Hemlig text, en ’*’ visas istället för tecknen //All text markeras //Tecknen i till j markeras //Returnerar markerad text Etikett (label) Etiketter skapas av klassen Label. I programmet nedan skrivs innehållet i textrutan ut högerjusterat i en label när knappen aktiveras: import java.applet.Applet; import java.awt.*; public class test4 extends Applet{ TextField te; Label la; public void init() { setBackground(Color.yellow); Button knappA=new Button("Tryck"); add(knappA); te=new TextField("Skriv här",10); add(te); la=new Label("Detta är en label",Label.RIGHT); //Etiketten la skapas högerjusterad add(la); } public boolean action(Event evt,Object arg){ String text=(String)arg; if (evt.target instanceof Button){ if (text.equals("Tryck")) la.setText(te.getText()); //Texten i textrutan tilldelas etiketten } return true; } } 875099958 112 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Klassen Label har två konstruktorer för etiketten e: Label e=new Label(”Text i etikett”); Label e=new Label(”Text i etikett”,Label.RIGHT); //Skriver ut texten vänsterjusterad i etikettens textyta //Skriver ut texten högerjusterad; Label.RIGHT, //Label.LEFT och Label.CENTER finns Nedan visas några användbara metoder för etiketten e: e.setText(”Text”); String texten=e.getText(); e.setAligment(Label.CENTER); //Placerar texten Text i etiketten //Returnerar etiketttexten till variabeln texten //Centrerar texten Egenskaper hos komponenter Komponenternas färg, text, storlek och läge kan påverkas av bl.a. samma metoder som vi använt för hela fönstret: setBackground(c); setForegrund(c); setFont(f); setVisible(true/false); setSize(bredd, höjd); setLocation(x,y); //Påverkar bakgrundsfärg hos text och knapp //Påverkar textfärg //Anger textstil och storlek //Komponenten döljs med false //Anger komponentens bredd och höjd i pixlar. Görs efter initieringen i t ex paint //Placerar komponenten med övre vänstra hörnet i koordinaten (x,y) i t ex paint Nedan visas några exempel på färg- och textändringar för knapp, textruta och etikett: TextField t = new TextField("Skriv här!",10); Label e = new Label("Grön:",Label.RIGHT); Button b = new Button("Tryck"); Font f=new Font("Arial",Font.BOLD,24); Color c=new Color(200,200,0); e.setFont(f); //Etikettens text anges b.setVisible(false); //Knappen döljs e.setForeground(Color.green); //Etikettens text blir grön e.setBackground(c); //Etikettens bakgrund får färgen c t.setBackground(Color.blue); //Textrutans bakgrundsfärg blir blå e.setSize(50,15); //Etiketten får längden 50 och höjden 15 pixlar e.setLocation(10,100); //Lägger etiketten med övre vänstra hörnet i koordinaten (10,100) Övning 3.2: Skriv och kör en applet via ett HTML-dokument läser in och beräknar summan av två decimaltal, enligt urklippet intill. Ledning: Använd Double.parseDouble(text); för omvandling från text till double och String.valueOf(x) för omvandling från typen double till text. Körning via applet: http://web.kristinehamn.se/skola/anders/java/ovn3_2.html. Övning 3.3: Modifiera föregående applet så att den istället beräknar hypotenusan till två inmatade kateter. 875099958 113 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Övning 3.4: Skriv ett program där bakgrundsfärgen anges i tre textrutor på RGB-format (0-255). Använd Integer.parseInt(x); för omvandling från text till heltal. Följande skall gälla (se även urklipp): Textfärgen på etiketten och i textrutan skall vara röd, grön respektive blå. Etiketternas bakgrundsfärg skall vara samma som fönstrets bakgrundsfärg. Texten skall vara 24 p fet. Anropa appleten via en hemsida, exempelvis så här: http://web.kristinehamn.se/skola/anders/java/ovn3_4.html Övning 3.5: Gör HiLo-spel i form av en javaapplet, d.v.s appleten genererar ett slumptal som man ska försöka att gissa rätt på. Programmet räknar även antalet gissningar och det fungerar enligt http://web.kristinehamn.se/skola/anders/java/ovn3_5.html. Rullningslist (scrollbar) Rullningslisten skapas av klassen Scrollbar. I programmet nedan skrivs läget hos rullningslisten ut i en etikett: import java.applet.Applet; import java.awt.*; public class test4 extends Applet{ Label la; Scrollbar rull; public void init() { setBackground(Color.yellow); rull=new Scrollbar(Scrollbar.HORIZONTAL,50,10,0,110); //Rullningslistens konstruktor add(rull); la=new Label("50",Label.RIGHT); add(la); } public boolean handleEvent(Event evt){ //handleEvent hanterar händelser från rullningslist if (evt.target instanceof Scrollbar) la.setText(String.valueOf(rull.getValue())); //Läget hos rullningslisten skrivs ut i label return true; } } Observera att metoden action inte fungerar för rullningslister. Istället används metoden handleEvent. Klassen Scrollbar har följande konstruktor för rullningslisten r: Scrollbar r=new Scrollbar(Scrollbar.HORIZONTAL,position,knappbredd,min,max); 875099958 114 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Positionen avläses vid knappens vänstra sida (undre sida vid Scrollbar.VERTICAL). Om exempelvis min=0, max=100 och knappbredd=10 blir maximala positionen 90 när knappen ligger längst till höger. Nedan visas några användbara metoder för rullningslisten r: r.getValue(); r.setValue(n); r.getMaximum() r.getMinimum() //Ger position hos rullningslistens knapp som heltal //Sätter rullningslistens knapp till positionen n (heltal, även negativt) //Ger maxvärdet //Ger minvärdet Övning 3.6: Skriv ett program med tre rullningslister, med vilka bakgrundsfärgen kan justeras (0-255). Vald färg skrivs ut i respektive etikett på RGB-form. Etikettfärgen skall dessutom vara röd, grön och blå, samt deras bakgrundsfärg samma som fönstrets bakgrundsfärg, enligt urklippet till höger. Appleten fungerar enligt http://web.kristinehamn.se/skola/anders/java/ovn3_ 6.html. Övning 3.7: Skriv en applet som ritar ett antal slumpmässigt utplacerade cirklar, enligt urklippet till höger. Cirklarnas diameter (0-100 pixlar) och antal (0100) anges med två rullningslister. Ritningen sker i metoden paint, som anrops med metoden repaint(). Appleten fungerar enligt http://web.kristinehamn.se/skola/ander s/java/ovn3_7.html. 875099958 115 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson 4. Mus- och tangenthändelser I förra kapitlet hanterades händelser vid knapptryckningar och ändringar hos en rullningslist. I detta kapitel skall vi ta hand om händelser hos mus och tangenter. Mushändelser Följande metoder hanterar händelser hos musen: mouseDown(Event evt, int x, int y) mouseUp(Event evt, int x, int y) mouseMove(Event evt, int x, int y) mouseDrag(Event evt, int x, int y) mouseEnter(Event evt, int x, int y) mouseExit(Event evt, int x, int y) //Ger markörens koordinat när en musknapp trycks ned //Ger markörens koordinat när en musknapp släpps upp //Ger markörens koordinat när musen rör sig //Samma som föregående, men när en musknapp är nedtryckt //Ger markörens koordinat när musen kommer in i fönstret //Ger markörens koordinat när musen lämnar fönstret Programmet nedan skriver ut markörens koordinat när musknappen trycks ned, släpps upp respektive när musen rör sig i tre olika etiketter: import java.applet.Applet; import java.awt.*; public class test4 extends Applet{ Label l1,l2,l3; public void init() { l1=new Label("MouseDown x=000 y=000",Label.LEFT); add(l1); l2=new Label("MouseUp x=000 y=000",Label.LEFT); add(l2); l3=new Label("MouseMove x=000 y=000",Label.LEFT); add(l3); } public boolean mouseDown(Event evt, int x, int y){ l1.setText("MouseDown x="+String.valueOf(x)+" y="+String.valueOf(y)); return true; } public boolean mouseUp(Event evt, int x, int y){ l2.setText("MouseUp x="+String.valueOf(x)+" y="+String.valueOf(y)); return true; } public boolean mouseMove(Event evt, int x, int y){ l3.setText("MouseMove x="+String.valueOf(x)+" y="+String.valueOf(y)); return true; } } 875099958 116 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Override på update Följande program skriver ut markörens koordinat med ritmetoden drawString där musknappen trycks ned: import java.applet.Applet; import java.awt.*; public class test4 extends Applet{ int x1,y1; //Globala variabler public void paint(Graphics g){ g.drawString("x="+String.valueOf(x1)+" y="+String.valueOf(y1),x1,y1); } public boolean mouseDown(Event evt, int x, int y){ x1=x; y1=y; repaint(); //Anropar metoden paint return true; } } Observera att den gamla koordinaten raderas vid varje ny musklickning. Detta beror på att metoden repaint även anropar metoden update, som målar över all grafik (dock inte komponenter som knappar och etiketter) med bakgrundsfärgen. Genom att göra en omdefiniering av update så att den anropar paint utan att rita om bakgrunden, kommer även de gamla koordinaterna att visas. Att omdefiniera en metod kallas override. Följande program visar hur det fungerar: import java.applet.Applet; import java.awt.*; public class test4 extends Applet{ int x1=50, y1=50; //Startkoordinater för paint, som anropas när fönstret skapas public void paint(Graphics g){ g.drawString("x="+String.valueOf(x1)+" y="+String.valueOf(y1),x1,y1); } public void update(Graphics g){ paint(g); } //override på update public boolean mouseDown(Event evt, int x, int y){ x1=x; y1=y; repaint(); return true; } } Originalversionen av update har följande utseende: public void update(Graphics g){ g.setColor(getBackground()); g.fillRect(0,0,width,height); g.setColor(getForeground()); paint(g); } 875099958 117 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Övning 4.1: Skriv ett program som ritar ut en röd cirkel med diametern 20 punkter när musknappen klickas, enligt urklippet. Appleten fungerar enligt http://web.kristinehamn.se/skola/anders/java/ovn4_1.html. Övning 4.2: Skriv ett program som ritar en linje mellan två punkter som klickar med musen. Appleten fungerar enligt http://web.kristinehamn.se/skola/anders/java/ovn4_2.html. Övning 4.3: Skriv ett program som ritar en gul rektangel med röd ram med diagonalen mellan de två klickade punkterna. Observera att rekrangeln omges av en röd linje, samt att det inte spelar någon roll hur punkterna klickas, d v s om nedre eller övre punkten klickas först. Ledning: Använd funktionerna Math.min() och Math.abs(). Appleten fungerar enligt http://web.kristinehamn.se/skola/anders/java/ovn4_3.html. *Övning 4.4: Modifiera föregående övning så att rektangeln ritas ut i ’realtid’ med musknappen nedtryckt. Det skall även fungera att minska rektangelns storlek. När musknappen släpps och en ny rektangelpåbörjas raderas den gamla. Ledning: Gör inte override på update. Appleten fungerar enligt http://web.kristinehamn.se/skola/anders/java/ovn4_4.html. Övning 4.5: Skriv ett program där man kan rita med musen när en knapp är nedtryckt. Appleten fungerar enligt http://web.kristinehamn.se/skola/anders/java/ovn4_5.html. 875099958 118 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Rita utan paint Metoden paint anropas automatiskt när appleten startas. Ibland ställer detta till problem, t ex när variabler i paint ännu inte är initierade. Därför är det bättre att lägga kod som ritar figurer i en egendefinierad metod, som anropas från t ex en musmetod. Detta illustreras i följande exempel, där en kvadrat ritas ut vid varje musklickning. Programmet innehåller även en knapp som raderar fönstret: import java.applet.Applet; import java.awt.*; public class test4 extends Applet{ Button knapp; //Raderaknappen Graphics g; //Deklarera objektet g av klassen Graphics public void init() { g=getGraphics(); //Skapar objektet g. Observera get istället för new setBackground(Color.yellow); knapp=new Button("Radera"); add(knapp); } public boolean action(Event evt,Object arg){ repaint(); return true; } //Reagerar på knappen //Ritar om fönstret, d v s raderar public void rita(int x1, int y1){ g.setColor(Color.red); g.fillRect(x1-10,y1-10,20,20); } //Egen metod rita som ritar //Fyller en rektangel med markör i mitten public boolean mouseDown(Event evt, int x, int y){ rita(x,y); //Anropar egna funktionen rita. Skickar med x och y. return true; } } Observera att programmet innehåller den egendefinerade metoden rita, som ritar ut en kvadrat. Övning 4.6: Modifiera exemplet ovan så att fönstret raderas om markören klickar på en koordinat då x<5 och y<5 eller om markören ligger utanför fönstret (använd mouseExit). Appleten fungerar enligt http://web.kristinehamn.se/skola/anders/java/ovn4_6.html. Övning 4.7: Skriv ett program där man kan rita polygoner genom att klicka i hörnen med musen. Polygonen ritas när det sista hörnet klickas. Antal hörn matas in i textrutan. Det skall även finnas en knapp som raderar fönstret. Appleten fungerar enligt http://web.kristinehamn.se/skola/anders/java/ovn4_7.html. 875099958 119 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Tangenthändelser Händelserna keyDown(Event evt, int key) och KeyUp(Event evt, int key) hanterar tangenttryckningar. Parametern key anger ASCII-koden för den nedtryckta tangenten och evt används för att kolla om Alt-, Ctrl- eller Skift-tangenten är nedtryckt: if (evt.controlDown()) if (evt.shiftDown()) if (evt.metaDown()) //true om Ctrl-tangen är nedtryckt //true om Skift-tangen är nedtryckt //true om Alt-tangen är nedtryckt Följande exempel skriver ut ASCII-koden och tecknet för den nedtryckta tangenten: import java.applet.Applet; import java.awt.*; public class test3 extends Applet{ String s=""; public void paint(Graphics g){ g.drawString(s,50,50); } public boolean keyDown(Event evt, int key){ s="ASCII-kod: "+String.valueOf(key)+" Tecken: "+(char)key; repaint(); return true; } } Observera att man måste klicka på appleten med musen en gång innan tangenthändelserna aktiveras. Det går heller inte att använda tangenthändelserna för att skriva ut text i komponenterna textrura och etikett. För vissa tangenter som saknar ASCII-kod, t ex piltangenterna, finns specialtecken: Event.HOME Event.END Event.PGUP Event.PGDN Event.UP Event.DOWN Event.LEFT Event.RIGHT //Home-tangenten //End-tangenten //Page Up-tangenten //Page Down-tangenten //Pil upp-tangenten //Pil ned-tangenten //Pil vänster-tangenten //Pil höger-tangenten Specialtecknen används på följande sätt: if(key==Event.LEFT) //Kollar om tangenten för pil vänster är nedtryckt Övning 4.8: Gör en applet där du kan flytta runt en kvadrat på skärmen med piltangenterna. Övning 4.9: Gör en applet där du kan rita en figur med pitangenterna med en liten punkt som penna. Trycker man på ’f’-tangenten kan flytta punkten på skärmen utan att det ritas ett streck. Trycker man på ’r’-tangenten ritar punkten ett streck efter sig när den flyttas. 875099958 120 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson 5. Animering med trådar Innan vi börjar animera skall vi presentera sex huvudmetoder som finns i klassen Applet (utom run). Två av dem, init och paint, har vi använt tidigare: init() Detta är den första metoden som körs när appleten laddas i webbläsaren. Här görs initieringar av t ex komponenter, globala variabler och av bakgrundsfärg. start() Efter att init anropats körs metoden start. Den används för att starta någon aktivitet, t ex en animering (se nedan). run() Metoden anropas efter att en aktivitet startats i metoden start, t ex att en tråd har startats (finns i gränssnittet Runnable, se nedan). stop() …kan användas för att stoppa en aktivitet. Metoden anropas automatisk när användaren lämnar webbsidan. Metoden används sällan i program. paint(Graphics g) Här placeras grafikrutinera för att rita på appleten. Metoden anropas automatiskt när appleten startas och när fönstrets storlek eller läge förändras. I tidigare exempel (s. 30) har vi visat hur man kan rita utan paint genom att deklarera en egen metod. destroy() Denna metod anropas automatiskt när appleten avslutas och webbfönstret stängs och frigör då allt allokerat minne. Metoden används sällan i program. Trådar och multitasking När ett program befinner sig i en loop är det normalt helt uppslukat av vad som händer i loopen och kan inte påverkas utifrån. Exempelvis går det inte att avbryta en loop via en knapptryckning. Med trådar (threads) kan man emellertid använda sig av s k multitasking, d v s programmet får då förmågan att reagera på yttre händelser trots att det är upptaget av en loop. För att detta skall fungera i Java måste vi införa gränssnittet Runnable, som innehåller metoder för trådar. Först något om multipelt arv i Java. Multipelt arv och gränssnitt i Java I C++ använde vi ibland multipelt arv. Detta innebär att en klass kan ärva från flera klasser. I Java däremot kan en klass ärva från endast en klass (via extends). Java har dock begreppet gränssnitt, som är en samling av metoder som kan ’ärvas’ via kommandot implements. Klassen Thread och gränssnittet Runnable Klassen Thread har några metoder för att starta och stänga av trådar: Thread trad; trad.start(); trad.stop(); trad.suspend(); trad.resume(); Startar en tråd Stoppar en tråd Deaktiverar en tråd, d v s pausar tråden Återstartar en deaktiverad tråd Observera att dessa start och stop inte är samma som tillhör klassen Applet. I följande exempel ärver klassen test4 egenskaperna från klassen Applet, samt implementerar gränssnittet Runnable, 875099958 121 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson som innehåller metoden run. Programmet flyttar en cirkel över skärmen, som kan placeras där markören klickas. Animeringen kan pausas och omstartas: 875099958 122 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson import java.applet.Applet; import java.awt.*; public class tradar extends Applet implements Runnable{ Thread trad; int x1=10,y1=100; Button start,stopp; public void init() { start=new Button("Starta"); stopp=new Button("Stoppa"); add(stopp); add(start); trad=new Thread(this); } public void start(){ trad.start(); } public void run(){ while (true) { x1++; repaint(); try {Thread.sleep(5);} catch (InterruptedException e){} } } //Metoden paint anropas när fönstret ritas om. //Skapar en fördröjning på 10 ms public void paint(Graphics g){ g.fillOval(x1,y1,20,20); } public boolean action(Event evt,Object arg){ String text=(String)arg; if (evt.target instanceof Button) if (text.equals("Stoppa")) trad.suspend(); if (text.equals("Starta")) trad.resume(); return true; } public boolean mouseDown(Event evt, int x, int y){ x1=x; y1=y; return true; } //Flyttar cirkel till koordinat x1, y1. } Övning 5.1: Gör en applet som flyttar runt en cirkel slumpmässigt på skärmen med en fördröjning på 100 ms. Appleten fungerar enligt http://web.kristinehamn.se/skola/anders/java/ovn5_1.html. Övning 5.2: Modifiera föregående program så att flyttningen kan startas respektive stoppas via två knappar. Appleten fungerar enligt http://web.kristinehamn.se/skola/anders/java/ovn5_2.html. 875099958 123 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Övning 5.3: Gör en applet som ändrar bakgrundsfärgen från rött till blått via en animering. Appleten fungerar enligt http://web.kristinehamn.se/skola/anders/java/ovn5_3.html. Två trådar Vitsen med trådar är ju att kunna köra flera processer samtidigt. Följande exempel visar hur två trådar ’processar’ två bollar oberoende av varandra. Metoden i metoden run avgör vilket tråd som för tillfället är aktiv. Bollarna startas (resume) och stoppas (suspend) med var sin knapp: import java.applet.Applet; import java.awt.*; public class test3 extends Applet implements Runnable{ Thread trad1,trad2; int x1=50,y1=50,x2=100,y2=100,paus; Button start,stopp; boolean tryck1=false, tryck2=false; public void init() { start=new Button("Blå"); stopp=new Button("Röd"); add(stopp); add(start); trad1=new Thread(this); trad2=new Thread(this); } public void start(){ trad1.start(); trad1.suspend(); trad2.start(); trad2.suspend(); } public void stop(){ trad1.stop(); trad2.stop(); } public void run(){ while (true){ if (Thread.currentThread().equals(trad1)){ x1=(int)Math.round(300*Math.random()); y1=(int)Math.round(300*Math.random()); paus=1000; } if (Thread.currentThread().equals(trad2)){ x2=(int)Math.round(300*Math.random()); y2=(int)Math.round(300*Math.random()); paus=500; } repaint(); try {Thread.sleep(paus);} catch (InterruptedException e){} } } public void paint(Graphics g){ g.setColor(Color.red); g.fillOval(x1,y1,20,20); g.setColor(Color.blue); g.fillOval(x2,y2,20,20); } public boolean action(Event evt,Object arg){ 875099958 124 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson String text=(String)arg; if (evt.target instanceof Button) if (text.equals("Röd")){ tryck1=!tryck1; if (tryck1) trad1.resume(); else trad1.suspend(); } if (text.equals("Blå")){ tryck2=!tryck2; if (tryck2) trad2.resume(); else trad2.suspend(); } return true; } } Trådar i egen klass I förra exemplet kördes de båda trådarna i samma run-metod i appleten. Detta är en liten ’halvdan’ parallellprocessering, eftersom trådarna startas samtidigt när run-metoden anropas. Genom att köra trådarna via en klass blir det mer uppenbart att trådarna exeveras parallellt. Följande program fungerar som förra exemplet. Programmet använder dock den egna klassen Boll för trådar och grafik, samt inte gränssnittet Runnable: import java.applet.Applet; import java.awt.*; public class test3 extends Applet { public class Boll extends Thread{ private int x,y,tid; private Graphics gr=getGraphics(); private Color farg; Boll (int a,int b,Color f,int t){ x=a; y=b; farg=f; tid=t; } } //Egna klassen Boll ärver från klassen Thread //Konstruktor för klassen Boll public void run() { while (true){ x++; gr.setColor(farg); gr.fillOval(x,y,20,20); try {Thread.sleep(tid);} catch (InterruptedException e){} gr.setColor(Color.white); //Raderar och ritar om utan repaint gr.fillOval(x,y,20,20); if (x>getWidth()) //Ger fönstrets bredd x=0; } } //Definitionen för klassen Boll slutar Boll b1, b2; Button knappb, knappr; 875099958 //Två Boll-objekt deklareras 125 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson boolean tryck1=false, tryck2=false; public void init() { knappb=new Button("Blå"); knappr=new Button("Röd"); add(knappb); add(knappr); b1=new Boll(0,100,Color.red,10); b1.start(); b1.suspend(); b2=new Boll(0,200,Color.blue,20); b2.start(); b2.suspend(); } public boolean action(Event evt,Object arg){ String text=(String)arg; if (evt.target instanceof Button) if (text.equals("Röd")){ tryck1=!tryck1; if (tryck1) b1.resume(); else b1.suspend(); } if (text.equals("Blå")){ tryck2=!tryck2; if (tryck2) b2.resume(); else b2.suspend(); } return true; } public void stop(){ b1.stop(); b2.stop(); } } Observera att bollarna raderas genom att de ritas om med bakgrundsfärgen innan de ritas i en ny position. Genom att inte använda repaint minskas flimret i animeringen. Övning 5.4: Modifiera exemplet ovan och gör så att en eller några bollar studsar med olika fart mellan fönstrets sidor. Övning 5.5: Gör en applet som innehåller 20 studsande bollar mellan fönstrets sidor. Skapa bollarna via en array och använd klassen Boll i föregående exempel. Bollarnas färg, fart och startposition skall vara slumpmässig. Låt gärna den slumpmässiga färgen i genereras i klassen Boll. 875099958 126 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson 6. Klasser i egna filer Följande exempel använder klassen Test för att skriva ut en sträng. Klassen innehåller även två konstruktorer; en med och en utan parameter: import java.applet.Applet; import java.awt.*; public class test3 extends Applet{ public class Test{ private String namn; //Klassen Test definieras //Instansvariabeln namn deklareras public Test(String n){ namn=n; } //Konstruktor med parameter public Test(){ namn="Kalle Anka"; } //Konstruktor utan parameter public String skriv_namn(){ return namn; } //Metod skriv_namn för utskrift av variabeln namn definieras } //Slut på klassdefinitionen Test t1,t2; public void init() { t1=new Test(); t2=new Test("Musse Pigg"); } //Referensvariablerna (objekten) t1 och t2 deklareras //t1 initieras till att referera till ett objekt av klassen Test //t1 och t2 är en instans av klassen Test public void paint(Graphics g){ g.drawString(t1.skriv_namn()+" och "+t2.skriv_namn(),100,100); } } Egen klassfil Vi modifierar föregående program genom att spara klassen Test i filen Test.java och kompilera den i samma mapp som appleten test3.java. Programmet blir då något kortare: import java.applet.Applet; import java.awt.*; public class test3 extends Applet{ Test t1,t2; public void init() { t1=new Test(); t2=new Test("Musse Pigg"); } public void paint(Graphics g){ g.drawString(t1.skriv_namn()+" och "+t2.skriv_namn(),100,100); } } 875099958 127 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Lösningar Övning 3.2: import java.applet.Applet; import java.awt.*; public class knappar extends Applet{ TextField t1, t2; Label l1, l2, l3; public void init() { setBackground(Color.yellow); l1=new Label("Ange tal 1:",Label.RIGHT); add(l1); t1=new TextField("Skriv här",10); add(t1); l2=new Label("Ange tal 2:",Label.RIGHT); add(l2); t2=new TextField("Skriv här",10); add(t2); Button knappA=new Button("Tryck"); add(knappA); l3=new Label(" ",Label.RIGHT); add(l3); } public void berakna(){ double tal1=Double.parseDouble(t1.getText()); double tal2=Double.parseDouble(t2.getText()); l3.setText(String.valueOf(tal1+tal2)); } public boolean action(Event evt,Object arg){ String text=(String)arg; if (evt.target instanceof Button){ if (text.equals("Tryck")) berakna(); } return true; } } 875099958 128 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Övning 3.4: import java.applet.Applet; import java.awt.*; public class ovn3_4 extends Applet{ TextField t1, t2, t3; Label l1, l2, l3; public void init() { //setBackground(Color.yellow); Font f=new Font("Arial",Font.BOLD,24); l1=new Label("Röd",Label.RIGHT); //Etiketten la skapas högerjusterad l1.setFont(f); l1.setForeground(Color.red); add(l1); t1=new TextField("Skriv här",10); t1.setFont(f); t1.setForeground(Color.red); add(t1); l2=new Label("Grön",Label.RIGHT); l2.setFont(f); l2.setForeground(Color.green); add(l2); t2=new TextField("Skriv här",10); t2.setFont(f); t2.setForeground(Color.green); add(t2); l3=new Label("Blå",Label.RIGHT); l3.setFont(f); l3.setForeground(Color.blue); add(l3); t3=new TextField("Skriv här",10); t3.setFont(f); t3.setForeground(Color.blue); add(t3); Button knappA=new Button("Tryck"); add(knappA); } public void berakna(){ int r=Integer.parseInt(t1.getText()); int g=Integer.parseInt(t2.getText()); int b=Integer.parseInt(t3.getText()); Color c=new Color(r,g,b); setBackground(c); l1.setBackground(c); l2.setBackground(c); l3.setBackground(c); } public boolean action(Event evt,Object arg){ String text=(String)arg; if (evt.target instanceof Button){ if (text.equals("Tryck")) berakna(); } return true; } } 875099958 129 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson Övning 0.13.20 (klicka ballonger). Programmet Klicka_cirkel.java, samt klassen Cirkel3.java: public class Klicka_cirkel extends JPanel implements ActionListener, MouseListener { Cirkel3 c[] = new Cirkel3[5]; Timer t; String s; double tid=0; int x=20,y=20; Font f=new Font("Arial",Font.BOLD,17); public Klicka_cirkel() { setBackground(Color.black); for (int i = 0; i <= 4; i++) c[i] = new Cirkel3(); t = new Timer(30, this); t.start(); Cirkel3.antalboll=5; this.addMouseListener(this); } public void paintComponent(Graphics g) { super.paintComponent(g); g.setFont(f); for (int i = 0; i <= 4; i++) c[i].visa(g); tid=tid+0.03; g.setColor(Color.yellow); if (Cirkel3.antalboll==0){ t.stop(); g.drawString("Tid: "+String.format("%4.2f",tid)+" s. Slut!",10,30); } else g.drawString("Tid: "+String.format("%4.2f",tid)+" s. Antal bollar kvar: " + Cirkel3.antalboll, 10, 30); } public void actionPerformed(ActionEvent arg0) { for (int i = 0; i <= 4; i++) { c[i].nyPosition(); repaint(); } } public void mousePressed(MouseEvent e) { x=e.getX(); y=e.getY(); for (int i = 0; i <= 4; i++) c[i].kolla(x,y); repaint(); } public static void main(String[] args) { JFrame f = new JFrame(); f.setSize(300, 300); f.setLocation(100, 100); f.setTitle("Klicka_cirkel"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Klicka_cirkel p = new Klicka_cirkel(); f.add(p); f.setVisible(true); } 875099958 130 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson @Override public void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseExited(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseClicked(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseReleased(MouseEvent e) { // TODO Auto-generated method stub } } Klass Cirkel3.java: import java.applet.Applet; import java.applet.AudioClip; import java.awt.Color; import java.awt.Graphics; public class Cirkel3 { private int xpos, ypos, diam, dx = 6, dy = 2; Color c; private boolean traffad = false; public static int antalboll; AudioClip ac; public Cirkel3() { xpos = (int) Math.ceil(230 * Math.random()); ypos = (int) Math.ceil(230 * Math.random()); diam = 10 + (int) Math.ceil(50 * Math.random()); c = new Color((int) (255 * Math.random()), (int) (255 * Math.random()), (int) (255 * Math.random())); } public void visa(Graphics g) { if (!traffad) { g.setColor(c); g.fillOval(xpos, ypos, diam, diam); } } public void kolla(int xp, int yp) { if (!traffad && xp > xpos && xp < xpos + diam && yp > ypos && yp <ypos+diam){ antalboll--; traffad=true; try{ ac = Applet.newAudioClip(new java.net.URL("file:traff.au")); } 875099958 131 Brogårdsgymnasiet LEKTIONSGENOMGÅNGAR I JAVA av Anders Andersson catch(Exception exc){ System.out.println("Hittar ej"); } ac.play(); } } public void nyPosition() { xpos = xpos + dx; if (xpos + diam + 20 > 300 || xpos < 0) dx = -dx; ypos = ypos + dy; if (ypos + diam + 37 > 300 || ypos < 0) // y börjar om när det är > 300. dy = -dy; } } 875099958 132 Brogårdsgymnasiet