Next previous GRIP 2000 Föreläsning 4 Innehåll Inmatningstyper Modeller för interaktiva applikationer Observer MVC Lyssnare Pluggbara komponenter Exempel.

Slides:



Advertisements
Liknande presentationer
Next previous Björn Eiderbäck NADA, KTH Innehåll Klassdiagram i mer detalj Visibility och modifierare (vilka.
Advertisements

Innehåll, huvudpresentation 4. Rangordning av ordningsstörningar (fråga 1) 5. Problem med nedskräpning (fråga 1a) 6. Problem med skadegörelse (fråga 1b)
Array Skriv ett program som frågar följande: ”Hur många tal vill du mata in?” användaren matat in ett tal t.ex n. då frågar programmet n ggr följande.
Stefan Möller OOP F16:1 OOP Objekt-orienterad programmering Föreläsning 16 Grafiska användargränssnitt, GUI Ytor Komponenter Layout-managers Lyssnare.
Next previous Frameworks. Konstruktion av fönster, gränssnitt och användning av grafik i Java OOMPA 2000 Föreläsning 15 Innehåll, kort om: Frameworks Grafik.
BENÄMNA lätta ord SPRÅKTRÄNING VID AFASIKg VIII
Klasser och objekt.
Tillämpning av bolagsstyrningskoden vid årsstämmor 2005 och 2006.
Föreläsning 3 Lista Array/länkad lista Lista implementerad som länkad lista Inlämningsuppgifter.
Hela Sverige ska leva Totalrapport. Regeringens bidrag har medverkat till kunskapsförmedling?
Next previous Internetprogrammering 2000 Internetprogrammering 2000 Föreläsning 10 Distribuerad programmering med Javas RMI, Remote Method Invocation.
Projektföljeforskning
Next previous Innehåll Klassen URL Arbeta med URLer, exempel Referenser Harold,”Java Network Programming”, Elliotte Harold Hall, "CORE Web Programming"
Objektorienterad utveckling
Klassarv och inkapsling
Eddie Arnold - Make The World Go Away Images colorées de par le monde Déroulement automatique ou manuel à votre choix 1 för dig.
Objektorienterad utveckling Lektion 2 Objekt, överlagring, överskuggning, klasshierarkier och dynamisk bindning KTH Peter Mozelius.
Föreläsning 2 Datastrukturer Abstrakta datastrukturer Stack
Metoder i java Det finns två typer av metoder i java
Övning5 Så här ska man tänka när man löser uppgift 1 på tentan lite grafik, så här söker man genom en lista så här läser man från en fil i java lösa uppgift.
Välkommen Vahid Mosavat
Programmeringsteknik för K och Media
1 ITK:P1 Föreläsning 4 Grafiska gränssnitt och händelsehantering DSV Peter Mozelius.
Förstudie 2. Design 3. Migrering 4 Analys av befintlig miljö –Microsoft Assessment and Planning (MAP) kan användas för att analysera sin miljö.
Next previous Lite mer om synkronisering. Mer om Java och trådar. RMI Objektorienterad Realtidsprogrammering 2000 Objektorienterad Realtidsprogrammering.
Next previous Innehåll Klassen URL Arbeta med URLer, exempel Speciella referenser (som används i här) Harold, dvs kursboken ”Java Network Programming”
Svenska WebDewey Introduktion
UNIONEN - tillgänglighet under semestern 2014
Java Nätverks API URL sockets.
Karolinska Institutet, studentundersökning Studentundersökning på Karolinska Institutet HT 2013.
Punktprevalensmätning av trycksår 2011, v.40 Resultat från landstingen
Bastugatan 2. Box S Stockholm. Blad 1 Läsarundersökning Maskinentreprenören 2007.
Exception Handling Kapitel 9. Agenda Exceptions try, throw and catch Skapa en egen exception-klass Multipla throw / catch Slänga vidare en exception Olika.
Svenska WebDewey Introduktion Harriet Aagaard Svenska Deweyredaktion
OOP F4:1 Marie Olsson OOP Objekt-orienterad programmering Föreläsning 4 Metoder klass-metoder instans-metoder.
Variabler: Datatyp - grundläggande : int, double, char, boolean eller
Enkätresultat för Grundskolan Elever 2014 Skola:Hällby skola.
1 Vänsterskolan Debattartiklar. 2 Aktuell krok 3 Aktuella krokar 1. Direkt krok.
Next previous Föreläsning ii - Mer om Java bla this och konstruktorer Av Björn Eiderbäck Adress: Rum 1641, 6tr NADA Osquars Backe.
Vektorer (klassen Vector) Sortering
Hittarps IK Kartläggningspresentation år 3.
Från Gotland på kvällen (tågtider enligt 2007) 18:28 19:03 19:41 19:32 20:32 20:53 21:19 18:30 20:32 19:06 19:54 19:58 20:22 19:01 21:40 20:44 23:37 20:11.
Arbetspensionssystemet i bilder Bildserie med centrala uppgifter om arbetspensionssystemet och dess funktion
TÄNK PÅ ETT HELTAL MELLAN 1-50
Programmeringsteknik för Media1 & K1
Helhet Händelse Agerande Kunskap om vardagsverksamheten Förståelse av vardagsverksamheten.
1 Joomla © 2009 Stefan Andersson 1. 2 MÅL 2 3 Begrepp Aktör: en användare som interagerar med webbplatsen. I diagrammet till höger finns två aktörer:
Kouzlo starých časů… Letadla Pár foteček pro vzpomínku na dávné doby, tak hezké snění… M.K. 1 I Norrköping får man inte.
1 Föreläsning 7 Repetition Instansvariabler och klassvariabler Klassmetoder och Instansmetoder.
1 Mer om Nr 7 Rekursion, listor, typer och funktioner.
ITK:P1 Lektion 4 Att implementera en spelidé i Java DSV Peter Mozelius.
1 MSPEL Lektion 2 DSV Peter Mozelius Spel i Java applets.
Arbetspensionssystemet i bilder Bildserie med centrala uppgifter om arbetspensionssystemet och dess funktion
1 Föreläsning 6 Programmeringsteknik och Matlab 2D1312/2D1305 Metoder & parametrar Array API och klassen ArrayList.
Enkätresultat för Grundskolan Föräldrar 2014 Skola - Gillberga skola.
Föreläsning 1 Reserverade ord Javas API Identifierare Litteraler Variabler Kompilering och interpretering.
Next previous GRIP 2000 Föreläsning 4 Innehåll Inmatningstyper Modeller för interaktiva applikationer Observer MVC Lyssnare Pluggbara komponenter Exempel.
Föreläsning 5 Arrayer & ArrayList Hur man använder API:n
Kartminne En serie bilder som ger övning av ”rutinen” Tänk på: –Vart är jag på väg? –Varifrån är kontrollen lättast att ta? –Vilken är sista säkra? –Förenkla.
ITK:P1 Föreläsning 2 Introduktion till objektorientering DSV Marie Olsson.
0. Kod, Klassdiagram och Sekvensdiagram import java.awt.event.*; import javax.swing.*; import java.awt.*; public class TwoThreads implements ActionListener.
Förskoleenkät Föräldrar 2012 Förskoleenkät – Föräldrar Enhet:Hattmakarns förskola.
Föreläsning 13 Appletprogram/fristående grafiska program Arv Rita linjer, rektanglar mm Skriva text, byta färg Appletprogram & HTML Grafiska användargränssnitt.
Class VattenKraft{ public static void main(String[] args){ int num=150; int i, totflöde, maxflöde; int[] fall = new int[num]; //vattenflödet i vattenfallen.
Föreläsning 9 Arv kap 8.1 Interface kap 9.2 Grafiska användargränssnitt (GUI) kap 10.
Bild 1 Prognos för länets arbetsmarknad Stefan Tjb.
TILLÄMPAD DATALOGI (TILDA) Övningsgrupp 2 Marcus Hjelm
OOP F5:1 Stefan Möller OOP Objekt-orienterad programmering Föreläsning 5 Klasser och objekt Skapa objekt - new Referenser Konstruktorer Inkapsling.
Övning2 programmeringsteknik och Matlab 2D1312/ 2D1305
Övning 3. Repetition Metoder class RepetitionMetoder { public static void main(String [] args) double längd = 2.0; double bredd = 1.0; double area =
Presentationens avskrift:

next previous GRIP 2000 Föreläsning 4 Innehåll Inmatningstyper Modeller för interaktiva applikationer Observer MVC Lyssnare Pluggbara komponenter Exempel

previous next 2 Modeller för interaktiva applikationer Olika inmatningstyper Request mode –Vänta tills dess att något sker tex på inmatning via tangentbordet eller klick på mus –traditionell inmatning från tangentbord, scanf (C), readln (Pascal) sensor.waitButton(); gc.displayString("Inmatning ", sensor.pos()); Samplad/pollad –Kontrollera status för enhet Omedelbar avläsning tex är någon knapp på musen nertryckt while(sensor.anyButtonPressed()) { pen.moveTo(sensor.mousePoint()); }

previous next 3 Modeller för interaktiva applikationer... inmatningstyper Händelsestyrd –Förändringar hos enheter placeras i en kö intresserade program meddelas om att händelse inträffat från början av kön (flera kan alltså meddelas om samma händelse) Det är sedan upp till varje program att själv bestämma hur det skall (eller inte skall) reagera –Exempel, en metod som reagerar om händelsen dubbeklick inträffar public void doubleClickEvent(Event event) { frame.setLocation(event.position()); }

previous next 4 Modeller för interaktiva applikationer Modeller för konstruktion av interaktiva tillämpningar – Modeller Seeheim PAC MVC –Tekniker Call-back Händelsebaserade Adaptorer, listeners Pluggbara –”Stil” Direktmanipulativ, grafisk Drag-and-drop Objektorienterad

previous next 5 Modeller för interaktiva applikationer Modeller för konstruktion av interaktiva tillämpningar Separation av applikation och presentation –Newman’s Reaction Handler, 1968 Var först med att separera applikation från presentation Seeheim, MVC och PAC –Seeheim, 1985 På en Workshop i Seeheim konstruerade man den första konceptuella arkitekturen för ett User Interface Management System (UIMS). Man identifierade följande logiska komponenter i ett UIMS –presentation - visualisering, in- och utmatning –dialog kontroll - styr kommunikation mellan presentation och applikation –tillämpningsgränssnitt - ”interfacesemantik” i applikation

previous next 6 Modeller för interaktiva applikationer... –Model View Controller (MVC), andra hälften av talet Delar upp applikationerna i tre komponenter –applikation (modell) –presentation (vy) –interaktion (kontroll) –Presentation Abstraction Control (PAC), 1989 Delar också upp applikationen i tre delar –abstraktion –presentation –kontroll Mer konceptuell än MVC

previous next 7 Modeller för interaktiva applikationer Model View Controller (MVC) Model: logiken View: presentationen Controller: interaktionen PresenterarInteragerar Applikationslogiken M VC

previous next 8 Modeller för interaktiva applikationer Presentation Abstraction Control (PAC) Abstraction Control PresentationUser

previous next 9 Modeller för interaktiva applikationer Observer, beroenden mellan objekt Problem Hur kan vi konstruera en mekanism som tillåter att vissa objekt meddelas om någon vital del förändras i andra objekt utan att objekten görs starkt knutna till varandra? Krafter – Vi vill undvika stark koppling och beroende mellan objekten – Intresserade objekt skall informeras om något förändras. Lösning Upprätthåll en lista av objekt som är beroende av ett visst objekt. Om objektet förändras skall dom beroende objekten meddelas. Dom beroende objekten skall vart och en själva avgöra hur dom skall reagera på förändringen.

previous next 10 Modeller för interaktiva applikationer... * Subject attach(Observer) detach(Observer) notify() Observer update() for all o in observers { o.update(); } observers

previous next 11 Modeller för interaktiva applikationer …Javalösning: observer... Javalösning med Observer och Observable. I Java kan ett objekt som vill vara beroende av ett annat objekt implementera gränssnittet Observer medan det objekt som observeras görs till subklass till klassen Observable (eller möjligen använder ett fält som är subklass till denna typ). Gränssnittet Observer : package java.util; public interface Observer { void update(Observable o, Object arg); }

previous next 12 Modeller för interaktiva applikationer … klassen Observable... package java.util; public class Observable { private boolean changed = false; private Vector obs; private Observer[] arr = new Observer[2]; public Observable() {obs = new Vector();} public synchronized void addObserver(Observer o) { if (!obs.contains(o)) {obs.addElement(o);} } public synchronized void deleteObserver(Observer o) { obs.removeElement(o); } Lägg till observer Ta bort observer

previous next 13 Modeller för interaktiva applikationer … Observable forts... public void notifyObservers() {notifyObservers(null);} public void notifyObservers(Object arg) { int size=0; synchronized (this) { if (!hasChanged()) return; size = obs.size(); if (size > arr.length) {arr = new Observer[size];} obs.copyInto(arr); clearChanged(); } for (int i = size -1; i>=0; i--) { if (arr[i] != null) { arr[i].update(this, arg); } Från vem Argument till uppdateringen Meddelandet update(…) skickas till alla observers Om vi inte anger argument så läggs null på som argument Metoder för att meddela att objektet ändrats

previous next 14 Modeller för interaktiva applikationer … klassen Observable forts... public synchronized void deleteObservers() { obs.removeAllElements(); } protected synchronized void setChanged() {changed = true;} protected synchronized void clearChanged() {changed = false;} public synchronized boolean hasChanged() {return changed;} public synchronized int countObservers() {return obs.size();} } Sätt eller ta bort changed-flagga

previous next 15 Modeller för interaktiva applikationer … observer... Exempel: MessageBoard och beroende studenter import java.util.*; class MessageBoard extends Observable { private String message; public String getMessage(){return message;} public void changeMessage(String aMessage){ message = aMessage; this.setChanged(); this.notifyObservers(message); } Argumentet sparas (om tex något beroende objekt vill läsa av det) Vi indikerar att objektet ändrats Vi meddelar beroende objekt, med message som argument Subklassa Observable

previous next 16 Modeller för interaktiva applikationer … observer: exempel... import Persons.*; import java.util.*; class Student extends Persons.Student implements Observer { public void update(Observable o, Object arg){ System.out.println(this.christianName() + " tar emot meddelande: " + arg); } public Student(String christianName, String familyName, String pnr, String programme, String ) { super(christianName, familyName, pnr, programme, ); } I update(…) definierar vi vad som skall göras då objektet får reda på att ett objekt som det är beroende av ändrats Implementera gränssnittet Observer Vi antar att det redan finns en "vanlig" implementation av Student, som vi utökar

previous next 17 Modeller för interaktiva applikationer … observer: exempel... public class TestObserver { public static void main(String [] args) { MessageBoard board = new MessageBoard(); Student pers1 = new Student("Kalle", "Person", "133", "D96", pers1.addCourse("GRIP2000"); pers1.addCourse("COOKING99"); board.addObserver(pers1); board.changeMessage("Ny person: " + pers1.christianName()); /* Utskriften blir Kalle tar emot meddelande: Ny person: Kalle */ Gör pers1 beroende av board Meddela att board ändrats

previous next 18 Modeller för interaktiva applikationer … observer: exempel... Student pers2 = new Student("Olle", "Olsson", "113", "D96", pers2.addCourse("GRIP2000"); pers2.addCourse("ENGLISH-1"); board.addObserver(pers2); board.changeMessage("Ny person: " + pers2.christianName()); /* Utskriften blir Olle tar emot meddelande: Ny person: Olle Kalle tar emot meddelande: Ny person: Olle */ Gör pers2 beroende av board Meddela att board ändrats

previous next 19 Modeller för interaktiva applikationer … observer: exempel Student pers3 = new Student("Lotta", "Andersson", "123", "F97", pers3.addCourse("MDI00"); pers3.addCourse("GRIP2000"); board.addObserver(pers3); board.changeMessage("Ny person: " + pers3.christianName()); /* Utskriften blir Lotta tar emot meddelande: Ny person: Lotta Olle tar emot meddelande: Ny person: Lotta Kalle tar emot meddelande: Ny person: Lotta */ }

previous next 20 Modeller för interaktiva applikationer Model View Controller (MVC) Baseras på mönstret Observer –Vyerna observerar (prenumererar på) förändringar hos modellen (publicisten) –Annorlunda uttryckt: En vy görs beroende (eng. dependent) av modellen Vid intressanta förändringar i modellen så meddelas dom beroende objekten (dvs vyerna) –Ren struktur Modellen skall inte ha någon direkt vetskap om vilka eller hur många vyer som är beroende av den Modellen skall inte heller ta hänsyn till hur dess data presenteras eller hur man interagerar med den

previous next 21 Modeller för interaktiva applikationer MVC (Konkret struktur, med principkod) Modellen har implicita referenser till vyerna vyerna blir automatisk beronde då modellen anges via meddelandet model(Model aModel) view.model(aModel) dependents

previous next 22 Modeller för interaktiva applikationer MVC (Modellen ändras) - principiell kod Vid förändring görs (alternativt) model.changed() model.changed(argument) model.changed(argument, parameter) Vyn får meddelandet update(argument, parameter, avsändare) Denna metod finns i klassen objekt så om man inte vill ta hand om argument räcker det att implementera update(argument, parameter) eller update(argument)

previous next 23 Modeller för interaktiva applikationer Sammanfattning konstruktion med View- Controller (typfall) 1 Skapa klasser –Skapa vy Som sublass till View –Skapa kontrollklass Som subklass till ControllerWithMenu –Gör kontrollern till defaultklass för vyn Skriv metod defaultControllerClass som returnerar kontrollklassen –Skapa enkelt gränssnitt Använd gärna gränssnittsbyggare och konstruera en gränssnittsklass med en komponent av typ ”view holder” Skriv metod med samma namn som propertien view i ”view holdern” –från denna metod skall en referens till önskad (egen) vy returneras

previous next 24 Modeller för interaktiva applikationer... 2 Definiera hur utritning går till –steg 1 skriv metoden displayOn : i vyn –senare då vi använder modell kan vi göra lite mer sofistikerade saker 3 Definiera hur inmatning från mus skall hanteras skriva metod redButtonPressedEvent :, mouseMovedEvent :, etc konstruera gränsnitt med gränssnittsbyggaren 4 Tangentbordsinmatning –Enklast är att ”köra” eventbaserat och att använda gränssnittsbyggaren skriv metod desiresFocus skriv keyPressedEvent : mfl

previous next 25 Modeller för interaktiva applikationer Problem med MVC Ibland svårt att definitivt separera funktionalitet mellan modell, vy och kontroller Dela istället in applikationen i en datamodell och applikationsmodell Applikationsmodell Datamodeller Applikationsmodellen kan då innehålla kod som är relaterad till användargränssnittet, dvs controller och view men fortfarande bevaras den lösa kopplingen till datamodellen

previous next 26 Modeller för interaktiva applikationer MVC i JAVA class MinModell extends Observable –lägg till UI-objekt som prenumerant, dvs addObserver(Observer o) –skicka changed, dvs setChanged(); notifyObservers(); till modellobjektet om intressant ändring skett class MinUIClass extends Component implements Observer –implementera update(Obsevervable o, Object x) uppdatera skärmen

previous next 27 Modeller för interaktiva applikationer Java Eventmodell 1.1 Java 1.1 och senare har en modell där man definierar objekt som tar omhand om händelser som sker i komponenter i gränssnitten I princip sätter man upp en händelselyssnare per typ (tangentbord, mus, fokus, etc.) av händelse man är intresserad av i appleten Varje komponent (knapp, fält, mfl) kan också hanteras av sin egen händelselyssnare buttonX.addActionListener(myListenerForButtonX) Med fördel används anonyma klasser för att definiera lyssnare för olika objekt

previous next 28 Modeller för interaktiva applikationer Händelselyssnare Händelser till ett fönster eller komponent tas omhand av händelselyssnare –påminner mycket om mönstret Observer, och i grafiska sammanhang om MVC, fast dom "beroende" objekten, dvs lyssnarna, måste implementera ett mer varierat utbud av metoder beroende av typ av lyssnare måste olika API:er implementeras Olika typer av lyssnare tar hand om olika typer av händelser, MouseListener, WindowListener, FocusListener, ActionListener, osv –Namnet är uppbyggt på följande sätt: HändelsetypListener Till varje lyssnare finns ett speciellt interface som beskriver vilka metoder som lyssnaren implementerar Lyssnarna och deras interface tillhör ett gemensamt package nämligen: java.awt.event

previous next 29 Modeller för interaktiva applikationer Händelselyssnare, några typiska EventListener ActionListener ComponentListener FocusListener KeyListener MouseMotionListener MouseListener TextListener WindowListener ItemListener ContainerListener AdjustmentListener

previous next 30 Modeller för interaktiva applikationer Exempel: implementation av lyssnare direkt package GRIP2000F4; import java.awt.*; import java.awt.event.*; public class MyFrame1 extends Frame implements WindowListener{ public void windowOpened(WindowEvent e) {} public void windowClosing(WindowEvent e) { System.exit(0); } public void windowClosed(WindowEvent e) {} public void windowIconified(WindowEvent e) {} public void windowDeiconified(WindowEvent e) {} public void windowActivated(WindowEvent e) {} public void windowDeactivated(WindowEvent e) {}

previous next 31 Modeller för interaktiva applikationer... public static void main(String [] args) { MyFrame1 frame = new MyFrame1(); frame.setTitle("Fönster som lyssnar efter fönsterhändelser v1 (fönstret gör det själv)"); frame.setSize(400, 300); frame.addWindowListener(frame); frame.setVisible(true); }

previous next 32 Modeller för interaktiva applikationer Exempel: lyssnare som inre klass package GRIP2000F4; import java.awt.*; import java.awt.event.*; class MyWindowListener implements WindowListener { public void windowOpened(WindowEvent e) {} public void windowClosing(WindowEvent e) { System.exit(0); } public void windowClosed(WindowEvent e) {} public void windowIconified(WindowEvent e) {} public void windowDeiconified(WindowEvent e) {} public void windowActivated(WindowEvent e) {} public void windowDeactivated(WindowEvent e) {} }

previous next 33 Modeller för interaktiva applikationer... public class MyFrame2 extends Frame { public static void main(String [] args) { Frame frame = new MyFrame2(); frame.setTitle("Fönster som lyssnar efter fönsterhändelser v2 (med inre klass)"); frame.setSize(400, 300); frame.addWindowListener(new MyWindowListener()); frame.setVisible(true); }

previous next 34 Modeller för interaktiva applikationer Adaptorer och händelselyssnare För att förenkla användningen av händelselyssnare finns ett antal fördefinierade adaptorer –Dessa adaptorer implementerar alla metoder deklarerade i den aktuella lyssnarens gränssnitt –En adaptor implemeneterar endast tomma metoder –Genom att subklassa en adaptor och använda den som lyssnare så räcker det att endast skriva om dom metoder som verkligen gör något, så slipper man som i föregående exempel implementera massa metoder utan metodkropp –Dessa adaptorer är speciellt enkla att använda tillsammans med anonyma inre klasser

previous next 35 Modeller för interaktiva applikationer Adaptorer Object ContainerAdapter FocusAdapter ComponentAdapter MouseMotionAdapter MouseAdapter WindowAdapter ActionListener ComponentListener FocusListener KeyListener MouseMotionListener MouseListener TextListener WindowListener ItemListener ContainerListener AdjustmentListener KeyAdapter Klasser Gränssnitt

previous next 36 Modeller för interaktiva applikationer Exempel: lyssnare via adapter class MyWindowAdapter extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); } public class MyFrame3 extends Frame { public static void main(String [] args) { Frame frame = new MyFrame3(); frame.setTitle("Fönster som lyssnar efter fönsterhändelser v3 (med egen adapter)"); frame.setSize(400, 300); frame.addWindowListener(new MyWindowAdapter()); frame.setVisible(true); }

previous next 37 Modeller för interaktiva applikationer Exempel: lyssnare via anonym subklass public class MyFrame4 extends Frame { public static void main(String [] args) { Frame frame = new MyFrame4(); frame.setTitle("Fönster som lyssnar efter fönsterhändelser v4 (med anonym subklass till adapter)"); frame.setSize(400, 300); frame.addWindowListener(new WindowAdapter (){ public void windowClosing(WindowEvent e) { System.exit(0); } }); frame.setVisible(true); }

previous next 38 Modeller för interaktiva applikationer Kommunicera och prenumerera på förändringar (en kort repetition) Traditionellt –callbacks dvs en funktion kopplas till att ta emot en viss händelse från systemet eller komponent OpenGL, X enkelt  statiskt –MVC baseras på Observer/beroenden alla typer av förändringar via samma ”kanal” –möjligen parameterstyrt generellt (språk-) neutralt skalbart/distribuerbart  en ”kanal” med dispatching hos klient

previous next 39 Modeller för interaktiva applikationer... Lyssnare och adaptorer –ett helt objekt kopplas till en viss typ av händelse högre nivå än call-backs  lite komplext (och fördolt) beteende  mest ett problem för ovana användare av det aktuella systemet –finns stöd för detta i Java –med fördefinierade listener-interface och adaptorer specialiserade –kopplade främst till grafiska komponenter Smalltalk –mer generell än Javas modell alla objekt förberedda går att pluggas till en speciell del (tex en instansvariabel) men också mer komplex (och fördold för den oinvigde) –MVC i botten

previous next 40 Modeller för interaktiva applikationer Lyssnare och adaptorer: implementation I Java är många komponenter, som vi tidigare nämnt, förberedda för att hanteras av speciella lyssnare –I princip går det till på följande sätt en komponent registrerar ett visst objekt som en lyssnare på vissa typer av händelser när en händelse av denna typ inträffar så vidarbefordras den i form av ett förutbestämt (deklarerat i ett Interface) meddelande till lyssnaren lyssnaren i sin tur är vanligen en applikation eller en adaptor som i sin tur kommunicerar med applikationen registrera lyssnare händelser tas omhand av lyssnare lyssnaren beskriver beteende och kommunicerar med applikationen

previous next 41 Modeller för interaktiva applikationer... Centralt är klasserna –Component med subklasser som Button och TextField Definierar metoder som addActionListener –dvs binder en lyssnare –AWTEventMulticaster Hanterar bindning mellan applikation och komponent Skickar förutbestämt meddelande till lyssnare vid given händelse Component AWTEventMulticaster Listener listener *

previous next 42 Modeller för interaktiva applikationer Exempel: definiera egen lyssnarklass import java.util.EventListener; import java.awt.event.ActionEvent; public interface MyActionListener extends EventListener { public void actionPerformed(ActionEvent e); }

previous next 43 Modeller för interaktiva applikationer...( MyComponent ) package GRIP2000F4; import java.util.Vector; import java.util.Enumeration; import java.awt.event.ActionEvent; public class MyComponent { Vector actionListeners = new Vector(); public void addMyActionListener(MyActionListener listener) { if(!actionListeners.contains(listener)) actionListeners.add(listener); } public void removeMyActionListener(MyActionListener listener) { if(actionListeners.contains(listener)) actionListeners.remove(listener); }

previous next 44 Modeller för interaktiva applikationer... public void fireMyAction() { ActionEvent event = new ActionEvent(this, 4711, "My action fired!"); Vector cloneOfListeners = (Vector) actionListeners.clone(); for(Enumeration e = cloneOfListeners.elements(); e.hasMoreElements();) ((MyActionListener) e.nextElement()).actionPerformed(event); }

previous next 45 Modeller för interaktiva applikationer... ( MyListenerTest) package GRIP2000F4; import java.awt.event.ActionEvent; class MyLocalActionListener implements MyActionListener { public void actionPerformed(ActionEvent e) { System.out.println("ActionEvent received: " + e); } public class MyListenerTest { public static void main(String [] args) { MyComponent component = new MyComponent(); component.addMyActionListener(new MyLocalActionListener()); component.addMyActionListener(new MyActionListener() { public void actionPerformed(ActionEvent e) { System.out.println("ActionEvent received in anonymous class: " + e); }}); component.fireMyAction(); }

previous next 46 Modeller för interaktiva applikationer Smalltalk och lyssnare I Smalltalk finns också liknande mekanismer –I ett gränssnitt kan vi deklarera att vi vill få reda på en ändring via en viss kanal subject onChangeSend: #subjectChanged to: self –Samtidigt (kanske) subject onChangeSend: #value to: [myBeeper beep. activationFlag raise]

previous next 47 Modeller för interaktiva applikationer... Vi kan koppla ihop flera adaptorer för att hantera mer avancerat beteende eller komplexa relationer –Två adaptorer ”i serie” | aa | responder := (Smalltalk at:#FileResponder) new asValue. trigger := false asValue. aa := (AspectAdaptor forAspect: #defaultDirectoryName) subjectChannel: responder; subjectSendsUpdates: false. defaultDir := BufferedValueHolder subject: aa triggerChannel: trigger

previous next 48 Modeller för interaktiva applikationer... Med block som första ordningens objekt ”är allt möjligt” –Med PluggableAdaptor (datum till text) self getBlock: [:m | Locale current printAsTime: m policyNamed: #editing] putBlock: [:m :v | v isEmpty ifTrue: [m value: nil] ifFalse: [m value: (Locale current readDateFrom: v readStream)]] updateBlock: [:m :a :p | true]

previous next 49 Modeller för interaktiva applikationer Exempel: RitProgram1 package GRIP2000F4; import javax.swing.*; import java.awt.event.*; import java.awt.*; public class RitProgram1 extends JFrame implements WindowListener, MouseListener, MouseMotionListener { private int last_x, last_y; public RitProgram1(String s) { super(s); this.init(); }

previous next 50 Modeller för interaktiva applikationer... public void init() { // Använd MouseListener och MouseMotionListener // addXXXListener anger att vi ar intresserade av den aktuella typen av händelser. this.addWindowListener(this); this.addMouseListener(this); this.addMouseMotionListener(this); this.setSize(300, 300); } // En metod beskriven i MouseListener. // Anropas då vid tryck på musknapp. public void mousePressed(MouseEvent e) { last_x = e.getX(); last_y = e.getY(); }

previous next 51 Modeller för interaktiva applikationer... // Metoder deklarerade i MouseListener måste implementeras // även om vi inte gör något i dem public void mouseReleased(MouseEvent e) {} public void mouseClicked(MouseEvent e) {} public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {} // och samma sak för metoder från MouseMotionListener. public void mouseMoved(MouseEvent e) {} // En metod beskriven i MouseMotionListener. // Anropas då musen rörs med knapp nertryckt. public void mouseDragged(MouseEvent e) { Graphics g = this.getGraphics(); int x = e.getX(), y = e.getY(); g.drawLine(last_x, last_y, x, y); last_x = x; last_y = y; }

previous next 52 Modeller för interaktiva applikationer... public void windowOpened(WindowEvent e) {} public void windowClosing(WindowEvent e) { System.exit(0); } public void windowClosed(WindowEvent e) {} public void windowIconified(WindowEvent e) {} public void windowDeiconified(WindowEvent e) {} public void windowActivated(WindowEvent e) {} public void windowDeactivated(WindowEvent e) {} public static void main(String args []) { RitProgram1 ritprog = new RitProgram1("Enkelt ritprogram"); ritprog.setVisible(true); }

previous next 53 Modeller för interaktiva applikationer Exempel: RitProgram2 package GRIP2000F4; import javax.swing.*; import java.awt.event.*; import java.awt.*; class MinRityta extends JComponent { protected int last_x, last_y; public MinRityta() { super(); this.init(); }

previous next 54 Modeller för interaktiva applikationer... public void init() { this.addMouseListener(new MouseAdapter () { public void mousePressed(MouseEvent e) { last_x = e.getX(); last_y = e.getY(); } }); this.addMouseMotionListener(new MouseMotionAdapter() { public void mouseDragged(MouseEvent e) { Graphics g = getGraphics(); int x = e.getX(), y = e.getY(); g.drawLine(last_x, last_y, x, y); last_x = x; last_y = y; } }); }

previous next 55 Modeller för interaktiva applikationer... public class RitProgram2 { public static void main(String args []) { JFrame ritprog = new JFrame("Ritprogram 2"); ritprog.getContentPane().add(new MinRityta()); ritprog.addWindowListener(new WindowAdapter () { public void windowClosing(WindowEvent e) { System.exit(0); } }); ritprog.setSize(300, 300); ritprog.setVisible(true); }

previous next 56 Modeller för interaktiva applikationer Exempel: RitProgram3 (dubbelbuffring) package GRIP2000F4; import javax.swing.*; import java.awt.event.*; import java.awt.*; class MinRityta extends JComponent { Image image = null; Graphics imG = null; protected int last_x, last_y; public MinRityta() { super(); this.init(); }

previous next 57 Modeller för interaktiva applikationer... protected Graphics getImGraphics() { if(image == null) { Dimension dim = getSize(); image = createImage(dim.width, dim.height); imG = image.getGraphics(); } return imG; } public void paint(Graphics g) { if(!(image == null)) g.drawImage(image, 0, 0, this); }

previous next 58 Modeller för interaktiva applikationer... public void init() { this.addMouseListener(new MouseAdapter () { public void mousePressed(MouseEvent e) { last_x = e.getX(); last_y = e.getY(); } }); this.addMouseMotionListener(new MouseMotionAdapter() { public void mouseDragged(MouseEvent e) { Graphics g = getImGraphics(); int x = e.getX(), y = e.getY(); g.drawLine(last_x, last_y, x, y); repaint(); last_x = x; last_y = y; } }); }

previous next 59 Modeller för interaktiva applikationer... public class RitProgram3 { public static void main(String args []) { JFrame ritprog = new JFrame("Ritprogram 3"); ritprog.getContentPane().add(new MinRityta()); ritprog.addWindowListener(new WindowAdapter () { public void windowClosing(WindowEvent e) { System.exit(0); } }); ritprog.setSize(300, 300); ritprog.setVisible(true); }

previous next 60 Modeller för interaktiva applikationer Fler exempel i appendix RitProgram4 med effektivare uppdatering RitProgram5 med flera fönster baserat på MVC RitProgram6 som 5 fast alternativt sätt att reagera på stängningshändelser till fönstret RitProgram7 som 6 fast lite olika vyer