F7: Användargränssnitt, interaktivitet och grafik. Carl Nettelblad

Relevanta dokument
F6: Debriefing OU2, OU3 Hashtabeller, användargränssnitt, interaktivitet och grafik. Carl Nettelblad

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

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

Obligatorisk uppgift 5

F7: Rekursiv till iterativ, sammanfattning, genomgång av omtentan Carl Nettelblad

Frivillig Java-swing-Graphics-lab Programmeringsteknik MN1 vt02

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

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

Obligatorisk uppgift: Symbolisk kalkylator

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

Obligatorisk uppgift 5: Symbolisk kalkylator

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

Klassen BST som definierar binära sökträd med tal som nycklar och enda data. Varje nyckel är unik dvs förekommer endast en

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 3

Lägg uppgifterna i ordning. Skriv uppgiftsnummer och din kod överst i högra hörnet på alla papper.

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

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

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

Mer om grafiska komponenter. Händelsestyrda program

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

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 3

Lab5 för prgmedcl04 Grafik

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

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

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

Lektion Händelsehanterare

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

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

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

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

Laboration 4: Game of Life

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

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

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

Obligatorisk uppgift 5: Symbolisk kalkylator

public boolean containskey(string key) { return search(key, head)!= null; }

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

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

Laboration 15 Grafiskt användargränssnitt

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

Exempel på användning av arv: Geometriska figurer

Lösningsförslag till tentamen

Java-concept och Swing. Swing low, sweet chariot

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

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

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

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.

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

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

Tentamen i Objektorienterad programmering

DAT043 - Föreläsning 7

ID1004 Laboration 3, 5-6 November 2012

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Checklista. Föreläsning 1-2 Innehåll. Programmering.

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

Lösningar till tentamen i EDAF25

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

Rita Egna Bilder, Timer

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

Klasshierarkier - repetition

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

Föreläsning 5-6 Innehåll

Lösningsförslag till tentamen

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

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

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

Linjärt minne. Sammanhängande minne är ej flexibelt. Effektivt

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

List.java. List.java. Printed by Tom Smedsaas

Lösningsförslag till tentamen

Observera. Tentamen Programmeringsteknik II Skrivtid:

Dagens föreläsning. Arrayer och klasser. Medan ni väntar: Gå till m.voto.se/prog11 och svara på några gamla tentamensfrågor! (26 januari 2018 F3 1 )

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

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

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

TENTAMEN PROGRAMMERING I JAVA, 5P SOMMARUNIVERSITETET

if (n==null) { return null; } else { return new Node(n.data, copy(n.next));

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

OOP Objekt-orienterad programmering

OOP Objekt-orienterad programmering

Lösningar till tentamen i EDAF25

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

kl Tentaupplägg

Tentamen Programmeringsteknik II Inledning. Anmälningskod:

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

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

Lösningsförslag till tentamen

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

Objektorienterad programmering med Java Swing. Programexempel. Swing och AWT AWT. = Abstract windowing toolkit

Grafik, grafiska användargränssnitt och rörliga bilder

Tentamen Programmeringsteknik II Skrivtid: Hjälpmedel: Java-bok (vilken som helst) Skriv läsligt! Använd inte rödpenna!

Laboration 24 Databasen MySQL och java

Lägg uppgifterna i ordning. Skriv uppgiftsnummer och din anmälningskod överst i högra hörnet på alla papper.

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

Föreläsning 1, vecka 8: Att förbereda sig för tentan

Inlämningsuppgift 1 Programmeringsteknik MN1 vt02

Transkript:

F7: Användargränssnitt, interaktivitet och grafik Carl Nettelblad 2017-05-08

I dag OU3 Händelsestyrd programmering Användargränssnitt Grafik OU4, OU5

Iterera i ett träd Träd passar väldigt bra för rekursion Vi kan vilja gå igenom ett träd iterativt Kanske för att det är del av en större rekursion samecontents ett exempel

Stack Rekursion bygger på en stack Anropsstacken Variabelvärden och var i metoden vi står lagras automatiskt i Java Push metodanrop Pop metod returnerar Kasta undantag kan leda till flera pop i följd Anropsstacken visas i felutskriften Men aldrig börja titta mitt i stacken

Göra rekursiv algoritm iterativ Skriv egen kod för stacken Styr när vi gör push och pop Kan behöva lagra både parametrar och tillstånd I vårt fall Node och int 0 vänster delträd, 1 höger delträd Antag att vi har en klass TraversalStack med metoder push, pop, getnode, getstate, isempty

Tankegång Vi väljer att gå igenom trädet in-order Upplägg: Se om det finns ett Node-objekt på stacken Läs av nod och lägestal Poppa Om status är 0 Lägg tillbaka samma nod med status 1 Lägg in vänster delträd med status 0 Om status är 1 Utför operationen för nyckeln Lägg in höger delträd med status 0

Pseudokod void traverse(node start) { Stack s = new Stack(); s.push(start, 0); while (!s.isempty()) { Node now = s.getnode(); int state = s.getstate(); s.pop(); if (now == null) continue;

Pseudokod switch (state) { case 0: // First visit to node s.push(node, 1); s.push(node.getleft(), 0); case 1: // Second visit to node System.out.println(node.getKey()); s.push(node.getright(), 0); default: throw new RuntimeException("Invalid state."); } } }

Kommentar Nullkontroll när vi läser från stacken Lite ineffektivt Annars hade vi behövt kontrollera null på tre ställen För noden själv i början För vänster delträd i state 0 För höger delträd i state 1 Objektet som ska besökas sist läggs på stacken först Störst nytta med en sådan här lösning om arbetet i state 1 vore mer komplext

Sen då? Hur skriver vi om den här till preorder? Postorder? Kan vi stryka state lätt i något fall? Bara Node-objekt på stacken Kan vilja skriva om som metod som ger nästa Node

Pseudokod Node getnodeinorder(stack s) { while (!s.isempty()) { Node now = s.getnode(); int state = s.getstate(); s.pop(); if (now == null) continue;

switch (state) { case 0: // First visit to node s.push(node, 1); s.push(node.getleft(), 0); case 1: // Second visit to node s.push(node.getright(), 0); return node; default: throw new RuntimeException( ); } } return null; } Pseudokod

Händelsestyrd programmering Hur fungerar den numeriska kalkylatorn? En slinga som läser kommandon Anropar metoder för att hantera kommandon Varje kommando hanteras fort Utför arbete, kommer tillbaka till huvudslingan Motsats Ett program som ställer upprepade frågor till användaren i samma metod Ett menysystem där varje meny är en egen metod som ber användaren välja alternativ

Händelsestyrda program Många datorprogram är händelsestyrda på det här viset Definition: Händelsestyrd programmering är ett paradigm där programmets flöde bestäms av händelser som användarhandlingar (musklick, knapptryck), sensorutmatning eller meddelanden från andra program/trådar. Händelsestyrd programmering är det dominerande paradigmet i program med grafiska användargränssnitt och andra tillämpningar. (Omskrivet och översatt från https://en.wikipedia.org/wiki/event-driven_programming )

Struktur Vänta på händelse (Börja) hantera händelse Bör gå fort, annars kan senare händelser inte hanteras Komponenten som väntar på händelser generell Färdig i det bibliotek man använder Eller egen men sällan i behov att ändras Händelseslinga/ event loop Kan startas genom ett metodanrop eller indirekt i en konstruktor

Grafiska användargränssnitt Jämfört med kalkylatorn är mängder av händelser möjliga i ett grafiskt program, som: Ändra storlek på fönster Flytta på fönster Animera gränssnittet för att visa vad som är markerat och De riktiga funktionerna hos programmet

Vårt första program import javax.swing.*; import java.awt.*; import java.awt.event.*; public class WindowApp1 extends JFrame { public WindowApp1() { super("an event driven program"); setresizable(false); getcontentpane().setpreferredsize(new Dimension(400, 400)); setdefaultcloseoperation(jframe.dispose_on_close); pack(); setvisible(true); } } public static void main(string[] args) { WindowApp1 app = new WindowApp1(); }

Vad gör koden? Vi ärver från JFrame Representerar ett fönster Konstruktorn gör anpassningar Fönstrets titel Storlek och att den inte får ändras Vad som händer när fönstret stängs Men ingen metod för det Vi tar inte själva hand om den händelsen Att fönstret ska visas Obs! Glöm inte denna!

Händelsedrivet Vår main gör ingenting Skapar bara ett objekt Programmet gör inte heller någonting Mäta processoranvändning Men vi har ingen kod för att hantera händelser Lägg till en knapp!

Fyra steg Markera att vi kan lyssna på händelser Lägg till knappen Säg att vi vill lyssna på knappens händelser Implementera knappmetoden

Lyssna på händelser public class WindowApp2 extends JFrame implements ActionListener { public WindowApp2() { ActionListener är ett interface som ingår Javaramverket för grafiska gränssnitt (awt/swing) En enda metod actionperformed Anropas för alla händelser vi väljer att lyssna på

Lägg till knappen och registrera lyssnare setdefaultcloseoperation(jframe.dispose_on_close); JPanel panel = new JPanel(); getcontentpane().add(panel); JButton button = new JButton("Whatever you do, do not push this button!"); panel.add(button); button.addactionlistener(this); pack(); Knappen ligger i en panel Det räcker inte med att skapa knappen Knappen vet inte att den ska ligga i panelen i fönstret Eller vart den ska skicka sina händelser

Implementera metoden public void actionperformed(actionevent e) { JOptionPane.showMessageDialog(null, "I told you not to push the button...", "Event captured", JOptionPane.INFORMATION_MESSAGE); } Det här är vår lyssningsmetod. Enkelt i det här fallet, bara en möjlig händelse (som vi vet om). Alltid klokt att kontrollera att det är rätt sorts händelse om flera är möjliga. Jämför functionhelper i OU2, olämpligt att ha ett sistafall på en kedja med if-else som antar att tillståndet är giltigt.

Lyssnare/händelsehanterare Lyssnaren är ett objekt som informeras om vissa händelser efter att ha registrerat sig. Ett vanligt designmönster Frikoppling mellan källan till händelsen och mottagaren. ActionListener med metoden actionperformed bara ett exempel på mönstret.

Lyssnare och källor Samma källa kan ha flera lyssnare Samma lyssnare kan ha flera källor När metoden anropas måste det framgå Varifrån händelsen kommer Vilken händelse det är Annan information

Hitta källan public void actionperformed(actionevent e) { if (e.getsource() == obj1) { // Åtgärd för objekt 1 } else if (e.getsource() == obj2) { // Åtgärd för objekt 2 } else { // throw new RuntimeException här??? } }

Timers Hur gör vi om något ska hända hela tiden Ett sätt while-loop Kanske med anrop Thread.sleep Pausar i ett antal ms Stör händelseflödet Händelseinriktat sätt Be om att få timerhändelser!

Exempel på timer timer = new Timer(5000, this); timer.start(); Skickar händelser till objektet Spara Timer-objektet i en instansvariabel

Om grafiska gränssnitt Fällor Förvirrande layout Lång tid i händelsehanterare Kom ihåg, programmet svarar inte medan händelsen hanteras Användargränssnittskod som även sköter logiken Model view controller Försöka skilja på klasser som beskriver världen, klasser som beskriver användargränssnittet och klasser som utför åtgärder

Layout i Swing Man vill inte tala om exakta koordinater för varje del i gränssnittet I stället användas layoutklasser, två exempel: FlowLayout visa komponenterna i den ordning de läggs till GridLayout visa komponenterna i ett fast rutnät

Layout GridLayout FlowLayout

Välja layout På befintligt objekt (som hela contentpane): Container contentpane = getcontentpane(); contentpane.setlayout(new FlowLayout()); På en ny panel JPanel panel = new JPanel(new GridLayout(2, 2));

Grafik på datorer Vad finns på skärmen? Skärmen minns inte Bilden ritas om många gånger per sekund Ett minne i datorn lagrar skärmbilden Som en stor array Men vad händer om man vill ändra något?

Kvadraten och cirkeln Vi vill att cirkeln ska röra sig över kvadraten

Hur? Tänk två metoder drawcircle(x,y) drawsquare(x,y) Vi vill flytta på cirkeln Många drawcircle?

Kvadraten och cirkeln Vi ritar en massa cirklar Men de gamla cirklarna vi ritade finns kvar För att få cirkeln att röra sig måste vi städa upp Rita vitt Rita ut kvadraten igen

Alternativet Representera grafik som objekt Objektens jobb att rita upp sig Jämför paddorna i Programmeringsteknik I

Två paradigm Omedelbart läge (immediate mode) Kommandon om vad som skall ritas, när det skall ritas Behöver svara på händelse när något behöver ritas upp på nytt Delegerat läge (retained mode) Berätta hur världen ser ut Paddor, paneler i Swing, objekt i en spelvärld Någon annan ser till att det hålls uppritat

Koordinatsystem för grafik Matematik Datorgrafik X Y Y X (Ofta) Kanske ett arv från koordinater för text, rad och kolumn Övre vänstra hörnet (0,0)

Koordinatsystem för grafik De mest naturliga koordinaterna för datorn är pixlar Heltal Ganska trubbigt, avrundningsfel En del system har olika typer av stöd för subpixelrendering /anti-alias

Grafik i kod Det finns olika ramverk för grafik OpenGL, Direct3D, GDI, Canvas, Vi fortsätter använda Java Swing Vi utökar JPanel i en egen klass Ersätter metoden paintcomponent Den ritar upp innehållet när det behövs Om vi gör någon ändring får vi be den rita upp igen manuellt (metod repaint)

Exempelklass public class GraphicsExample extends JPanel { public GraphicsExample() { super(); super.setpreferredsize( new Dimension(400, 400)); super.setbackground(color.white); } @Override public void paintcomponent(graphics g) { super.paintcomponent(g); //void setcolor(color color) g.setcolor(color.red);

Exempelklass //void fillrect( // int x, int y, // int width, int height) g.fillrect(100, 100, 200, 200); g.setcolor(color.black); //void filloval( // int x, int y, // int width, int height) g.filloval(100, 100, 200, 200); //void drawline( // int x1, int y1, int x2, int y2) g.drawline(0, 0, 100, 100); } }

Resultat

Immediate mode i Swing Uppritning sker mot ett Graphics-objekt Ofta som var på uppritningshändelse Finns också Graphics2D-objekt Titta i koden för paddorna från färska omgångar av Programmeringsteknik I Kommandonas ordning spelar stor roll Sist ritat är det som syns Färginställning med setcolor gäller tills man byter Kan vara svårt att felsöka i debugger Ett halvt uppritat fönster ser inte alltid ut som man tänker sig

Sammanfattning, klass för klass JFrame fönster, som ofta också kan implementera ActionListener, lägger till fler delar i fönstret i konstruktorn JPanel allmän yta, ersätt metoden PaintComponent i subklass om man vill rita grafik JLabel statisk etikett (text) JTextField textfält för inmatning JButton klickbar knapp GridLayout strukturera komponenter i rutnät FlowLayout strukturera komponenter i följd Timer källa för timerhändelser

OU4 Studsande bollar Skapa först ett fönster och en egen JPanel (med arv). Testa att rita en enda boll. Skapa en egen bollklass som kan flytta på sig, kollidera med kanter, rita upp sig själv. Skapa flera bollar och låt dem vandra med en timer. Lägg till kollisionshantering. Skapa ett separat användargränssnitt för att styra programmet.

OU5 Vi gjorde en numerisk kalkylator Tolkade (parsade) och utvärderade uttrycken genom samma rekursiva anrop Returnerade double, uppdaterade variabeldefinitioner i assignment Nu ska vi i stället tolka uttrycken Tolkade uttryck kan sedan utvärderas senare Ger möjlighet till symbolhantering Används i uppgiften för derivering och kvotering (aktivt skjuta upp utvärdering)

Exempel Input : 2*(-3-1+6)/0.5 + 0.5 Result: 8.5 Input : log(exp(ans)) Result: 8.5 Input : "(exp(2*x) + x) = y Result: exp(2.0*x)+x Input : y Result: exp(2.0*x)+x Input : ans Result: exp(2.0*x)+x Input : "y Result: y

Kvotering I exemplet ovan blev värdet för variabeln y ett uttryck, inte ett tal Markeras med citationstecken " Allt som inte kvoteras utvärderas direkt

Derivering Deriveringsoperator med ' Vänsterled som ska deriveras, med avseende på variabeln i högerled Felhantering: Vad händer om högerledet inte är en variabel? Ändrar inte på regeln icke-kvoterade uttryck utvärderas direkt så Input : exp(x*x+1)'x Result: 0.0 Input : "exp(x*x +1)'x Result: 2.0*x*exp(x*x+1.0)

Evalueringsoperatorn Om " används för att kvotera, skjuta upp utvärdering Så har vi &, evalueringsoperatorn, för att framtvinga evaluering Input : "(x*x+a*x) = y Result: x*x+a*x Input : 2 = a Result: 2.0 Input : 3 = x Result: 3.0 Input : y Result: x*x+a*x Input : &y Result: 15.0

Syntaxdiagram Väldigt snarlika den numeriska kalkylatorn Derivering införd i factor Unär operator (kvotering/evaluering förutom unärt minus) i primary

Trädrepresentation I stället för att returnera double ska våra parsingmetoder returnera instanser av Sexpr (symbolic expressions) Sexpr är en abstrakt basklass

Trädrepresentation Varje del av ett uttryck måste representeras som en Sexpr eller ett träd av flera Sexpr Exempel: 3 + 5 blir två konstanter som är vänster och höger delträd till en additionsoperationer Parenteser har inga egna klasser, de styr bara trädstrukturen

Klasshierarki Tre huvudtyper av Sexpr Atom löv i trädet, konstanter och tal Unary har ett underträd, unära operatorer och funktioner Binary vänster och höger delträd för vanliga binära operatorer (+ - * / = ')

Utgångspunkt Utgå från kodskelett för uppgiften Alla dotterklasser finns nämnda i PDF-filen för uppgiften Utnyttja arv Många av lövklasserna blir rätt korta när basklasserna är rätt gjorda och hjälpklassen Symbolic Varje klass har en metod eval för evaluering och en metod diff för derivering Symbolic gör jobbet

Exempel: sinus I Sin: public Sexpr eval(map<string,sexpr> map){ return Symbolic.sin(operand.eval(map)); } public Sexpr diff(sexpr x){ return Symbolic.mul(operand.diff(x), new Cos(operand)); } I Symbolic: public static Sexpr sin(sexpr arg){ if (arg.isconstant()) return new Constant(Math.sin(arg.getValue())); else return new Sin(arg); } Mönster: Räkna ut direkt OM det är en konstant, skapa annars bara symbolisk representation.

Förenkling och parenteser Evaluering av x + x om x har ett värde bör bli ett tal, inte ett uttryck Evaluering av "(x * x)'x bör bli 2.0*x Nödvändigt att förenkla uttryck Ett träd för (a + b) * c får inte komma att representeras som a + b * c Nödvändigt att sätta in parenteser på rätt ställen Hellre för många än för få

Tänk på Undvik duplicering av kod Följ kodstandard Läslighet, dokumentation Parsern ska alltid bara parsa Hantera syntaxfel, skapa trädet Evaluering ska vara generell Anropa basklassernas metoder, inte instanceof, inte typomvandlingar Titta gärna igen på exemplen här och i uppgiften på kvotering, evaluering och derivering Lätt att missa vad de faktiskt ska innebära