Rita Egna Bilder, Timer

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

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

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

Att rita egna bilder.

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

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

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

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

Klassen javax.swing.timer

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

Frivillig Java-swing-Graphics-lab Programmeringsteknik MN1 vt02

Laboration 4: Game of Life

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

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

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

Lösningsförslag till tentamen

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

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

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

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

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

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

Mer om grafiska komponenter. Händelsestyrda program

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

Lösningsförslag till tentamen

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

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

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

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

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

Lektion Händelsehanterare

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

Laboration 15 Grafiskt användargränssnitt

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

Lösningsförslag till tentamen

Lösningsförslag till tentamen

Lösningsförslag till tentamen

Lab5 för prgmedcl04 Grafik

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

ID1004 Laboration 3, 5-6 November 2012

Exempel på användning av arv: Geometriska figurer

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

Tentamen i Objektorienterad programmering E

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 3

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

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

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

Grafiska komponenter.

Frames, menyer och GUI-program

Lösningsförslag till tentamen

kl

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

Tentamen i Objektorienterad programmering

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

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

Lösningsförslag till tentamen

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

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

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

Arrayer. Indexerade variabler, arrayer, fält Statistiska mått Sortering Sökalgoritmer Rita polygoner Objektarrayer Starta program med argument

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

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

Labbinstruktioner för Java/Swing

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

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 3

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

Föreläsning 5 (6) Metoder. Metoder Deklarera. Metoder. Parametrar Returvärden Överlagring Konstruktorer Statiska metoder tostring() metoden javadoc

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

Tentamen FYTA11 Javaprogrammering

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

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

Grafik, bilder och ljud

Tentamen i Objektorienterad programmering E

Objektorienterad programmering

Lösningsförslag tentamen FYTA11 Java

Tentamen OOP

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

Trådar. Motivering. Många program måste kunna hålla på med flera saker samtidigt, till exempel. fleranvändarsystem.

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

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

Laboration 3 GUI-programmering

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

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

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

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

Objektorienterad programmering i Java

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

Java-concept och Swing. Swing low, sweet chariot

2D1339 Programkonstruktion för F1, ht 2004

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

Tentamen. Grundläggande programmering i Java A 5p, DTAA

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

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

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

Lösningsförslag till tentamen

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

Lösningsförslag till tentamen

Föreläsning 10. ADT:er och datastrukturer

Fönsterhantering, grafik

Transkript:

Rita Egna Bilder, Timer Josef Svenningsson November 27, 2012

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ördefinierad 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 omdefiniera 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.

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.

Metoder i klassen Graphics forts. 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 forts. II 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.

Metoder i klassen Graphics forts. III Color getcolor() Returnerar den aktuella förgrundsfärgen. void setcolor(color color) Sätter förgrundsfärgen till color.

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 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; rött, grönt och 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 också som ett heltal mellan 0 och 255. Genomskinliga färger skapas med en särskild konstruktor: Color newc = new Color(175, 175, 255, 175);

Fördefinierade färger 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 - Grafisk komponent 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 - Main-program 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

Flytande positioner på 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

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) flyttar polygonen dx i x-led och dy i y-led contains(x,y) ger true om punkten (x,y) ligger i polygonen, annars ges false getbounds() 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 en polygon.

Exempel Skapa en klass Star som ritar ut en femhörnig stjärna. Det ska vara möjligt att sätta färgerna i konstruktorn. Komponenten ska se ut på följande vis:

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 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 - Snöfall 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 - Snöfall 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 forts. - Snöfall 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 - Snöfall Main-program 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

Klassen javax.swing.timer I Swing finns en klass Timer som man kan använda för att upprepa en vis kodsekvens med jämna tidsmellanrum. Ett objekt av klassen Timer exekveras som en egen tråd. Ett objekt av klassen Timer kan med jämna tidsmellanrum generera händelser av typen ActionEvent. Hur ofta dessa händelser genereras och vem som lyssnar efter dessa händelser anges som parameter till konstruktorn: Timer t = new Timer(upprepningstiden, lyssnare); Det går också att lägga till flera lyssnare till samma Timer-objekt med hjälp av metoden addactionlistener. t.addactionlistner(lyssnare2); Alla registrerade lyssnare på ett Timer-objekt får de ActionEvent-händelser som Timer-objektet genererar.

Klassen javax.swing.timer För att ett Timer-objekt skall börja generera händelser måste man anropa metoden start: t.start(); Det går att stoppa ett Timer-objekt med metoden stop: t.stop(); och det går att återstarta ett Timer-objekt med metoden restart: t.restart(); Man kan se efter om ett Timer-objekt har startats med metoden isrunning: t.isrunning();

Klassen javax.swing.timer forts. Om inget annat anges genereras den första händelsen efter det antal millisekunder som angav i konstruktorn av Timer-objektet. Vill man ha ett annat tidsintervall till den första händelsen används metoden setinitialdelay: t.setinitialdelay(); Det går att ändra tidsintervallet för genereringen av händelser med metoden setdelay: t.setdelay(100); Det finns ytterligare ett antal metoder i klassen Timer. Klassen javax.swing.timer är lämplig att använda för att skapa animerade grafiska objekt.

Exempel: Flygande Rektangel Ett program som visar en rektangel som flyttar sig från höger till vänster över ritytan. import javax.swing.*; import java.awt.*; import java.awt.event.*; public class MovingRect extends JPanel implements ActionListener { private Timer t = new Timer(40, this); private int xpos = 0; final private int W = 30; final private int H = 20; public MovingRect() { setbackground(color.white); t.start(); }//konstruktor public void paintcomponent(graphics pen) { super.paintcomponent(pen); pen.setcolor(color.blue); int x = getwidth() - xpos; int y = (getheight() - H) / 2; pen.fillrect(x,y,w,h); }//paintcomponent

Exempel, Flygande Rektangel forts. public void actionperformed(actionevent e) { xpos = (xpos + 1) % (getwidth() + W); repaint(); }//actionperformed public static void main(string[] arg) { JFrame w = new JFrame(); MovingRect m = new MovingRect(); w.getcontentpane().add(m); w.setsize(400,100); w.setdefaultcloseoperation(jframe.exit_on_close); w.setvisible(true); }//main }//MovingRect

Exempel, Rullande Text En klass för att visa en rullande text som rör sig från vänster till höger i en etikett. import javax.swing.*; import java.awt.*; import java.awt.event.*; public class MovingText extends JLabel implements ActionListener { private javax.swing.timer t = new javax.swing.timer(50, this); private String str; private int xpos = 0; public MovingText(String str) { this.str = str; setbackground(color.yellow); setforeground(color.blue); setopaque(true); t.start(); }//konstruktor

Exempel, Rullande Text forts. public void paintcomponent(graphics pen) { super.paintcomponent(pen); FontMetrics fm = pen.getfontmetrics(); int s = fm.stringwidth(str); if (xpos < getwidth() + s) xpos = xpos + 1; else xpos = 0; int ypos = getheight()/2 + fm.getheight()/2; pen.drawstring(str, getwidth()-xpos, ypos); }//paintcomponent public void actionperformed(actionevent e) { repaint(); }//actionperformed public void changetext(string str) { this.str = str; }//changetext }//MovingTex

Exempel, Rullande Text Main import java.awt.*; import javax.swing.*; public class TestMovingText { public static void main(string[] arg) { JFrame w = new JFrame(); String str1 = "Denna text rör sig rullande från höger till vänster."; String str2 = "Viktigt meddelande! Gamla tentor är upplagda på kurshemsidan"; MovingText message1 = new MovingText(str1); MovingText message2 = new MovingText(str2); message2.setforeground(color.red); w.getcontentpane().setlayout(new GridLayout(2,1)); w.getcontentpane().add(message1); w.getcontentpane().add(message2); w.setsize(400,100); w.setdefaultcloseoperation(jframe.exit_on_close); w.setvisible(true); } }//TestMovingText

Exempel - Snöfall igen Modifiering av klassen SnowFall på så sätt att den ritar om sig själv var 5:e sekund. import java.awt.*; import javax.swing.*; import java.util.*; import java.awt.event.*; public class AnimatedSnowFall extends JPanel implements ActionListener { private static Random slump = new Random(); private javax.swing.timer t = new javax.swing.timer(5000, this); public AnimatedSnowFall() { setbackground(new Color(123,123, 200)); t.start(); }//konstruktor public void actionperformed(actionevent e) { repaint(); }//actionperformed public void paintcomponent(graphics pen) { super.paintcomponent(pen); drawsnowfall(pen); }//paintcomponent

Implementation forts. 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 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 - Main-program import java.awt.*; import javax.swing.*; import java.awt.event.*; public class TestSnowFall { public static void main(string[] args) { JFrame window = new JFrame(); AnimatedSnowFall art = new AnimatedSnowFall(); window.setsize(300, 300); window.getcontentpane().add(art); window.setlocation(50,50); window.setdefaultcloseoperation(jframe.exit_on_close); window.setvisible(true); }//main }//TestSnowFall