Lektion Händelsehanterare

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

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

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

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

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

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

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

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

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

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

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

Mer om grafiska komponenter. Händelsestyrda program

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

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 3

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

Rita Egna Bilder, Timer

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

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

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

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

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

Händelsestyrda program

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

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 3

Lösningar till tentamen i EDAF25

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.

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

OOP Objekt-orienterad programmering

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

Properties. Användbara metoder som kan anropas i propertychanged:

SI-pass 4. Johan Brook och Jesper Persson. 25 september Diskutera och svara på om påståendena nedan är äkta sanningar eller listiga lögner.

Java-concept och Swing. Swing low, sweet chariot

Fönsterhantering, grafik

Lösningsförslag till tentamen

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.

Föreläsning 15: Repetition DVGA02

Lab5 för prgmedcl04 Grafik

Frivillig Java-swing-Graphics-lab Programmeringsteknik MN1 vt02

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

Frames, menyer och GUI-program

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

Tentamen. DD2385 Programutvecklingsteknik vt Fredagen den 5 juni 2009 kl Inga hjälpmedel utom penna, sudd och linjal

Programstyrd / händelsestyrd

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

Tentamen i Objektorienterad programmering

OOP Objekt-orienterad programmering

Lösningar till tentamen i EDAF25

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

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

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

Lösningsförslag tentamen FYTA11 Java

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

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

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

Laboration 15 Grafiskt användargränssnitt

Exempel på spelprogrammering i java.

PROGRAMMERINGSTEKNIK TIN212

Klasshierarkier - repetition

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

Exempel på användning av arv: Geometriska figurer

Laboration 4: Game of Life

Objektorienterad Programkonstruktion. Föreläsning 4 8 nov 2016

Applets med komponenter

Föreläsning 8. Arv. Arv (forts) Arv och abstrakta klasser

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

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

Arv. Fundamental objekt-orienterad teknik. arv i Java modifieraren protected Lägga till och modifiera metoder med hjälp av arv Klass hierarkier

Arv och Grafiska Användargränssnitt

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

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

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

Lösningsförslag till tentamen

DI-institutionen Sid 1 av 5 Hans-Edy Mårtensson Sten Sundin Micael Karlsson

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

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

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

Grafiska användargränssnitt i Java

Tentamen. DD2385 Programutvecklingsteknik vt Tisdagen den 26 maj 2009 kl Inga hjälpmedel utom penna, sudd och linjal

DAT043 - föreläsning 8

Lösningar för tenta 3 DAT043,

UML. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Tentamen i EDAF25. 1 juni Skrivtid: Skriv inte med färgpenna enda tillåtna färg är svart/blyerts.

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

Vad kännetecknar en god klass. Vad kännetecknar en god klass. F12 Nested & Inner Classes

Laboration 24 Databasen MySQL och java

Föreläsning 7. Grafiska användargränssnitt

Grafiska användargränssnitt i Java

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

Monday, November 16, Senaste Labben

Objektorienterad Programkonstruktion, DD1346. Tentamen , kl

GUI-programmering. Gustav Taxén Martin Berglund DH2640 Grafik och Interaktionsprogrammering VT 2008

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

Konstruktion av klasser med klasser

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

Föreläsning 13 Innehåll

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

Java-syntax (arv) Exempel: public class Crow extends Bird {... } Jämför med Lab 1: public class FirstApp extends Frame {... }

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

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

Föreläsningsmaterial (Arv) Skrivet av Andreas Lund

Transkript:

Lektion Händelsehanterare Händelsehanterare kallas även lyssnare. En lyssnare har som uppgift att ta hand om olika händelser som kan inträffa. För att lyssnaren skall reagera på händelser måste den registreras hos den aktuella komponenten. Registrering innebär att den kopplas till ett objekt och läggs till i en lista av händelsehanterare. Varje komponent har en sådan lista. Aktionslyssnare En vanlig situation är att vi har en knapp i ett fönster och att något ska hända när vi trycker på knappen. T ex känner vi igen vår ButtonTest : class MyPanel extends JPanel implements ActionListener { public void actionperformed(actionevent evt) { Object source = evt.getsource();... public void paintcomponent(graphics g) {... Tillägget implements ActionListener måste vara med. Vi får alltså kompileringsfel om det inte är med, liksom när det är med och metoden actionperformed saknas. Vi kan göra på samma sätt när det gäller muslyssnare, tangentlyssnare, osv. Men det blir inte lika enkelt för andra händelseklasser har oftast flera metoder som måste definieras. T ex för tangenthändelser måste alla ingående metoderna finnas med även om inte alla får något vettigt innehåll. else if (e.getkeycode() == KeyEvent.VK_DOWN){ else if (e.getkeycode() == KeyEvent.VK_LEFT){ else if (e.getkeycode() == KeyEvent.VK_RIGHT){ public void keyreleased(keyevent e){ public void keytyped(keyevent e){ se hela filen KeyListener_verA.java i slutet på dokumentet Sida 1

Lyssnargränssnitten kräver att alla metoder implementeras, oavsett hur många man egentligen använder. Om man använder bara någon enstaka metod måste en mängd tomma metoder skrivas, vilket inte bara är onödigt utan också leder till svårlästa program. För att minska skrivarbetet finns några s.k. adaptrar, tomma implementationer av lyssnargränssitten, definierade. I stället för att implementera ett gränssnitt kan man skapa en subklass till en adaptor: //Skapa lyssnaren i en komponent-konstruktor (i en JComponent subklass) class TangentLyssnare extends KeyAdapter { else if (e.getkeycode() == KeyEvent.VK_DOWN){ else if (e.getkeycode() == KeyEvent.VK_LEFT){ else if (e.getkeycode() == KeyEvent.VK_RIGHT){ TangentLyssnare tanglyssnare = new TangentLyssnare(); t.addkeylistener(tanglyssnare); Exemplet vi sett har en inre klasser, d.v.s. klasser som helt definieras inne i andra klasser. Inre klasser kan komma åt den omgivande klassens metoder och attribut. En instans av en inre klass kan finnas och fungera bara inuti en instans av sin omgivande klass. se hela filen KeyListener_verB.java i slutet på dokumentet Klassen TangentLyssnare i exemplet har som enda uppgift att implementera händelsehanteringen. Själva namnen är ointressanta och faktum är att Java tillåter icke namngivna inre klasser, s.k. anonyma klasser. Vi skulle kunna förenkla exemplet: //När vi ärver en adapterklass kan vi skriva allt ännu kortare genom tekniken "anonyma klasser" KeyListener klyssnare = new KeyAdapter(){ else if (e.getkeycode() == KeyEvent.VK_DOWN){ else if (e.getkeycode() == KeyEvent.VK_LEFT){ else if (e.getkeycode() == KeyEvent.VK_RIGHT){ ; //OBS! semikolon Ett överdrivet användande av inre och speciellt anonyma klasser gör koden klart oläsbar varför man bör vara sparsam med dem: anonyma klasser bör ha en eller högst två metoder och vara av typen "klass som gör en enda sak" (som adaptern). se hela filen KeyListener_verC.java i slutet på dokumentet Sida 2

Till sist så är det ju lite fult med att knappen ska innehålla tangentlyssnaren så ett exempel på hur man kan lägga det i en panel. Skapar därför en extra panel som får lyssnaren istället för knappen. Den panelklassen blir då en inre klass. se hela filen KeyListener_verD.java i slutet på dokumentet Bra teori att läsa Exemplen nedan. Övningar Övning 1 Valfritt Sida 3

//KeyListener_verA.java class Pan extends JPanel implements ActionListener, KeyListener{ //Knappen är den komponent vi hänger på tangentlyssnaren på JButton t; t.addkeylistener(this); yled=0; xled=0; //I lyssnarklassen KeyEvent finns TRE metoder som måste specificeras // genom att vi använder gränssnittet KeyListener //Vi måste här ange alla tre även om inte alla ska göra något else if (e.getkeycode() == KeyEvent.VK_DOWN){ else if (e.getkeycode() == KeyEvent.VK_LEFT){ else if (e.getkeycode() == KeyEvent.VK_RIGHT){ public void keyreleased(keyevent e){ public void keytyped(keyevent e){ //Metoden för att rita upp allt g.filloval(xled,yled,30,30); class Window extends JFrame{ public class KeyListener_verA{ Sida 4

//KeyListener_verB.java class Pan extends JPanel implements ActionListener{ //Knappen är den komponent vi hänger på tangentlyssnaren på JButton t; //I lyssnarklassen KeyEvent finns TRE metoder som måste specificeras //Ibland utnyttjar man inte alla metoder, t ex så vill vi bara använda en enda. //Då kan det vara mer praktiskt att använda något som kallas adapterklasser(en abstrakt klass som //implementerar motsvarande gränssnitt) och som finns i java.awt.event. //De innehåller bara tomma metoder men ändå definierade. När vi nu skapar en egen lyssnarklass som //en subklass av adapterklassen behöver vi bara definiera de metoder vi vill använda. // //Skapa lyssnaren i en komponent-konstruktor (i en JComponent subklass) class TangentLyssnare extends KeyAdapter { else if (e.getkeycode() == KeyEvent.VK_DOWN){ else if (e.getkeycode() == KeyEvent.VK_LEFT){ else if (e.getkeycode() == KeyEvent.VK_RIGHT){ TangentLyssnare tanglyssnare = new TangentLyssnare(); t.addkeylistener(tanglyssnare); yled=0; xled=0; //Metoden för att rita upp allt g.filloval(xled,yled,30,30); class Window extends JFrame{ public class KeyListener_verB{ Sida 5

//KeyListener_verC.java class Pan extends JPanel implements ActionListener{ //Knappen är den komponent vi hänger på tangentlyssnaren på JButton t; //I lyssnarklassen KeyEvent finns TRE metoder som måste specificeras //Ibland utnyttjar man inte alla metoder, t ex så vill vi bara använda en enda. //Då kan det vara mer praktiskt att använda något som kallas adapterklasser(en abstrakt klass som //implementerar motsvarande gränssnitt) och som finns i java.awt.event. //De innehåller bara tomma metoder men ändå definierade. När vi nu skapar en egen lyssnarklass som //en subklass av adapterklassen behöver vi bara definiera de metoder vi vill använda. // //När vi ärver en adapterklass kan vi skriva allt ännu kortare genom tekniken "anonyma klasser" KeyListener klyssnare = new KeyAdapter(){ else if (e.getkeycode() == KeyEvent.VK_DOWN){ else if (e.getkeycode() == KeyEvent.VK_LEFT){ else if (e.getkeycode() == KeyEvent.VK_RIGHT){ ; t.addkeylistener(klyssnare); yled=0; xled=0; //Metoden för att rita upp allt g.filloval(xled,yled,30,30); class Window extends JFrame{ public class KeyListener_verC{ Sida 6

//KeyListener_verD.java class Pan extends JPanel implements ActionListener{ //Inre klass class RitPanel extends JPanel { g.filloval(xled,yled,40,40); setbackground(new Color(200,200,0)); //Ritpanelen är den komponent vi hänger på tangentlyssnaren på RitPanel rp; JButton b; //Tangentlyssnare genom tekniken "anonyma klasser" KeyListener klyssnare = new KeyAdapter(){ else if (e.getkeycode() == KeyEvent.VK_DOWN){ else if (e.getkeycode() == KeyEvent.VK_LEFT){ else if (e.getkeycode() == KeyEvent.VK_RIGHT){ ; setbackground(color.white); b = new JButton("Clear"); rp = new RitPanel(); add(rp); add(b); rp.setbounds(0,0,600,550); b.setbounds(250,555,100,30); rp.addkeylistener(klyssnare); b.addactionlistener(this); rp.setfocusable(true); rp.requestfocus(); yled=0; xled=0; class Window extends JFrame { setresizable(false); public class KeyListener_verD { Sida 7