GUI-programmering. Gustav Taxén

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

Fönstersystem. Objektorientering och händelsebaserad programmering. Applikation. Interaktionstoolkit. Händelsehanterare och grafiktoolkit

Frameworks. GUI till tusen. GUI till tusen. Sampling architectures. Inmatningstyper

GUI /ll tusen. GUI /ll tusen. Java/Swing. Top Level Containers. General Purpose Containers. GrIP-vt2010-GUI-programmering Cristian Bogdan

Objektorientering i allmänhet

Objektorientering och händelsebaserad programmering. Gustav Taxén

Informationsvisualisering

Model View. View Controller. Model View Controller. Observer. GrIP-vt2010-GUI-programmering Cristian Bogdan

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

Lektion Händelsehanterare

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

Frames, menyer och GUI-program

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

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

Lösningar till tentamen i EDAF25

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

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

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

Lösningar till tentamen i EDAF25

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

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

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

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

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

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

Java-concept och Swing. Swing low, sweet chariot

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

Händelsestyrda program

Distribuerade system. CORBA eller RMI

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

Observer Pattern och MVC. Objekt-orienterad programmering och design Alex Gerdes, 2016

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Uppdragsbeskrivning. Digital Skyltning. Version 1.0 Mats Persson. Distributionslista. Namn Åtgärd Info.

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.

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

Författare: Juha Söderqvist IT-GUI. Version 1.0. Datum

Du ska nu skapa ett litet program som skriver ut Hello World.

Dugga Datastrukturer (DAT036)

Klasser och objekt i C#

Konstruktion av klasser med klasser

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

Objektorienterad Programkonstruktion. Föreläsning 6 23 nov 2015

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

Observer Pattern och MVC. Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018

Objektorientering (OO)

Lite skoj - typ. 5DV085 - Programspråk. Jan Erik Moström, Department of Computing Science, Umeå University - jem@cs.umu.se

Individuellt Mjukvaruutvecklingsprojekt

PROGRAMMERING A VB6 UTVECKLINGSVERKTYGET VISUAL BASIC

Mera om generik. Innehåll. Generik och arv Wildcards Vektorer och generik Generiska metoder. EDA690 (Mera om generik) HT / 24

TENTAMEN: Design och konstruktion av grafiska gränssnitt DAT215

Objektorienterad Programkonstruktion, DD1346 FACIT. Tentamen , kl

Tentamen i Objektorienterad programmering

Klasshierarkier. Klasser kan byggas på redan definierade klasser

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

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

Föreläsnings 10 - Överlagring, Konstruerare, Arv, Mer Exceptions, Reguljära Uttryck

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.

Objektorientering (OO)

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

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

Dagens program. Objektorienterad modellering och diskreta strukturer / design. Model/View/Control-implementering. Model/View/Control-arkitektur

Rekursion: varför? Problem delas upp i mindre bitar algoritm för att lösa problemet erhålls från problemformuleringen

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

Java: Utvecklingsverktyg, datatyper, kontrollstrukturer

Grafiska komponenter.

DOA Konstruktion av gränssnitt 5 april 2004 av Björn Eiderbäck

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

Distribuerade Informationssystem VT-04

Klasshierarkier - repetition

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

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

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

Lösningar för tenta 3 DAT043,

Laboration 3 GUI-programmering

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

Observer Pattern och MVC. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2017

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

Tentamen. 2D4135 vt 2005 Objektorienterad programmering, design och analys med Java Lördagen den 28 maj 2005 kl

Lösningsförslag tentamen FYTA11 Java

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

Hur skapar man formula r

Dagens program. Objektorienterad modellering och diskreta strukturer / design. Model/View/Control-implementering. Model/View/Control-arkitektur

729G04 - Hemuppgift, Diskret matematik

Introduktion. Den objektorienterade modellen Grundläggande begrepp Klass Klassen som abstraktion

Akronymer. CD5130 OOP, fk. Mjukvarumönster. Mjukvarumönster. Mjukvarumönster, forts. Mjukvarumönster, forts

Idag: Dataabstraktion

Programmera en NXT Robot

Tentamen LÖSNINGSFÖRSLAG. c) Tilldelningen C x = new D() ger kompileringsfel eftersom klassen D är abstrakt.

Lösningsförslag till tentamen i EDAF25 Objektorienterad modellering och design Helsingborg

Svenska Du kan med flyt läsa texter som handlar om saker du känner till. Du använder metoder som fungerar. Du kan förstå vad du läser.

Föreläsning 5: Rekursion

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)

Föreläsning 8. Designmönster

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

Manual för BPSD registret. Version 6 /

Efter att du har installerat ExyPlus Office med tillhörande kartpaket börjar du med att göra följande inställningar:

Föreläsning 9: Arv och UML

DAT043 - Föreläsning 7

DUGGA: Objektorienterade applikationer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Transkript:

GUI-programmering Gustav Taxén gustavt@csc.kth.se 2D1640 Grafik och Interaktionsprogrammering VT 2007

Racingspel Vi utökar vårt racingspel lite grann. Vi behöver en bättre modell för hur bilarna ska flyttas. Vi behöver kunna styra (åtminstone) en av bilarna.

Ny Vehicle-klass steering force velocity orientation side

public void update(float dt) { for (int i = 0; i < behaviours.size(); i++) { ((Behaviour)behaviours.get(i)).update(this, dt); } truncate steering to length maxsteering; Point2D.Float acc = steering / mass; velocity += dt * acc; truncate velocity to length maxspeed; position += dt * velocity; } float len = length(velocity); if (len > 0.0f) { orientation = velocity / len; side.x = -orientation.y; side.y = orientation.x; }

public abstract interface Behaviour { public abstract void update(vehicle v, float dt); } public class PursuitBehaviour implements Behaviour { protected Vehicle target; PursuitBehaviour(Vehicle v) { target = v; } } public void update(vehicle v, float dt) { // Steer vehicle towards target Point2D.Float p = v.getposition(); Point2D.Float tp = target.getposition(); Point2D.Float desired_velocity = tp - p; Vehicle.scale(desired_velocity, v.getmaxspeed()); v.updatesteering(desired_velocity); }

Inmatningstyper: : Events Interrupt-subrutin Inenhet Eventkö Dispatcher Systemet placerar förändringar i en kö. Beta av kön vid lämpliga tillfällen llen. Skicka en s.k. event- instans med information om varje förändring till alla callbacks som är "intresserade". Callbacklista Callback

Events i Java Man registrerar Listeners som var ochy en "lyssnar" på en viss typ av event Varje metod i en listener motsvarar något som hänt hos enheten i fråga

Events i Java

Events i Java package MyTests; 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) {} public static void main(string [] args) { MyFrame1 frame = new MyFrame1(); frame.addwindowlistener(frame); frame.setvisible(true); } }

...som inre klass package MyTests; 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) {} } public class MyFrame2 extends Frame { public static void main(string [] args) { Frame frame = new MyFrame2(); frame.addwindowlistener(new MyWindowListener()); frame.setvisible(true); } }

Adaptors Förenklar hanteringen av events Varje adaptor implementerar ett Listener- interface, men alla metoderna är tomma Om man subklassar en adaptor behöver man alltså bara skriva precis den kod som behövs

Adaptors 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.addwindowlistener(new MyWindowAdapter()); frame.setvisible(true); } }

...eller med anonym subklass public class MyFrame4 extends Frame { public static void main(string [] args) { Frame frame = new MyFrame4(); frame.addwindowlistener(new WindowAdapter (){ public void windowclosing(windowevent e) { System.exit(0); } }); } } frame.setvisible(true);

public class PlayerSteeringBehaviour implements Behaviour, KeyListener {... protected boolean steering = false; protected float direction = 1.0f; public void keypressed(keyevent e) { if (e.getkeycode() == 37) { // Cursor left steering = true; direction = -1.0f; } if (e.getkeycode() == 39) { // Cursor right steering = true; direction = 1.0f; } } public void keyreleased(keyevent e) { steering = false; } public void keytyped(keyevent e) {}

... public void update(vehicle v, float dt) { if (steering) { Point2D.Float side = v.getsidevector(); Point2D.Float desired_velocity = new Point2D.Float(side * direction); } } Vehicle.scale(desired_velocity, v.getmaxsteering()); v.updatesteering(desired_velocity); } else { v.updatesteering(v.getvelocity()); }

WIMP Window Icon Menu Pointing device

Lite WIMP-historik http://en.wikipedia.org/wiki/history_of_the_graphical_user_interface Douglas Engelbart, 1968: The Augmentation Of Human Intellect Project.

Lite WIMP-historik http://en.wikipedia.org/wiki/xerox_alto http://www.digibarn.com/collections/ software/alto/index.html Xerox Alto, 1972.

Lite WIMP-historik http://www.thocp.net/ hardware/xerox_star.htm http://en.wikipedia.org/wiki/ History_of_the_graphical_user_interface Xerox Star, 1981.

Lite WIMP-historik http://en.wikipedia.org/ wiki/apple_macintosh http://en.wikipedia.org/wiki/ History_of_the_graphical_user_interface Apple Macintosh, 1984: Desktop-metafor (men bara en applikation åt gången).

Lite WIMP-historik http://www.guidebookgallery.org/screenshots/win101 Microsoft Windows 1.0, 1985: Kooperativ multitasking. Hoppa mellan DOS-program (ett aktivt åt gången).

Lite WIMP-historik http://www.guidebookgallery.org/screenshots/win203 Microsoft Windows 2.0, 1987: Köra mer än ett DOS-program parallellt.

Lite WIMP-historik http://www.guidebookgallery.org/screenshots/win30 Microsoft Windows 3.0, 1990: Bättre minneshantering.

Lite WIMP-historik http://en.wikipedia.org/wiki/history_of_microsoft_windows Microsoft Windows 3.1, 1992: TrueType-teckensnitt, mindre revideringar av gränssnittet, TCP/IP.

Lite WIMP-historik http://www.guidebookgallery.org/screenshots/winnt31 Microsoft Windows NT, 1992 (Beta): Helt ny kärna, multitasking, skyddat minne, driverproblem.

Lite WIMP-historik http://en.wikipedia.org/wiki/history_of_microsoft_windows Microsoft Windows 95, 1995: "Gömde" MS-DOS (så att inte konkurrerande varianter kunde användas).

Lite WIMP-historik http://en.wikipedia.org/wiki/history_of_microsoft_windows Microsoft Windows 2000, 2000: Uppgradering av NT med användargränssnitt från 95/98.

Lite WIMP-historik http://en.wikipedia.org/wiki/history_of_microsoft_windows Microsoft Windows XP, 2001: Integration av 95/98/ME och kärnan från NT/2000.

Lite WIMP-historik http://archer.oregontel.com/brandon/vista/5219/3d.png Microsoft Windows Vista, 2007: Bygger på Windows XP. Första operativsystemet som kräver 3D-grafikkort.

Några andra WIMP-system GEM Desktop (PC, Atari, m.fl.),.), 1984. X Window System (Unix), mitten av 80-talet. DESQview (PC), 1985. Workbench (Commodore Amiga), 1985. GEOS (PC, Commodore 64/128), 1986. OS/2 (PC), 1988. NeXTstep (NeXT, PC), 1989. MacOS 5-9,, 1988-1999. 1999. BeOS (BeBox,, PC), 1991. MacOS X,, 1999.

Bortom WIMP http://www.kidpad.org/

Bortom WIMP http://www.nada.kth.se/cvap/gvmdi/

Bortom WIMP http://www.pdc.kth.se/projects/vr-cube/

Bortom WIMP http://www.activewin.com/reviews/software/apps/dragon/

Bortom WIMP http://www.hasbro.com/furby/

Bortom WIMP http://www.gamershell.com/pc/warcraft_2/screenshots.html?id=4

Bortom WIMP http://www.gamershell.com/pc/rise_of_nations/screenshots.html?id=52

Bortom WIMP The Sims 2, http://www.thesims.com/

Bortom WIMP http://www.gamershell.com/pc/the_sims_2/screenshots.html?id=150

Bortom WIMP http://www.mobygames.com/game/dos/secret-of-monkey-island/ screenshots/gameshotid,3164/

Bortom WIMP http://www.neoseeker.com/articles/games/reviews/escapemonkeyisland/3.html

Bortom WIMP http://www.gamershell.com/pc/half_life_2/screenshots.html?id=152

Bortom WIMP http://www.gamershell.com/pc/doom_3/screenshots.html?id=124

Bortom WIMP http://media.xbox360.ign.com/media/736/736204/img_2790262.html

Bortom WIMP http://www.gamershell.com/xbox360/fight_night_round_3/screenshots.html?id=95

Bortom WIMP http://ps2.gamezone.com/gamesell/screens/s22349.htm

Bortom WIMP http://www.1up.com/do/newsstory?cid=3143782

Avancerade gränssnitt Om man bygger mer avancerade program behövs ett bättre sätt att hantera användargr ndargränssnittetnssnittet De flesta system bygger på ett designmönster nster som heter Model-View View- Controller (eller bara Model-View View)

Designmönster nster (design patterns) Utgår från arkitekten Christopher Alexanders arbete på 70- talet Alexander försökte se mönster i hur man löst återkommande problem inom arkitektur och skrev en bok där han beskriver lösningarna Alexander, C. (1977). A Pattern Language.. Oxford University Press Idén togs upp på allvar inom systemdesign i mitten av 90- talet Den mest kända boken är Gamma et al. (1995). Design Patterns: Elements of Reusable Object-Oriented Oriented Software.. Addison-Wesley

Design patterns Namn och generell typ Intent (vad( den gör) Also Known As Motivation Applicability Structure (ett( UML-diagram)

Design patterns Participants (beskr( beskr. av klasser som ingår) Collaborations (hur( klasserna arbetar tillsammans) Consequences (av( att använda nda mönstret) Implementation Sample code Known uses Related patterns

Model View Controller En design pattern för användargr ndargränssnitt. Utvecklades under sent 70-tal, bl.a. för NeXT-datorn datorn. Exempel: Flygsimulator Model - simuleringsrutiner,, etc. Controller - joystick kopplad till datorn View - vy genom cockpitfönstret

Model View Controller Model Simulering etc. Ändra roder Controller Joystick med knappar Hämta data Modifiera vyn 3D-vy View Om gränssnitten mellan de tre komponenterna inte ändras kan vilken som helst av dem bytas ut!

Observer För att implementera MVC används nds ofta designmönstret nstret Observer Tillåter att ett objekt meddelas om det gjorts en förändring i ett annat objekt, utan att objekten görs starkt knutna till varandra

Observer

Observer

Observer i Java package java.util; public interface Observer { void update(observable o, Object arg); } public class Observable { private Observer[] arr; } public void addobserver(observer o) { arr.addelement(o); } public void notify(object arg) { for (int i = 0; i < arr.size; i++) { arr[i].update(this, arg); } } Det här är inte hela sanningen, men principen är densamma i den riktiga javaimplementationen!

Problem med MVC Det kan vara svårt att separera kontroller och vy i moderna grafiksystem Men det lönar sig i princip alltid att separera datamodellen från gränssnittet

Java/Swing Gränssnitt i Java (och( de flesta andra GUI-system) är hierarkiska. Man börjar med en s.k. Top Level Container, och lägger till komponenter i den. Vissa komponenter är också containers och kan innehålla andra komponenter. Man specificerar dimensioner och position för varje komponent explicit eller via s.k. Layout Managers.

Separable Model Architecture Varje komponent hanterar view/control. Själva utritningen är delegerad till ett s.k. UI object (för( att man ska kunna ändra look- and-feel, t.ex.)..). Varje komponent har en modell kopplad till sig.

Separable Model Architecture De flesta komponenters modell har enbart att göra med själva gränssnittet (t.ex. om en checkbutton är nedtryckt eller ej). Vissa komponenters innehåll kan dock bara definieras av applikationen (t.ex. innehållet i en lista). Några faller mitt emellan (t.ex.. sliders). Man ersätter en modell genom att subklassa defaultmodellen och sedan anropa setmodel() på komponenten.

Containers, Controls och Displays Top Level Containers: : Applet, Dialog, Frame. General-Purpose Containers: : Panel, Scroll Pane, Split Pane, Tabbed Pane, Tool Bar. Special-Purpose Containers: : Internal frame, Layered Pane, Root Pane. Basic Controls: : Buttons, Lists, Menus, etc. Uneditable Info Displays: : Label, Progress Bar, Tool Tip. Interactive Displays of Highly Formatted Information: : File Chooser, Color Chooser, etc.

Top Level Containers Varje komponent kan bara befinna sig på en plats i hierarkin. Varje Top Level Component har en Content Pane som innehåller hierarkin. Man kan lägga till en menu bar (menyrad) ovanför sin content pane.

Layout Managers Det är oftast en nackdel att specificera position och dimension för komponenter explicit. Om användaren ndaren t.ex. ändrar fönstrets storlek kommer inte storleken på komponenterna att hänga med. Layout managers hjälper en att räkna ut positioner och dimensioner dynamiskt! Man kan skapa egna layout managers.

Händelsehantering public class Beeper... implements ActionListener {...... // where initialization occurs: // create the button first, then: button.addactionlistener(this); } public void actionperformed(actionevent e) { // Make a beep sound... }

GUI-byggare Ofta integrerade med en IDE,, Integrated Development Environment GUI:er består oftast av widgets, samt kod som skickar meddelanden mellan dessa GUI-byggare byggare: : "rita" rita" gränssnittet nssnittet, kod som skapar widgets och deras layout genereras automatiskt! Sedan lägger man till händelselyssnare etc. själv lv, ofta via någon form av property inspector.

Några GUI-byggare byggare: Visual Studio.NET Forms Designer, www.microsoft.com Borland C++ Builder, www.borland.com QT Designer, www.trolltech.com NetBeans, www.netbeans.org Olika plug-ins för Eclipse, www.eclipse.org Men det finns många, många fler!

Java-labben