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.

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

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

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

Laboration 4: Game of Life

Laboration 15 Grafiskt användargränssnitt

Monday, November 16, Senaste Labben

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

Frivillig Java-swing-Graphics-lab Programmeringsteknik MN1 vt02

Exempel på spelprogrammering i java.

Händelsestyrda program

Lektion Händelsehanterare

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

Lab5 för prgmedcl04 Grafik

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

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

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

Erfarenheter från biljardprojektet. måndag 23 november 15

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

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

Mer om grafiska komponenter. Händelsestyrda program

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

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

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

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

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 3

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

Tentamen i Objektorienterad programmering

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

Föreläsning 2, vecka 6: Tillstånd i objektorienterade program (och mera interface)

Java-concept och Swing. Swing low, sweet chariot

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

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

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

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

Tentamen i Objektorienterad programmering

Projekt 2 XL. Observer-mönstret

Applets med komponenter

OOP Objekt-orienterad programmering

Frames, menyer och GUI-program

Programstyrd / händelsestyrd

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

Labbinstruktioner för Java/Swing

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

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

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

OOP Objekt-orienterad programmering

Rita Egna Bilder, Timer

Tentamen FYTA11 Javaprogrammering

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

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

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

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

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

Lösningar för tenta 3 DAT043,

Lösningsförslag till tentamen

Objektorienterad programmering med Java Swing: Händelser, lyssnare och applets

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

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

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

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

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

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

MVC-mönstret. model-view-control i Swing

Tentamen Objekt-orienterad programmering med Java, 1DL100 Sommarkurs och distanskurs

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 3

Fönsterhantering, grafik

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

Lösningsförslag tentamen FYTA11 Java

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

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

ID1004 Laboration 3, 5-6 November 2012

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

SMD091 Lektion 9. Definition. Inkapsling. Lite repetition. Grafik. Gränssnitt Definition och Implementation. Sammansättning... Implementation.

Omentamen FYTA11 Javaprogrammering

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

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

kl

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

Arv och Grafiska Användargränssnitt

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

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

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

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.

Laboration 24 Databasen MySQL och java

Objektorienterad Programmering DAT043. Föreläsning 5 29/1-18 Moa Johansson (delvis baserat på Fredrik Lindblads material)

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

Tentamen FYTA11 Javaprogrammering

PROGRAMMERINGSTEKNIK TIN212

DAT043 - föreläsning 8

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

Dagens text. Programmeringsteknik. Mer om Scanner-klassen. Dialogrutor (klassen JOptionPane) Bubbelsortering. Omslagsklasser.

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

Lösningsförslag till tentamen

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

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Transkript:

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