Föreläsning 11. Att rita egna bilder.

Relevanta dokument
Föreläsning 11. Att rita egna bilder. Grafik. Klassen Graphics. Fönstrets koordinatsystem

Rita Egna Bilder, Timer

Att rita egna bilder.

Rörliga figurer Klassen Timer Testning av program Något om applets

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

Frivillig Java-swing-Graphics-lab Programmeringsteknik MN1 vt02

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

Denna vecka. Idag. Grafiskt användarsnitt. Vi kommer att se

Mer om grafiska komponenter. Händelsestyrda program

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

Föreläsning 14: Grafik & mera händelsehantering

ITK:P1 Lektion 4. Lektion 4. Lektion 4. Att implementera en spelidé i Java. DSV Peter Mozelius

Laboration 15 Grafiskt användargränssnitt

Laboration 4: Game of Life

Lösningsförslag till tentamen

Malmö högskola 2007/2008 Teknik och samhälle

Två designmönster, MVC och Observer/Observable. Objektorienterad programvaruutveckling GU (DIT011)

ID1004 Laboration 3, 5-6 November 2012

Föreläsning 12. Klassen Timer Rörliga figurer Testning Undantag. intcomponent(pen); olor(color.blue); int w = 30;

Lösningsförslag till tentamen

Lösningsförslag till tentamen

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

Exempel på användning av arv: Geometriska figurer

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

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

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

Repetitionsföreläsning 2: Quiz & problemlösning med swing Inget nytt material.

Lab5 för prgmedcl04 Grafik

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 7 Erik Nilsson, Institutionen för Datavetenskap, LiU

Lösningsförslag till tentamen

Detta dokument är ett exempel, cirka andra hälften av en tentamen för TDA545 Objektorienterad programvaruutveckling

Lektion Händelsehanterare

LiTHehack? Här? lithehack se koma Tisdagar och torsdagar

lgammal2.txt // Lösningar till gammal tentamen // Uppgift 1 a

Föreläsning 10. Mer om grafiska komponenter Händelsestyrda program. Layout Managers

Föreläsning 15 (16) Historik (java.awt) Historik (javax.swing) Introduktion till Swing

Föreläsning 10. Mer om grafiska komponenter Händelsestyrda program. Layout Managers. Exempel: FlowLayout. Klassen FlowLayout

Grafiska komponenter.

PROG2 Tenta Gäller SP:PROG2, DSK2:PROG2, FK:PROG2, FK:OOP, DSV1:P2 och ITK:P2

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

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

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

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 3

Föreläsning 5-6 Innehåll

LYCKA TILL!!! TENTAMEN I Programmeringsteknik F1. Var vänlig och läs detta: CTH TIN 211. DATAVETENSKAP Göteborg ( ) TENTAMEN

Lösningsförslag till tentamen

Lösningsförslag till tentamen

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

Lösningsförslag till tentamen

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 3

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

Grafiskt användargränssnitt (GUI-Graphical User Interface) intro Komponenter

Lösningar till Fiktiv Tentamen på kursen. 2D4135 Objektorienterad programmering, design och analys med Java vt2004. Teoridel

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

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

Tentamen i Objektorienterad programmering E

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

Tentamen i Objektorienterad programmering E

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

Laboration 3 GUI-programmering

Objektorienterad Programkonstruktion. Föreläsning 3 9 nov 2015

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

PROG2 Tenta Gäller SP:PROG2, DSK2:PROG2, FK:PROG2, FK:OOP, DSV1:P2 och ITK:P2

Labbinstruktioner för Java/Swing

Swing. MER Java Foundation Classes (JFC) Hur lära sig? Vad är farorna. LayoutManagers. Exempel på några av komponenterna

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

Swing. MER Java Foundation Classes (JFC) Vad är farorna. Hur lära sig? LayoutManagers. Exempel på några av komponenterna

OOP Objekt-orienterad programmering

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

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

2D1339 Programkonstruktion för F1, ht 2004

Lösningsförslag tentamen FYTA11 Java

Klassen javax.swing.timer

Grafik, bilder och ljud

Laboration 4: Digitala bilder

Arv och polymorfi. Lite terminologi; Basklass eller superklass: En klass som fungerar som bas för vårt arv. Vi skapar nya klasser utifrån den.

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

Frames, menyer och GUI-program

OOP Objekt-orienterad programmering

TDDD78, TDDE30, 729A Grafik: Att "rita" egna komponenter

TENTAMEN PROGRAMMERING I JAVA, 5P SOMMARUNIVERSITETET

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

ITK:P1 Föreläsning 8. Verktyget Javadoc. Kommentarer för Javadoc. Multimedia för spelkonstruktion

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

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 5 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Tentamen FYTA11 Javaprogrammering

PROGRAMMERINGSTEKNIK TIN212

OOP Objekt-orienterad programmering

Java-concept och Swing. Swing low, sweet chariot

PROG2 Tenta Gäller SP:PROG2, DSK2:PROG2, FK:PROG2, FK:OOP, DSV1:P2 och ITK:P2

Tentamen FYTA11 Javaprogrammering

Modelsvar för Tentamen för Objektorienterad programvaruutveckling, TDA545

Laboration 24 Databasen MySQL och java

PROG2 Tenta Gäller SP:PROG2, DSK2:PROG2, FK:PROG2, FK:OOP, DSV1:P2 och ITK:P2

17.9 Funktioner för avbildningstabeller

Tentamen, EDAA20/EDA501 Programmering

Grafiska användargränsnitt i Java. Föreläsning 7 Innehåll. Använda klasspaketet Swing. Klasspaket i Java. Grafiska användargränsnitt i Java

Modellsvar för Tentamen för Objektorienterad programvaruutveckling, TDA545

Föreläsning 13: Swing (GUI), händelser, timer

Föreläsning 1, vecka 8: Att förbereda sig för tentan

Transkript:

Föreläsning 11 Att rita egna bilder.

Grafik Varje gång ett fönster behöver ritas om, pga av att det flyttas eller varit övertäckt, anropas automatiskt en metod som har namnet paintcomponent. I ett program kan man också begära omritning av fönstret genom ett anrop av metoden repaint, som i sin tur anropar paintcomponent. Varje grafisk komponen har sin egen fördefinierade paintcomponent metod. Om komponenten är en behållare görs vid omritning anrop till alla komponenter som behållaren innehåller för att de också skall rita om sig. Om man vill ändra utseendet på en komponent skall man överskugga metoden paintcomponent, eftersom det är denna metod som definierar utseendet på komponenten. För att rita använder man ett objekt av klassen Graphics, som kan ses som en (avancerad) penna. public void paintcomponent(graphics pen)

Fönstrets koordinatsystem Koordinatsystemet som används i Java har en horisontell x-axel och en vertikal y-axel, med origo (0,0) i övre vänstra hörnet av fönstret. X (0, 0) Enheten som används är pixels. Y

Klassen Graphics När man skall rita egna figurer används ett objekt av klassen Graphics. Ett sådant objekt kan ses som en avancerad en penna och det finns en rad olika metoder i klassen för att kunna ge pennan egenskaper och kunna utföra saker med pennan: skriva text rita linjer rita cirkelbågar rita rektanglar rita ovaler rita polygon sätta färger sätta fonter (skrivstil) m.m

Metoder i klassen Graphics void drawstring(string txt, int x, int y) Ritar ut texten txt med början i punkt (x,y). y-koordinaten anger textens baslinje. void drawline(int x1, int y1, int x2,int y2) Ritar en linje från punkten (x1,y1) till (x2,y2) void drawrect(int x, int y, int b, int h) Ritar en ofylld rektangel med övre vänstra hörnet i punkten (x,y), bredden b och höjden h. void fillrect(int x, int y, int b, int h) Ritar en fylld rektangel med övre vänstra hörnet i punkten (x,y), bredden b och höjden h. void drawroundrect(int x, int y, int b, int h, int m, int n) Ritar en ofylld rundad rektangel med övre vänstra hörnet i punkten (x,y), bredden b och höjden h. Rundningen är m/2 bred och n/2 hög.

Metoder i klassen Graphics void fillroundrect(int x, int y, int b, int h, int m, int n) Ritar en fylld rundad rektangel med övre vänstra hörnet i punkten (x,y), bredden b och höjden h. Rundningen är m/2 bred och n/2 hög. void drawoval(int x, int y, int b, int h) Ritar en ofylld ellips som är inskriven i en rektangel med övre vänstra hörn i (x,y), bredden b och höjden h. void filloval(int x, int y, int b, int h) Ritar en fylld ellips som är inskriven i en rektangel med övre vänstra hörn i (x,y), bredden b och höjden h. void drawarc(int x, int y, int b, int h, int s, int l) Ritar ett segment av en ellips inskriven i en rektangel med övre vänstra hörn i (x,y), bredden b och höjden h. s är bågens startpunkt (i grader) och l är bågens längd (i grader). Startpunkten 0 grader motsvarar klockan 3. Ett positivt värde på l anger en riktning moturs och ett negativt värde l på anger en riktning medurs.

Metoder i klassen Graphics void fillarc(int x, int y, int b, int h,int s, int l) Ritar en fylld båge av en ellips inskriven i en rektangel med övre vänstra hörn i (x,y), bredden b och höjden h. s är bågens startpunkt (i grader) och l är bågens längd (i grader). Startpunkten 0 grader motsvarar klockan 3. Ett positivt värde på l anger en riktning moturs och ett negativt värde l på anger en riktning medurs. void drawpolygon(polygon p) Ritar ut den ofyllda månghörningen p. void fillpolygon(polygon p) Ritar ut den fyllda månghörningen p. void getcolor() Returnerar den aktuella förgrundsfärgen. void setcolor(color color).... Sätter förgrundsfärgen till color.

Klassen DebugGraphics I klassen javax.swing.debuggraphics, som är en subklass till Graphics finns en metod som kan vara värt att nämna: void fill3drect(int x, int y, int b, int h, boolean raised) Ritar en fylld rektangel med ett tredimensionellt utseende. Rektangeln har övre vänstra hörnet i punkten (x,y), bredden b och höjden h. Om parametern raised har värdet true ges illusionen att rektangeln är upphöjd, annars ges illusionen att rektangeln är nedsänkt.

Klassen Color En färg representeras med hjälp av det så kallade RGB-formatet. RGB-formatet definierar en färg som bestående av tre värden; mängden rött, mängden grönt och mängden blått. Mängden av en färgs representeras av ett heltal i intervallet [0, 255]. Med hjälp av konstruktorn i klassen Color kan man skapa egna färger: Color lightblue = new Color(175, 175, 255); Ett objekt av klassen Color har dessutom ett fjärde värde. Detta värde kallas för alpha-kanalen och markerar hur ogenomskinlig en färg är. Genomskinligheten anges, liksom färgkomponenterna, som ett heltal mellan 0 och 255. Genomskinliga färger skapas med en särskild konstruktor: Color newc = new Color(175, 175, 255, 175); Värdet 0 representerar helt genomskinlig och värdet 255 representerar helt ogenomskinlig. Anges inget värde få värdet 255 som default.

Klassen Color Färger representeras i Java med klassen java.awt.color, i vilken det finns ett antal färger fördefinierade: Color.BLACK 0, 0, 0 Color.BLUE 0, 0, 255 Color.CYAN 0, 255, 255 Color.GRAY 128, 128, 128 Color.DARKGRAY 64, 64, 64 Color.LIGHTGRAY 192, 192, 192 Color.GREEN 0, 255, 0 Color.MAGENTA 255, 0, 255 Color.ORANGE 255, 200, 0 Color.PINK 255, 175, 175 Color.RED 255, 0, 0 Color.WHITE 255, 255, 255 Color.YELLOW 255, 255, 0

Typsnitt Typsnitt (alltså utseendet på bokstäverna) skapar man i Java med klassen Font. När man skapar ett Font-objekt anger man tre argument: Font f = new Font(namn, stil, storlek); Namnet på ett typsnitt är något av "Serif", "SansSerif", "Monospaced""Dialog", "DialogInput", "Symbol". Stilen är någon av konstanterna Font.PLAIN, Font.ITALIC, Font.BOLD, Font.BOLD+Font.ITALIC Storleken anges ett heltal; standardstorleken är 12 När man har skapat ett typsnitt kan man t ex använda det i setfont-metoderna som finns till de grafiska komponenterna: JButton b = new JButton("Press here"); b.setfont(new Font("SansSerif", Font.BOLD, 24));

Exempel Skriv ett program som ritar ut de olympiska ringarna enligt figuren nedan: Diametern på ringarna är 30 pixels, avståndet mellan ringarna i horisontell ledd är 6 pixels. De två nedersta ringarna ligger 15 pixels nedanför de tre övre ringarna.

Implementation: Bestämda positioner i ritytan import java.awt.*; import javax.swing.*; public class OlympicRings extends JPanel { public OlympicRings() { setbackground(color.white); }//konstruktor public void paintcomponent(graphics pen) { super.paintcomponent(pen); pen.setcolor(color.blue); pen.drawoval(90, 80, 30, 30); pen.setcolor(color.yellow); pen.drawoval(108, 95, 30, 30); pen.setcolor(color.black); pen.drawoval(126, 80, 30, 30); pen.setcolor(color.green); pen.drawoval(144, 95, 30, 30); pen.setcolor(color.red); pen.drawoval(162, 80, 30, 30); pen.drawstring("olympic Rings", 105, 150); }//paintcomponent }//OlympicRings

Implementation: Ett huvudprogram som skapar ett fönster med ett objekt av klassen OlympicRings import java.awt.*; import javax.swing.*; public class MainOlympic { public static void main(string[] args) { JFrame window = new JFrame(); OlympicRings rings = new OlympicRings(); window.setsize(282, 230); window.add(rings); window.setlocation(50,50); window.setdefaultcloseoperation(jframe.exit_on_close); window.setvisible(true); }//main }//MainOlympic

Implementation: Flytande positioner i ritytan import java.awt.*; import javax.swing.*; public class OlympicRings2 extends JPanel { public OlympicRings2() { setbackground(color.white); }//konstruktor public void paintcomponent(graphics pen) { super.paintcomponent(pen); int mx = getwidth()/2; int my = getheight()/2; pen.setcolor(color.blue); pen.drawoval(mx-51, my-15, 30, 30); pen.setcolor(color.yellow); pen.drawoval(mx-33, my, 30, 30); pen.setcolor(color.black); pen.drawoval(mx-15, my-15, 30, 30); pen.setcolor(color.green); pen.drawoval(mx+3, my, 30, 30); pen.setcolor(color.red); pen.drawoval(mx+21, my-15, 30, 30); pen.drawstring("olympic Rings", mx-35, my+55); }//paintcomponent }//OlympicRings2

Exempel Skriv ett program som ritar ut 150 rektanglar enligt figurerna nedan. Rektanglarnas storlek, placering och färg skall genereras slumpmässigt.

Implementation: import java.awt.*; import javax.swing.*; import java.util.*; public class RandomArt extends JPanel { private static Random slump = new Random(); public RandomArt() {}//konstruktor public void paintcomponent(graphics pen) { super.paintcomponent(pen); randomrectangels(pen); }//paintcomponent private void randomrectangels(graphics pen) { setcanvascolor(pen); for(int i = 1; i <= 150; i = i + 1) { int b = slump.nextint(45) + 10; int h = slump.nextint(45) + 10; int x = slump.nextint(getwidth() - b); int y = slump.nextint(getheight() - h); pen.setcolor(randomcolor()); pen.fillrect(x,y,b,h); } }//randomrectangels

Implementation (fortsättning): private void setcanvascolor(graphics pen) { pen.setcolor(randomcolor()); pen.fillrect(0,0,getwidth(), getheight()); }//setcanvascolor private Color randomcolor() { return new Color(slump.nextInt(256),slump.nextInt(256 ), slump.nextint(256)); }//randomcolor }// RandomArt Huvudprogram som använder RandomArt: import javax.swing.*; public class MainRandomArt { public static void main(string[] args) { JFrame window = new JFrame(); RandomArt art = new RandomArt(); window.setsize(300, 300); window.add(art); window.setlocation(50,50); window.setdefaultcloseoperation(jframe.exit_on_close); window.setvisible(true); }//main }// MainRandomArt

fill3drect samt genomskinliga färger Om vi ritat rektanglarna som fill3drect-objekt eller använt delvis genomskinliga färger skulle konstverken få följande utseende:

Exempel Utöka klassen RandomArt med en metod randomfigures för att rita ut 150 slumpmässiga rektanglar eller ovaler (enligt figuren nedan).

Implementation: import java.awt.*; import javax.swing.*; import java.util.*; public class RandomArt extends JPanel {... private void randomfigures(graphics pen) { setcanvascolor(pen); for(int i = 1; i <= 150; i = i + 1) { int b = slump.nextint(45) + 10; int h = slump.nextint(45) + 10; int x = slump.nextint(getwidth() - b); int y = slump.nextint(getheight() - h); pen.setcolor(randomcolor()); int fig = slump.nextint(2); if (fig == 0) pen.fillrect(x,y,b,h); else pen.filloval(x,y,b,h); } }//randomfigures... }// RandomArt

Exempel Använd klassen RandomArt för att skriva en klass ShowRandomArt som visar en fönster med nedanstående utseende. När man trycker på Nya figurer skall en ny uppsättning slumpmässiga figurer ritas, som antingen enbart består av rektanglar eller är en blandning av rektanglar och ovaler. Detta innebär att slumpen skall avgöra om metoden randomrectangels eller randomfigures anropas. När man trycker på Avsluta skall programmet avslutas.

Implementation När man trycker på knappen Nya figurer skall en omritning av panelen som finns i fönstret ske. Denna panel är av klassen RandomArt och omritningen definieras av metoden paintcomponent i klassen RandomArt, varför det är i denna metod det skall avgöras vilken av metoderna randomrectangels eller randomfigures som skall anropas. import java.awt.*; import javax.swing.*; import java.util.*; public class RandomArt extends JPanel {... public void paintcomponent(graphics pen) { super.paintcomponent(pen); int artmode = slump.nextint(2); if (artmode == 0) randomrectangels(pen); else randomfigures(pen); }//paintcomponent... }// RandomArt

Implementation av klassen ShowRandomArt: import java.awt.*; import javax.swing.*; import java.awt.event.*; public class ShowRandomArt extends JFrame implements ActionListener { private JButton ny = new JButton("Nya figurer"); private JButton sluta = new JButton("Avsluta"); private RandomArt art = new RandomArt(); public ShowRandomArt() { JPanel knappar = new JPanel(); knappar.setlayout(new GridLayout(1,2)); knappar.add(ny); ny.addactionlistener(this); Förhindrar att storleken på sluta.addactionlistener(this); fönstret förändras knappar.add(sluta); setlayout(new BorderLayout()); add("center", art); add("south", knappar); setsize(300,400); setresizable(false); //gör att fönstrets storlek inte kan ändras setvisible(true); setdefaultcloseoperation(exit_on_close); }//konstruktor

Implementation av klassen ShowRandomArt (fortsättning): public void actionperformed(actionevent e) { if (e.getsource() == ny) art.repaint(); else if (e.getsource() == sluta) System.exit(0); }//actionperformed public static void main(string[] args) { JFrame tsf = new ShowRandomArt(); }//main }//ShowRandomArt

Klassen Polygon I Java finns en klass Polygon som används för att avbilda månghörningar (klassen finns i paketet java.awt). Bland annat finns följande bl.a. följande konstruktorer och instansmetoder: Polygon() skapar ett polygon utan hörn addpoint(int x,int y) lägger till hörnet (x, y) translate(int dx,int dy) contains(x,y) getbounds() flyttar polygonen dx i x-led och dy i y-led ger true om punkten (x,y) ligger i polygonen, annars ges false ger den minsta rektangel (av standardklassen Rectangle) som omsluter polygonen I klassen Graphics finns instansmetoderna drawpolygon(polygon p) fillpolygon(polygon p) för att rita ut polygon.

Exempel Skapa en klass Star som ritar ut den stjärna enligt bredvidstående figur: Stjärnan utgör ett polygon enligt figuren bredvid: (0,0) (50,10) (14,38) (86,38) (26,82) (74,82) (100,100) Det skall via konstruktorn vara möjligt att sätta stjärnas färg och bakgrundsfärgen.

Implementation: import java.awt.*; import javax.swing.*; public class Star extends JPanel { private Color foregroundcolor; public Star(Color foregroundcolor, Color backgroundcolor) { this.foregroundcolor = foregroundcolor; setbackground(backgroundcolor); }//konstruktor public void paintcomponent(graphics pen) { super.paintcomponent(pen); pen.setcolor(foregroundcolor); Polygon star = new Polygon(); star.addpoint(50, 10); star.addpoint(74, 82); star.addpoint(14, 38); star.addpoint(86, 38); star.addpoint(26, 82); star.addpoint(50, 10); pen.fillpolygon(star); }//paintcomponent }//Star

Implementation: Ett huvudprogram som skapar ett fönster med två objekt av klassen Star. import java.awt.*; import javax.swing.*; public class ShowStars { public static void main(string[] args) { JFrame window = new JFrame(); Star s1 = new Star(Color.blue, Color.PINK); Star s2 = new Star(Color.pink, Color.BLUE); window.setlayout(new GridLayout(1,2)); window.add(s1); window.add(s2); window.setlocation(50,50); window.setdefaultcloseoperation(jframe.exit_on_close); window.setsize(200, 130); window.setvisible(true); }//main }//ShowStars

Exempel Skriv ett program som ritar ut ett fönster som visar ett snöfall enligt figuren nedan. Snöflingornas antal,storlek och placering slumpas fram.

Implementation: import java.awt.*; import javax.swing.*; import java.util.*; public class SnowFall extends JPanel { private static Random slump = new Random(); public SnowFall() { setbackground(new Color(123,123, 200)); }//konstruktor public void paintcomponent(graphics pen) { super.paintcomponent(pen); drawsnowfall(pen); }//paintcomponent public void drawsnowfall(graphics pen) { pen.setcolor(color.white); int antal = slump.nextint(40) + 20; for (int i = 1; i <= antal; i = i + 1) { int radie = slump.nextint(15) + 10; int x = slump.nextint(getwidth() - 2*radie); int y = slump.nextint(getheight() - 2*radie); drawsnowflake(pen, x, y, radie); } }//drawsnowfall

Implementation: public void drawsnowflake(graphics pen, int x, int y, int radie) { int x0 = x + radie; int y0 = y + radie; for (int i = 0; i < 360; i = i + 20) { int x1 = x0+ (int) (radie * Math.cos(Math.toRadians(i))); int y1 = y0 + (int) (radie * Math.sin(Math.toRadians(i))); pen.drawline(x0, y0, x1, y1); } }//drawsnowflake }//SnowFall

Implementation: Ett huvudprogram som skapar ett fönster med ett objekt av klassen SnowFall. import java.awt.*; import javax.swing.*; import java.awt.event.*; public class ShowSnowFall { public static void main(string[] args) { JFrame window = new JFrame(); SnowFall art = new SnowFall(); window.setsize(300, 300); window.add(art); window.setlocation(50, 50); window.setdefaultcloseoperation(jframe.exit_on_close); window.setvisible(true); }//main }//ShowSnowFall