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

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

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

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

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

Laboration 4: Game of Life

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

Java-concept och Swing. Swing low, sweet chariot

Mer om grafiska komponenter. Händelsestyrda program

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

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

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

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

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

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

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

Laboration 15 Grafiskt användargränssnitt

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

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

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

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

Swing. MER Java Foundation Classes (JFC) Vad är farorna. Hur lära sig? 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

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

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

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

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

Lektion Händelsehanterare

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

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 3

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 3

Lab5 för prgmedcl04 Grafik

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

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

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

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

Frivillig Java-swing-Graphics-lab Programmeringsteknik MN1 vt02

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

OOP Objekt-orienterad programmering

Rita Egna Bilder, Timer

OOP Objekt-orienterad programmering

Tentamen i Objektorienterad programmering

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

Lösningar för tenta 3 DAT043,

För att hitta filen gå till mappen NetBeansProjects. Välj undermappen med rätt projekt, och sedan undermapp dist. Där ligger.jar-filen.

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

Parallellism, återblick

ID1004 Laboration 3, 5-6 November 2012

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

Projekt 2 XL. Observer-mönstret

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

LYCKA TILL!!! TENTAMEN I Programmeringsteknik F1. Var vänlig och läs detta: CTH TIN 211. DATAVETENSKAP Göteborg ( ) TENTAMEN

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

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

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

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

Tentamen i Objektorienterad programmering

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

725G61 - Laboration 8 Ett enkelt GUI. Sahand Sadjadee och Johan Falkenjack

Laboration 24 Databasen MySQL och java

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

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

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

Lösningsförslag till tentamen

Tentamen FYTA11 Javaprogrammering

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

ITK:P1 Föreläsning 8. Verktyget Javadoc. Kommentarer för Javadoc. Multimedia för spelkonstruktion

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

Grafiska komponenter.

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

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

Exempel på spelprogrammering i java.

Arv och Grafiska Användargränssnitt

kl

Lösningsförslag till tentamen

Arv, Grafiska användaregränssnitt och Inre klasser! Förelasning 12!! TDA540 Objektorienterad Programmering!

Lösningsförslag till tentamen

Föreläsning 15: Repetition DVGA02

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

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

Lösningar till tentamen i EDAF25

Tentamen i Objektorienterad programmering E

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

SMD091 Lektion 9. Definition. Inkapsling. Lite repetition. Grafik. Gränssnitt Definition och Implementation. Sammansättning... Implementation.

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

Laboration 3 GUI-programmering

Lösningsförslag till tentamen

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

Lösningsförslag till tentamen

Lösningsförslag till tentamen

DEL 1 För att få godkänt på tentan (betyg 3) måste du lösa minst fem av sju uppgifter i denna del.

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

Klasser som datastrukturer

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

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

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.

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

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

Grafiska användargränssnitt i Java

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

Transkript:

Föreläsnings 11 - GUI, Händelsestyrda program, MVC Josef Svenningsson Tisdag 20/11

Boken Denna föreläsning går igenom följande sektioner i boken: 10.1 och 10.2 11.1 Notera att kapitel 11 inte finns i boken utan måste laddas ned från nätet.

Skapa fönster Den mest basala funktionen när man vill skriva grafiska gränssnitt är att visa ett fönster. För detta används klassen JFrame. För att skapa ett fönster behöver man gå igenom följande fem steg: 1. Konstruera ett objekt av typ JFrame. JFrame frame = new JFrame(); 2. Sätt storleken på fönstret. final int FRAME_WIDTH = 300; final int FRAME_HEIGHT = 500; frame.setsize(frame_width,frame_height); 3. Om man vill kan man också sätta titeln på fönstret. frame.settitle("an empty frame"); 4. Ange vad som ska hända när fönstret stängs. frame.setdefaultcloseoperation(jframe.exit_on_close); 5. Gör fönstret synligt. frame.setvisible(true);

Ett fönsterprogram import javax.swing.jframe; public class EmptyFrameViewer { public static void main(string[] args) { JFrame frame = new JFrame(); final int FRAME_WIDTH = 300; final int FRAME_HEIGHT = 500; frame.setsize(frame_width,frame_height); frame.settitle("an empty frame"); frame.setdefaultcloseoperation(jframe.exit_on_close); frame.setvisible(true);

Panel Ett tomt fönster är ju ganska tråkigt. För att lägga till saker i ett fönster behöver man först skapa en JPanel som kan innehålla flera olika grafiska komponenter. JPanel panel = new JPanel(); panel.add(button); panel.add(label); frame.add(panel); Såhär kan vi skapa en knapp och en label: JButton button = new JButton("Click me!"); JLabel label = new JLabel("Hello World!");

En knapp och en label import javax.swing.*; public class FilledFrameViewer { public static void main(string[] args) { JFrame frame = new JFrame(); JButton button = new JButton("Click me!"); JLabel label = new JLabel("Hello World!"); JPanel panel = new JPanel(); panel.add(button); panel.add(label); frame.add(panel); final int FRAME_WIDTH = 300; final int FRAME_HEIGHT = 100; frame.setsize(frame_width,frame_height); frame.settitle("an empty frame"); frame.setdefaultcloseoperation(jframe.exit_on_close); frame.setvisible(true);

Händelsestyrda program Just nu gör knappen ingenting när man trycker på den. Hur kan vi ändra på det? Vi behöver göra vårt program händelsestyrt. Många program har följande principiella beteende: Programmet är i vila i väntan på en extern händelse (knapptryckning, musklick, inkommande paket över nätet,... ). När en händelse inträffar, sker en mängd reaktioner i programmet; därefter återgår programmet till vila, i väntan på nästa händelse

Lyssnare Händelsestyrda program skrivs genom att definiera lyssnare, som beskriver vad programmet ska göra när en viss händelse inträffar. Lyssnaren registreras hos en komponent som kan känna igen en händelse. Lyssnaren anropas när händelsen inträffar. Slogan Don t call us; we ll call you! Exempel på komponenter och deras händelser: Knappar (knapptryck) Paneler/ritytor (musklick) Menyer (menyval)

Lyssna på knapptryck Klassen JButton har en metod för att lägga till en lyssnare som anropas när man trycker på knappen. public void addactionlistener(actionlistener l); Interfacet ActionListener: public interface ActionListener { public void actionperformed(actionevent e);

Lyssna på knapptryck Låt oss lägga till en lyssnare till vår knapp i exempelprogrammet. import java.awt.event.actionevent; import java.awt.event.actionlistener; public class ClickListener implements ActionListener { public void actionperformed(actionevent event) { System.out.println("I was clicked."); Vi behöver lägga till följande rader i vårt program: ActionListener listener = new ClickListener(); button.addactionlistener(listener);

Den nya klassen import java.awt.event.actionlistener; import javax.swing.*; public class FilledFrameViewer2 { public static void main(string[] args) { JFrame frame = new JFrame(); JButton button = new JButton("Click me!"); ActionListener listener = new ClickListener(); button.addactionlistener(listener); JLabel label = new JLabel("Hello World!"); JPanel panel = new JPanel(); panel.add(button); panel.add(label); frame.add(panel); final int FRAME_WIDTH = 300; final int FRAME_HEIGHT = 100; frame.setsize(frame_width,frame_height); frame.settitle("an empty frame"); frame.setdefaultcloseoperation(jframe.exit_on_close); frame.setvisible(true);

Lokala klasser Ofta när man skriver lyssnar-klasser kan det underlätta att använda en konstruktion i Java som kallas lokala klasser (eng. inner classes). Det tillåter att man kan deklarera en klass inuti en klass. public class Enclosing {... private class Inner {... Den lokala klassen har tillgång till privata instansvariabler och privata metoder i den yttre klassen. Detta kan underlätta när man skriver metoder i den inre klassen eftersom man inte behöver skicka t.ex. instansvariabler som parametrar.

Anonyma lokala klasser Lokala klasser gör att koden blir lite mer organiserad men vi måste fortfarande skriva en hel klass för att kunna lyssna på händelser. Java tillhandahåller också anonyma lokala klasser (eng. anonymous inner classes). button.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { System.out.println("I was clicked."); ); När vi skriver på detta sätt skapas en ny klass som implementerar ActionListener interfacet och som har metoden actionperformed. Klassen kallas anonym eftersom den inte har något namn.

Anonyma lokala klasser import java.awt.event.*; import javax.swing.*; public class FilledFrameViewer3 { public static void main(string[] args) { JFrame frame = new JFrame(); JButton button = new JButton("Click me!"); button.addactionlistener(new ActionListener() { public void actionperformed(actionevent event) { System.out.println("I was clicked."); ); JLabel label = new JLabel("Hello World!"); JPanel panel = new JPanel(); panel.add(button); panel.add(label); frame.add(panel); final int FRAME_WIDTH = 300; final int FRAME_HEIGHT = 100; frame.setsize(frame_width,frame_height); frame.settitle("an empty frame"); frame.setdefaultcloseoperation(jframe.exit_on_close); frame.setvisible(true);

Layout När man skapar ett grafiskt gränssnitt så vill man ofta ha kontroll på hur de olika komponenterna läggs ut i ett fönster. För att åstadkomma detta använder Java Layout management. Klassen JPanel använder sig av en standard layout manager som lägger till komponenter från vänster till höger. Det finns flera olika sätt att skapa egna layouter. Vi ska lära oss mer om dessa två: Border Layout Grid Layout

Byta Layout Manager För att en panel ska få en annan layout manager kan man göra på två sätt: När man skapar en JPanel kan man anropa konstruktorn med en layout manager. JPanel panel = new JPanel(new BorderLayout()); Man kan sätta en layout manager med hjälp av metoden setlayout. panel.setlayout(new BorderLayout());

Border Layout En Border Layout skapar fem regioner där man kan lägga grafiska komponenter. panel.add(component,borderlayout.north);

Grid Layout En Grid Layout kan användas när man vill att komponenter ska hamna i ett fixt antal rader och kolumner. Konstruktorn till GridLayout tar två heltal som anger hur många rader och kolumner layouten ska ha. JPanel buttonpanel = new JPanel(); buttonpanel.setlayout(new GridLayout(4,4)); buttonpanel.add(button7); buttonpanel.add(button8); buttonpanel.add(button9); buttonpanel.add(buttonplus); buttonpanel.add(button4);...

Grid Layout På så sätt kan man skapa en layout för, t.ex. en miniräknare.

Nästla layouter Det finns mer komplicerade layout managers men det räcker i princip alltid med BorderLayout och GridLayout om man nästlar paneler, dvs. paneler inuti paneler. JPanel keypadpanel = new JPanel(); keypadpanel.setlayout(new BorderLayout()); JPanel buttonpanel = new JPanel(); buttonpanel.setlayout(new GridLayout(4,4)); buttonpanel.add(button7); buttonpanel.add(button8); //... keypadpanel.add(buttonpanel, BorderLayout.CENTER); JTextField display = new JTextField(); keypadpanel.add(display, BorderLayout.NORTH);

Nästla Layouter

Counter Låt oss säga att vi vill skapa ett grafiskt program som implementerar en räknare.

Counter modell En enkel klass för räknare. public class Counter { private int value; public Counter() { value = 0; public void incr() { value++; public int getvalue() { return value;

CounterPanel import java.awt.*; import javax.swing.*; public class CounterPanel extends JPanel { private Counter ctr; public CounterPanel(Counter ctr) { this.ctr = ctr; setpreferredsize(new Dimension(100,100)); setfont(new Font(Font.SANS_SERIF,Font.BOLD,50)); setbackground(color.magenta); setopaque(true); public void paintcomponent(graphics g) { super.paintcomponent(g); g.drawstring("" + ctr.getvalue(),20,80);

CounterPanel förklaring CounterPanel ärver från JPanel. På detta sätt skapar man en ny komponent. I lite större applikationer är det lättare att skapa nya komponenter istället för att initialisera hela gränssnittet i main-metoden. Denna klass innehåller detaljer som jag inte kommer gå in vidare på, t.ex. Font, Dimension, pointcomponent, osv. Om ni är nyfikna på att veta mer, läs i Javas dokumentation och testa själva.

Counter Main import java.awt.*; import java.awt.event.*; import javax.swing.*; public class CounterMain { public static void main(string[] args) { final Counter ctr = new Counter(); final CounterPanel panel = new CounterPanel(ctr); JButton incrbutton = new JButton("Incr"); JPanel view = new JPanel(new BorderLayout()); view.add(panel,borderlayout.north); view.add(incrbutton,borderlayout.south); incrbutton.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { ctr.incr(); panel.repaint(); ); JFrame f = new JFrame(); f.add(view); f.pack(); f.setdefaultcloseoperation(jframe.exit_on_close); f.setvisible(true);

Counter Main förklaring När vi uppdaterar räknaren anropar vi metoden repaint i vår panel. Detta gör att den ritas om vilket innebär att metoden paintcomponent anropas. Istället för att sätta storleken på vår JFrame så använder vi metoden pack. Den lägger samman alla komponenter och skapar ett fönster som är lagom stort för att innehålla alla dessa komponenter. För att använda lokala variabler inuti en lokal klass krävs att dessa variabler deklareras final.

MVC En allmänt accepterad princip för program med grafiskt gränssnitt är att separera de tre rollerna Modell (eng. model); den bakomliggande datastruktur som programmet bearbetar. I exemplet klassen Counter. Vy (eng. view); den visuella presentationen av modellen som användaren ser tillsammans med komponenter för åtgärder. I exemplet klassen CounterPanel. Styrfunktion (eng. controller); den klass som noterar användarens åtgärder samt ber först modellen och sedan vyn att uppdatera sig. I exemplet den anonyma lokala klassen. När man skriver styrfunktionen så har man ofta ett val mellan att skapa en ny fristående klass eller att använda anonyma lokala klasser. Det finns inget entydigt svar på vilket som är bäst, det varierar från applikation till applikation.

Lab 7 I laboration 7 kommer ni att implementera ett Yatzy-spel. Laboration kommer att göras tillgänglig någon gång under veckan. Börja i tid! Detta är en betydligt större lab än de tidigare i kursen.