Java utan netbeans Du har gjort ett program i netbeans Hur exportera det så att andra kan köra det utan att använda netbeans? Välj projektet som main project Högerklicka på det och välj Clean and Build Därmed skapas en jar fil: en fil som innehåller kompilerad Java För att hitta filen gå till mappen NetBeansProjects Välj undermappen med rätt projekt, och sedan undermapp dist Där ligger jar-filen Om Java är rätt installerat (netbeans behövs inte) räcker det att dubbelklicka på jar filen för att köra programmet
Javas namnkonvention camelcase : ord skrivs ihop och varje ord börjar på stor bokstav Namn på klasser och interface skrivs i CamelCase och börjar på stor bokstav Konstanter skrivs i UPPERCASE, ord skiljs av underscore Allt annat skrivs i camelcase och börjar på liten bokstav
Exempel class Clock { class MyClock { int angle void computeangle(int newtime final static int CLOCK_WIDTH = 300;
Magiska siffror Sifferkonstanter som 200, 314, får endast förekomma i konstantdeklarationer gdrawline(150, 150, 180, 180)
Magiska siffror Sifferkonstanter som 200, 314, får endast förekomma i konstantdeklarationer gdrawline(150, 150, 180, 180) final int CENTER_X = 150; final int CENTER_Y = 150; final int LINE_SIZE = 30; gdrawline(center_x, CENTER_Y, CENTER_X+LINE_SIZE, CENTER_Y+LINE_SIZE)
Omfaktorisering void paintcomponent (Graphics g) {
Omfaktorisering void paintcomponent (Graphics g) {
Omfaktorisering void paintcomponent (Graphics g) {
Omfaktorisering void paintcomponent (Graphics g) { painthands(g); paintface(g); paintnumerals(g); void painthands(graphics g) { void paintface (Graphics g) { void paintnumerals (Graphics g) {
Krav på kod Vettiga namn som följer namnkonventionen Inga magiska nummer Uppdelning i små metoder Objektorientering: metoderna ligger i lämpliga klasser
Javaprojekten 3 stycken projekt Grupper om 2 studenter Olika för alla 3 projekten Fredagarnas labtillfällen obligatoriska Innan redovisning ska koden inspekteras Reservdag innan jul
Kodinspektionsprotokoll Ifyllt protokoll måste uppvisas vid redovisning av projektuppgift Ifylles av grupp som skrivit koden Uppgift: Grupp: Ifylles av inspekterande grupp Klarmarkera med kryss i rutorna Identitet: Programmet har en inledande kommentar som anger vilka som löst vilken uppgift och när Typografi: Konsekventa indragningar och radbyten för att öka läsbarheten Namnval: Informativa namn som följer javas camelcasetradition Objektorientering: Minimal användning av static Funktionsuppdelning: Metoderna är inte för långa och varje metod gör bara en sak Lokalitet: Variabler deklarerade så lokalt som möjligt Inga magiska nummer: Konstanter är deklarerade med informativa namn Inspekterande grupp: Datum
Layout Hur lägger java in element i en panel? Svar: Det beror på vilken layout manager som används Det finns fler typer av layout managers än ni någonsin kommer att behöva Vi behandlar bara några stycken Se Horstmann kap 11 Mer finns på http://downloadoraclecom/ javase/tutorial/uiswing/layout/indexhtml
Grundidé Layout managers är objekt Man kan skapa dem genom att instansiera motsvarande klass En layout manager kan bindas till en JPanel med JPanelens metod setlayout() Därefter kontrollerar managern automatiskt allt som läggs in med panelens add() metod
Exempel: border layout North West Center East South
Idiom 1 JPanel mypanel = new JPanel(); En JPanel skapas och får en border layout mypanelsetlayout(new BorderLayout()); somelabel läggs i norra fältet mypaneladd(somelabel, BorderLayoutNORTH)
Idiom 2 class MyPanel extends JPanel { MyPanel() { setlayout (new BorderLayout()); MyPanel är en egen slags JPanel, och får en BorderLayout i konstruktorn somelabel läggs i norra fältet add(somelabel, BorderLayoutNORTH)
Grid layout Panelen delas in i ett rutnät add() lägger in med början på övre vänstra hörnet, och fyller i åt höger När raden är slut börjar man på nästa
JPanel mypanel = new JPanel(); mypanelsetlayout(new GridLayout(3,4)); mypaneladd(label1); mypaneladd(label2); mypaneladd(label12); 1 2 3 4 5 6 7 8 9 10 11 12
Interaktiv grafik: Knappar En knapp är något man kan klicka på med musen En knapp ligger i en JPanel Hur skapas en knapp? Vad händer när man klickar på den?
Skapa en knapp Knapptyper = klasser Knappar = objekt Finns ett antal olika klasser Den enklaste är JButton Konstruktorn tar en parameter: en textsträng som ska stå på knappen Finns metoder för att ändra färg etc
Exempel buttondemo
En panel där det ritas class DrawPanel extends JPanel { upp en stor cirkel DrawPanel() { setpreferredsize(new Dimension(500, 500)); public void paintcomponent(graphics g) { gdrawoval(100,100,300,300);
JFrame theframe = new JFrame("Demo"); theframesetdefaultcloseoperation(jframeexit_on_close); JPanel buttonpanel = new JPanel(); buttonpanelsetlayout(new GridLayout(2,3)); DrawPanel drawpanel = new DrawPanel(); for (int i=1; i<=6; i++) { JButton button = new JButton(i+""); buttonpaneladd(button); Container pane = theframegetcontentpane(); panesetlayout(new BorderLayout()); paneadd(drawpanel, BorderLayoutCENTER); paneadd(buttonpanel, BorderLayoutNORTH); theframepack(); theframesetvisible(true);
JFrame theframe = new JFrame("Demo"); theframesetdefaultcloseoperation(jframeexit_on_close); JPanel buttonpanel = new JPanel(); buttonpanelsetlayout(new GridLayout(2,3)); DrawPanel drawpanel = new DrawPanel(); for (int i=1; i<=6; i++) { JButton button = new JButton(i+""); buttonpaneladd(button); Container pane = theframegetcontentpane(); panesetlayout(new BorderLayout()); paneadd(drawpanel, BorderLayoutCENTER); paneadd(buttonpanel, BorderLayoutNORTH); theframepack(); theframesetvisible(true);
JFrame theframe = new JFrame("Demo"); theframesetdefaultcloseoperation(jframeexit_on_close); JPanel buttonpanel = new JPanel(); buttonpanelsetlayout(new GridLayout(2,3)); DrawPanel drawpanel = new DrawPanel(); for (int i=1; i<=6; i++) { JButton button = new JButton(i+""); buttonpaneladd(button); Container pane = theframegetcontentpane(); panesetlayout(new BorderLayout()); paneadd(drawpanel, BorderLayoutCENTER); paneadd(buttonpanel, BorderLayoutNORTH); theframepack(); theframesetvisible(true);
JFrame theframe = new JFrame("Demo"); theframesetdefaultcloseoperation(jframeexit_on_close); JPanel buttonpanel = new JPanel(); buttonpanelsetlayout(new GridLayout(2,3)); DrawPanel drawpanel = new DrawPanel(); for (int i=1; i<=6; i++) { JButton button = new JButton(i+""); buttonpaneladd(button); Container pane = theframegetcontentpane(); panesetlayout(new BorderLayout()); paneadd(drawpanel, BorderLayoutCENTER); paneadd(buttonpanel, BorderLayoutNORTH); theframepack(); theframesetvisible(true);
JFrame theframe = new JFrame("Demo"); theframesetdefaultcloseoperation(jframeexit_on_close); JPanel buttonpanel = new JPanel(); buttonpanelsetlayout(new GridLayout(2,3)); DrawPanel drawpanel = new DrawPanel(); for (int i=1; i<=6; i++) { JButton button = new JButton(i+""); buttonpaneladd(button); Container pane = theframegetcontentpane(); panesetlayout(new BorderLayout()); paneadd(drawpanel, BorderLayoutCENTER); paneadd(buttonpanel, BorderLayoutNORTH); theframepack(); theframesetvisible(true);
JFrame theframe = new JFrame("Demo"); theframesetdefaultcloseoperation(jframeexit_on_close); JPanel buttonpanel = new JPanel(); buttonpanelsetlayout(new GridLayout(2,3)); DrawPanel drawpanel = new DrawPanel(); for (int i=1; i<=6; i++) { JButton button = new JButton(i+""); buttonpaneladd(button); Container pane = theframegetcontentpane(); panesetlayout(new BorderLayout()); paneadd(drawpanel, BorderLayoutCENTER); paneadd(buttonpanel, BorderLayoutNORTH); theframepack(); theframesetvisible(true);
Vad händer när man klickar på en knapp? Det genereras ett så kallat event (händelse) Finns många slags typer av event: knapptryckningar, musrörelser, tangentbordstryckningar, timersignaler Du gissade det: en eventtyp är en klass Ett event är ett objekt Eventobjekt genereras automatiskt vid motsvarande händelse Du behöver alltså inte instansiera events själv
Event source Varje event har en source: den (grafiska) komponent som gav upphov till eventet Ex: klickning på en knapp ger ett event med knappen som source Ex: musrörelse i en JPanel ger ett event med JPanel-en som source Ex: en tangentbordstryckning ger ett event med source = det aktiva grafiska objektet (oftast det där du klickat senast) Ex: en timersignal har motsvarande timer som source
Event listener En event listener är ett objekt som ligger och väntar på event av rätt typ och från en viss source När ett sådant event inträffar går rätt metod i lyssnaren igång automatiskt Du får själv programmera den metoden så att den gör vad du tänkt 1) skapa lyssnare, 2) bind till source OBS Events kommer automatiskt Lyssnarklasser programmerar du själv
Events and Listeners Event Component Listener!"#$%&$'(')"$*+(#)" %,-"('(/,)(",'"(0(')"!"#$//(1&$'23'"431)('(/" $*+(#)"31"2(13'(2")$" /(1&$'2")$")5("(0(')" 65('")5("(0(')"$##7/18")5("#$%&$'(')"#,441" )5(",&&/$&/3,)("%()5$2"$9")5("431)('(/8" &,113'",'"$*+(#)")5,)"2(1#/3*(1")5("(0(')" 4-51
Lyssnarklasser Det finns olika slags lyssnarklasser för olika slags event Ex: MouseListener (tex musklick i en JPanel) KeyListener (tex tangenttryckningar) ActionListener (tex Timer eller klick på en JButton)
Göra en lyssnarklass 1 Deklarera rätt lyssnartyp i klasshuvudet med ordet implements class MyListener implements KeyListener { 2 Se till att definiera de metoder som just den lyssnartypen måste ha Tex en KeyListener måste ha keytyped() keypressed() keyreleased() Varje sådan metod har exakt en parameter av rätt typ Tex för KeyListener är det typen KeyEvent Metoden ska vara public void
Använda Lyssnarklass Instansiera ett objekt av lyssnarklassen för att få ett lyssnarobjekt Bind det till det objekt som ska avlyssnas genom en addlistener - metod Tex för KeyListener är metoden addkeylistener()
Idiom 1 import javaawt*; import javaxswing*; import javaawtevent*; class MyListener implements KeyListener { public void keytyped(keyevent e) { Skriv här det som ska hända vid tangenttryckning public void keypressed(keyevent e) { public void keyreleased(keyevent e) { mypanel = new JPanel(); mylistener = new MyListener(); mypaneladdkeylistener(mylistener);
Idiom 2 En klass blir sin egen lyssnare Enklast för små exempel class MyPanel extends JPanel implements KeyListener { MyPanel() { addkeylistener(this); Bind sig själv som lyssnare i konstruktorn! public void keytyped(keyevent e) { Skriv här det som ska hända vid tangenttryckning Definiera lyssnarmetoderna i samma klass public void keypressed(keyevent e) { public void keypressed(keyevent e) {
Idiom 1 Event Component Listener!"#$%&$'(')"$*+(#)" %,-"('(/,)(",'"(0(')"!"#$%%&'($)*+),"-+'&)&%" $/0&#"+'"*&'+,)&*"$" %&'($)*"$"1&"&2&)" Idiom 2 Event Component and also Listener This component may generate events, and can itself respond to the events
JPanel buttonpanel = new JPanel(); buttonpanelsetlayout(new GridLayout(2,3)); DrawPanel drawpanel = new DrawPanel(); for (int i=1; i<=6; i++) { JButton button = new JButton(i+""); buttonpaneladd(button); buttonaddactionlistener(drawpanel); Container pane = theframegetcontentpane(); panesetlayout(new BorderLayout()); paneadd(drawpanel, BorderLayoutCENTER); paneadd(buttonpanel, BorderLayoutNORTH); buttondemo2
class DrawPanel extends JPanel implements ActionListener { boolean fillit = false; DrawPanel() { setpreferredsize(new Dimension(500, 500)); public void paintcomponent(graphics g) { gsetcolor(colorwhite); gfillrect(0,0,500,500); gsetcolor(colorblack); if (fillit) { gfilloval(100, 100, 300, 300); else { gdrawoval(100, 100, 300, 300); public void actionperformed(actionevent e) { fillit =! fillit; repaint();
class DrawPanel extends JPanel implements ActionListener { boolean fillit = false; DrawPanel() { setpreferredsize(new Dimension(500, 500)); public void paintcomponent(graphics g) { gsetcolor(colorwhite); gfillrect(0,0,500,500); gsetcolor(colorblack); if (fillit) { gfilloval(100, 100, 300, 300); else { gdrawoval(100, 100, 300, 300); public void actionperformed(actionevent e) { fillit =! fillit; repaint();
class DrawPanel extends JPanel implements ActionListener { boolean fillit = false; DrawPanel() { setpreferredsize(new Dimension(500, 500)); public void paintcomponent(graphics g) { gsetcolor(colorwhite); gfillrect(0,0,500,500); gsetcolor(colorblack); if (fillit) { gfilloval(100, 100, 300, 300); else { gdrawoval(100, 100, 300, 300); public void actionperformed(actionevent e) { fillit =! fillit; repaint();
Men om vi vill att olika knappar ska få olika effekt?
Lösning 1: olika Listeners för olika knappar Onödigt krångligt om knapparna gör likartade saker
Lösning 2: samma Listener som tar reda på händelsorsak buttondemo4
class DrawPanel extends JPanel implements ActionListener { String filler = ""; DrawPanel() { setpreferredsize(new Dimension(500, 500)); public void paintcomponent(graphics g) { gsetcolor(colorwhite); gfillrect(0,0,500,500); gsetcolor(colorblack); gdrawoval(100, 100, 300, 300); gdrawstring(filler, 250,250); public void actionperformed(actionevent e) { filler = ((JButton)(egetSource()))getText(); repaint();
class DrawPanel extends JPanel implements ActionListener { String filler = ""; Text att skrivas ut DrawPanel() { setpreferredsize(new Dimension(500, 500)); public void paintcomponent(graphics g) { gsetcolor(colorwhite); gfillrect(0,0,500,500); gsetcolor(colorblack); gdrawoval(100, 100, 300, 300); gdrawstring(filler, 250,250); public void actionperformed(actionevent e) { filler = ((JButton)(egetSource()))getText(); repaint();
class DrawPanel extends JPanel implements ActionListener { String filler = ""; Text att skrivas ut DrawPanel() { setpreferredsize(new Dimension(500, 500)); public void paintcomponent(graphics g) { gsetcolor(colorwhite); gfillrect(0,0,500,500); gsetcolor(colorblack); gdrawoval(100, 100, 300, 300); gdrawstring(filler, 250,250); Här skrivs den ut public void actionperformed(actionevent e) { filler = ((JButton)(egetSource()))getText(); repaint();
class DrawPanel extends JPanel implements ActionListener { String filler = ""; Text att skrivas ut DrawPanel() { setpreferredsize(new Dimension(500, 500)); public void paintcomponent(graphics g) { gsetcolor(colorwhite); gfillrect(0,0,500,500); gsetcolor(colorblack); gdrawoval(100, 100, 300, 300); gdrawstring(filler, 250,250); Här skrivs den ut public void actionperformed(actionevent e) { filler = ((JButton)(egetSource()))getText(); repaint(); Här får den nytt värde: knapptexten
public void actionperformed(actionevent e) { ((JButton)(egetSource()))getText();
public void actionperformed(actionevent e) { ((JButton)(egetSource()))getText(); e är av typ ActionEvent En sådan har en metod getsource() som returnerar det objekt som är orsak till händelsen egetsource()
public void actionperformed(actionevent e) { ((JButton)(egetSource()))getText(); e är av typ ActionEvent En sådan har en metod getsource() som returnerar det objekt som är orsak till händelsen Resultatet blir ett objekt Vi råkar veta att det alltid är en JButton Så vi kan casta det, dvs ange typinformation egetsource() (JButton)(egetSource())
public void actionperformed(actionevent e) { ((JButton)(egetSource()))getText(); e är av typ ActionEvent En sådan har en metod getsource() som returnerar det objekt som är orsak till händelsen Resultatet blir ett objekt Vi råkar veta att det alltid är en JButton Så vi kan casta det, dvs ange typinformation egetsource() (JButton)(egetSource()) En JButton har en metod gettext() som returnerar knappens text ((JButton)(egetSource()))getText();
Information i events Lyssnarens metod får alltid en parameter av typ Event Denna kan användas för att få information om eventet Exakt vilken information som finns beror på eventtypen Tex: alla event har en metod getsource() Musevents har metoder getx() och gety() som ger muskoordinaterna
Sanningen bakom ordet implements 1 Det underlättar överenskommelser mellan olika programmerare, och gör att java kan se till att de inte bryts!
Exempel Jag är systemprogrammerare Jag skriver metoden addactionlistener() i javabiblioteket Metoden tar en parameter: ett lyssnarobjekt Det addactionlistener() gör är att se till att ActionEvents triggar anrop till parameterns metod actionperformed() Så det kräver att parametern faktiskt har en sådan metod! Annars är jag kokt
Du gör en tillämpning och vill använda min fina addactionlistener() Du importerar biblioteket där den ligger och anropar den med ett hemsnickrat objekt som parameter Detta objekt har förhoppningsvis en metod actionperformed() Annars är vi kokta
Interface Ett sätt för mig att säga: det objekt som är parameter till min fina metod måste faktiskt ha en metod actionperformed() Ett sätt för dig att säga: Den klass jag nu skriver kommer garanterat att innehålla metoden actionperformed() Interface är ett sätt att formulera sådana garantier och kolla att de uppfylls
Ett interface innehåller metodhuvuden, dvs namn, typ och parametertyp(er) för metoden Det innehåller inga metodkroppar Ex: interface ActionListener { public void actionperformed(actionevent e);
interface ActionListener { public void actionperformed(actionevent e); public void addactionlistener(actionlistener actlist) { (koden för addactionlistener) Min kod Din kod class MyApplication implements ActionListener { public void actionperformed(actionevent e) { addactionlistener(new MyApplication())
interface ActionListener { public void actionperformed(actionevent e); Definierar vad det innebär att vara en ActionListener public void addactionlistener(actionlistener actlist) { (koden för addactionlistener) Min kod Din kod class MyApplication implements ActionListener { public void actionperformed(actionevent e) { addactionlistener(new MyApplication())
interface ActionListener { public void actionperformed(actionevent e); Definierar vad det innebär att vara en ActionListener public void addactionlistener(actionlistener actlist) { (koden för addactionlistener) Kräver att parametern är en ActionListener Min kod Din kod class MyApplication implements ActionListener { public void actionperformed(actionevent e) { addactionlistener(new MyApplication())
interface ActionListener { public void actionperformed(actionevent e); Definierar vad det innebär att vara en ActionListener public void addactionlistener(actionlistener actlist) { (koden för addactionlistener) Kräver att parametern är en ActionListener Min kod Din kod class MyApplication implements ActionListener { public void actionperformed(actionevent e) { Gör en utfästelse att klassens objekt ska bli ActionListeners addactionlistener(new MyApplication())
interface ActionListener { public void actionperformed(actionevent e); Definierar vad det innebär att vara en ActionListener public void addactionlistener(actionlistener actlist) { (koden för addactionlistener) Kräver att parametern är en ActionListener Min kod Din kod class MyApplication implements ActionListener { public void actionperformed(actionevent e) { Gör en utfästelse att klassens objekt ska bli ActionListeners uppfyller utfästelsen addactionlistener(new MyApplication())
Sanningen bakom ordet implements 2 Det möjliggör så kallad polymorfi: en metod kan ta parametrar av flera olika klasser
Exempel: bubblesort Vi har skrivit en metod bubblesort() som sorterar en array av heltal: void bubblesort(int[] data) {
Exempel: bubblesort Vi har skrivit en metod bubblesort() som sorterar en array av heltal: void bubblesort(int[] data) { Men samma metod skulle i princip kunna användas för att sortera - en array av float - en ArrayList av alla slags tal
Exempel: bubblesort Vi har skrivit en metod bubblesort() som sorterar en array av heltal: void bubblesort(int[] data) { Men samma metod skulle i princip kunna användas för att sortera - en array av float - en ArrayList av alla slags tal Måste jag skriva en ny bubblesort för varje sådant fall?
Nej! bubblesort() tar en parameter, data Vad är det jag ovillkorligen måste veta om den parametern? Jo, - jag måste kunna jämföra två intilligande tal - jag måste kunna byta plats på två intilliggande tal - jag måste kunna få reda på längden På alla datastrukturer som uppfyller detta kan jag göra bubblesort!
Formulera kravet Kravet formuleras som ett interface Det ska alltså vara tre metoder, en för jämförelse mellan position i och i+1, en för platsbyte mellan position i och i+1, och en för längden interface Bubblesortable { public boolean compare(int i); public void swap (int i); public int length();
Använd kravet när du gör bubblesort boolean bytintill(bubblesortable data) { boolean bytt = false; for (int i = 0; i < datalength() - 1; i++) { if (!datacompare(i)) { dataswap(i); bytt = true; return bytt; void bubblesort(bubblesortable data) { while (bytintill(data)) { interface Bubblesortable { public boolean compare(int i); public void swap (int i); public int length();
Uppfyll kravet för att använda bubblesort class MyStructure implements Bubblesortable { int[] data; public boolean compare(int i) { return data[i] < data[i + 1]; public void swap(int i) { int temp = data[i]; data[i] = data[i + 1]; data[i + 1] = temp; public int length() { return datalength; interface Bubblesortable { public boolean compare(int i); public void swap (int i); public int length();
Eller såhär class MyStructure2 implements Bubblesortable { ArrayList<Integer> data; public boolean compare(int i) { return dataget(i) < dataget(i + 1); public void swap(int i) { int temp = dataget(i); dataset(i, dataget(i + 1)); dataset(i + 1, temp); public int length() { return datasize(); interface Bubblesortable { public boolean compare(int i); public void swap (int i); public int length();
Fördel: Du definierar bubblesort en enda gång Du kan använda den på många olika klasser, nämligen på alla som implementerar interfacet Bubblesortable
OBS Användning av interface göra att java kollar att rätt metoder är definierade och har rätt typ av parametrar java kollar inte att metoderna faktiskt gör det som är tänkt!
Muslyssnare Tråkigt nog finns två olika lyssnartyper för mushändelser: MouseListener - lyssnar på musknappar och muspekarens närvaro i ett objekt MouseMotionListener - lyssnar på musrörelser
MouseListener public void mouseclicked(mouseevent e) public void mouseentered(mouseevent e) public void mouseexited(mouseevent e) public void mousepressed(mouseevent e) public void mousereleased(mouseevent e)
MouseMotionListener public void mousedragged(mouseevent e) public void mousemoved(mouseevent e)
ur dokumentationen för MouseMotionListener
Exempel Gör så att man kan ändra cirkelns storlek med musen buttondemo5
class DrawPanel extends JPanel implements ActionListener, MouseListener, MouseMotionListener { String filler = ""; int radius = 100; DrawPanel() { setpreferredsize(new Dimension(500, 500)); addmouselistener(this); addmousemotionlistener(this); public void paintcomponent(graphics g) { gsetcolor(colorwhite); gfillrect(0,0,500,500); gsetcolor(colorblack); gdrawoval(250-radius, 250-radius, 2*radius, 2*radius); gdrawstring(filler, 250,250);
class DrawPanel extends JPanel implements ActionListener, MouseListener, MouseMotionListener { String filler = ""; int radius = 100; DrawPanel() { setpreferredsize(new Dimension(500, 500)); addmouselistener(this); addmousemotionlistener(this); Objekten lyssnar av sina egna mushändelser public void paintcomponent(graphics g) { gsetcolor(colorwhite); gfillrect(0,0,500,500); gsetcolor(colorblack); gdrawoval(250-radius, 250-radius, 2*radius, 2*radius); gdrawstring(filler, 250,250);
class DrawPanel extends JPanel implements ActionListener, MouseListener, MouseMotionListener { String filler = ""; int radius = 100; DrawPanel() { setpreferredsize(new Dimension(500, 500)); addmouselistener(this); addmousemotionlistener(this); Objekten lyssnar av sina egna mushändelser Ny instansvariabel för cirkelns storlek public void paintcomponent(graphics g) { gsetcolor(colorwhite); gfillrect(0,0,500,500); gsetcolor(colorblack); gdrawoval(250-radius, 250-radius, 2*radius, 2*radius); gdrawstring(filler, 250,250);
public void actionperformed(actionevent e) { filler = ((JButton)(egetSource()))getText(); repaint(); public void mousepressed(mouseevent e) { setradius(e); public void mousedragged(mouseevent e) { setradius(e); public void mouseentered(mouseevent e) {; public void mouseexited(mouseevent e) {; public void mouseclicked(mouseevent e) {; public void mousereleased(mouseevent e) {; public void mousemoved(mouseevent e) {; void setradius(mouseevent e) { int xdist = egetx()-250; int ydist = egety()-250; radius = (int)mathsqrt(xdist*xdist + ydist*ydist); repaint();
public void actionperformed(actionevent e) { filler = ((JButton)(egetSource()))getText(); repaint(); public void mousepressed(mouseevent e) { setradius(e); public void mousedragged(mouseevent e) { setradius(e); public void mouseentered(mouseevent e) {; public void mouseexited(mouseevent e) {; public void mouseclicked(mouseevent e) {; public void mousereleased(mouseevent e) {; public void mousemoved(mouseevent e) {; Mushändelser som reageras på void setradius(mouseevent e) { int xdist = egetx()-250; int ydist = egety()-250; radius = (int)mathsqrt(xdist*xdist + ydist*ydist); repaint();
public void actionperformed(actionevent e) { filler = ((JButton)(egetSource()))getText(); repaint(); public void mousepressed(mouseevent e) { setradius(e); public void mousedragged(mouseevent e) { setradius(e); public void mouseentered(mouseevent e) {; public void mouseexited(mouseevent e) {; public void mouseclicked(mouseevent e) {; public void mousereleased(mouseevent e) {; public void mousemoved(mouseevent e) {; Mushändelser som reageras på Mushändelser som vi struntar i void setradius(mouseevent e) { int xdist = egetx()-250; int ydist = egety()-250; radius = (int)mathsqrt(xdist*xdist + ydist*ydist); repaint();
public void actionperformed(actionevent e) { filler = ((JButton)(egetSource()))getText(); repaint(); public void mousepressed(mouseevent e) { setradius(e); public void mousedragged(mouseevent e) { setradius(e); public void mouseentered(mouseevent e) {; public void mouseexited(mouseevent e) {; public void mouseclicked(mouseevent e) {; public void mousereleased(mouseevent e) {; public void mousemoved(mouseevent e) {; Mushändelser som reageras på Mushändelser som vi struntar i void setradius(mouseevent e) { int xdist = egetx()-250; int ydist = egety()-250; radius = (int)mathsqrt(xdist*xdist + ydist*ydist); repaint(); Omberäkning av radien
Nästa föreläsning: Bra om alla kommer i tid