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

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

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

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

GUI-programmering. Gustav Taxén

Objektorientering i allmänhet

Objektorientering och händelsebaserad programmering. Gustav Taxén

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

Lektion Händelsehanterare

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

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

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

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

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

Informationsvisualisering

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

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

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

Lösningar till tentamen i EDAF25

Frames, menyer och GUI-program

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

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

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

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

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

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

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

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

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

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

Java-concept och Swing. Swing low, sweet chariot

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

Lösningar till tentamen i EDAF25

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

Laboration 3 GUI-programmering

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

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

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

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

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

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

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

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

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

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

Java: Utvecklingsverktyg, datatyper, kontrollstrukturer

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

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

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 11 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Händelsestyrda program

Design och konstruktion av grafiska gränssnitt

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.

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

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

Lösningar för tenta 3 DAT043,

Grafiska komponenter.

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.

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

Konstruktion av klasser med klasser

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

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

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

Objektorienterad Programkonstruktion. Föreläsning jan 2016

Grafiska användargränssnitt i Java

Tentamen Programmering fortsättningskurs DIT950

Tentamen. DD2385 Programutvecklingsteknik vt 2013 Onsdagen den 22 maj 2013 kl Hjälpmedel: penna, suddgummi, linjal

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

Grafiska användargränssnitt i Java

Lösningsförslag tentamen FYTA11 Java

FÖRSLAG TILL LÖSNINGAR FÖR TENTAMEN I INTERNETPROGRAMMERING MED JAVA, 5p för SY , kl

OOMPA 2D1359 Föreläsning 3

TENTAMEN. Kurs: Applikationsutveckling i Java 5DV135. Ansvarig lärare: Johan Eliasson. HT12 Datum: Tid: kl

Model View Controller. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Tentamen. 2D4135 vt 2004 Objektorienterad programmering, design och analys med Java Torsdagen den 3 juni 2004 kl

DAT043 - Föreläsning 7

Laboration 15 Grafiskt användargränssnitt

Objektorientering. Objekt och metoder. Objektorientering. Viktiga begrepp. Klass. Objekt. Deklarativ programmering

5 Användargränssnitt. 5.1 AWT och Swing

DAT043 - föreläsning 8

Laboration 24 Databasen MySQL och java

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

Tentamen. DD2385 Programutvecklingsteknik vt 2014 Måndagen den 2 juni 2014 kl Hjälpmedel: penna, suddgummi, linjal

Designmönster, introduktion. Vad är det? Varför skall man använda mönster?

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

Lösningsförslag till tentamen

Klasshierarkier. Klasser kan byggas på redan definierade klasser

Objektorienterad programmering E. Telefonboken, än en gång. Gränssnitt. Telefonboken med gränssnitt specificerat, del 1.

Objektorienterad Programkonstruktion, DD1346. Tentamen , kl

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

Mer om grafiska komponenter. Händelsestyrda program

Tentamen i Objektorienterad modellering och diskreta strukturer

Grafiska användargränssnitt i Java

DD2385 Programutvecklingsteknik Några bilder till föreläsning 1 24/ Kursöversikt Javarepetition/Javaintroduktion

Lycka till! TENTAMEN: Objektorienterade applikationer. Läs detta! 1 (6) Tentamen

OOP Objekt-orienterad programmering

Designmönster/Design patterns

Övning 5. TDA550 - Objektorienterad programvaruutveckling, fk

Windows Forms Winstrand Development

Projekt 2 XL. Observer-mönstret

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 3

Design Patterns. En kort introduktion

Transkript:

GUI-programmering Gustav Taxén gustavt@csc.kth.se Martin Berglund mabe02@kth.se DH2640 Grafik och Interaktionsprogrammering VT 2008

WIMP Window Icon Menu Pointing device

Modernt Gränssnitt Vad ingår i ett gränssnitt? Vad förväntar vi oss av gränssnittet? Bra respektive dåliga gränssnitt? Komponenter? och sen då?

Modernt Gränssnitt?

GUI till tusen Win32-API (C) MFC (C++) VCL/CLX (C++/Delphi Delphi) wxwidgets (C++) Qt (C++/Java) GTK+ (C).NET Framework (VB/C++/C#) Java AWT/Swing/SWT (Java) osv

GUI till tusen Vi ska titta på Java Swing Mycket gemensamt med andra GUI-system, ibland under andra namn Bra uppsättning komponenter Platformsoberoende Bra designat enligt designmönster Gratis utvecklingsmiljö (NetBeans( NetBeans) ) och mycket dokumentation från Sun

GUI-teori Nu tittar vi på bakomliggande GUI-teorier Händelseloop i C Objekt-orientering i C++/Delphi Event-baserat i Java/C# Vad är bäst? Kan jag välja?

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

Events i Java Man registrerar Listeners som var och 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) {

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

Designmö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 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 mönstret) Implementation Sample code Known uses Related patterns

Model View Controller En design pattern för användargränssnitt. Utvecklades under sent 70-tal för Smalltalk på Xerox-maskiner 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 ofta designmö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.

General Purpose Containers

Special Purpose Containers

Basic Controls

Uneditable Info Displays

Formatted Info Displays

Kan vi göra något åt utseendet? Ja, det kan vi! Swing kan få native look & feel om vi lägger till några rader kod // Get the native look and feel class name String nativelf = UIManager.getSystemLookAndFeelClassName(); // Install the look and feel try { UIManager.setLookAndFeel(nativeLF); catch(exception e) {

Layout Managers Det är oftast en nackdel att specificera position och dimension för komponenter explicit. Om anvä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, kod som skapar widgets och deras layout genereras automatiskt! Sedan lägger man till händelselyssnare etc. sjä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!

Senaste NetBeans 6.0

Java-labben

Live-demo av NetBeans 6.0