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

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

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

Java-concept och Swing. Swing low, sweet chariot

Laboration 15 Grafiskt användargränssnitt

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

Lösningar för tenta 3 DAT043,

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

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

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

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

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

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

OOP Objekt-orienterad programmering

Mer om grafiska komponenter. Händelsestyrda program

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

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

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

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

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

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

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

2I1073 Lektion 2. Lektion 2a. Lektion 2a. Servlets, säkerhet, och filhantering. import java.io.*; import javax.servlet.*; import javax.servlet.http.

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

OOP Objekt-orienterad programmering

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

Projekt 2 XL. Observer-mönstret

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

Lösningsförslag till tentamen

The Last Adventure. Innehåll. Objektorientering. Språket Java. Java - Paket. Java - synlighet. Den sista lektionen. Repetition.

Tentamen FYTA11 Javaprogrammering

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

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

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

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

Laboration 24 Databasen MySQL och java

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

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

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

Lösningsförslag till tentamen

Lösningsförslag till tentamen

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

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 3

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

Lösningsförslag till tentamen

Lösningsförslag till tentamen

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

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

Laboration 4: Game of Life

kl

Lösningar till tentamen i EDAF25

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

Tentamen FYTA11 Javaprogrammering

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.

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

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

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

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

Upplägg. Introduktion. Examination. Mål. Konsekvenser. Java. Kursen heter konstruktion, ej design eller formgivning.

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. Kurs: Applikationsutveckling i Java 5DV135. Ansvarig lärare: Johan Eliasson. HT12 Datum: Tid: kl

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

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

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

Rita Egna Bilder, Timer

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

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

Lösningsförslag till tentamen

Tentamen i Objektorienterad programmering E

ID1004 Laboration 3, 5-6 November 2012

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

Lektion Händelsehanterare

Laboration 18 Undantag, Class

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

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

Lösningsförslag till tentamen

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 3

Lösningsförslag till tentamen FYTA11 Javaprogrammering

Prov på delkurs Objekt-orienterad Programmering

4 13 / %.; 8 </" '': " / //&' " " ' * TelefonKostnad +,-%&. #!" $% " &' . > / ' 5 /' * 13/ &' static Math 1+" &'/ % 12 "" static "' * 1 /") %& &

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

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

Lösningar till tentamen i EDAF25

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

Tentamen i Objektorienterad programmering

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

Lösningsförslag till tentamen

JAR som tar eller zip. Java. Exekvering

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

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

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

Tentamen Objekt-orienterad programmering med Java, 1DL100 Sommarkurs och distanskurs

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

Tentamen i Objektorienterad programmering E

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

Lösningsförslag till exempeltenta 2

PROGRAMMERINGSTEKNIK för F1 och TM1 (TIN212)

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

12 Metaprogrammering i Java

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

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

Transkript:

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

MVC Tanken bakom MVC (model view control) är att separera uppgifter i ett program från varandra. Model - Den data som behandlas View - Hur användargränssnittet ser ut Control - Vad som ska hända när användaren agerar mot gränssnittet

Model I vårt korta exempel så är Model en klass som representerar ett personregister. Man kan söka efter en person och man kan ta bort en person. En person representeras här för enkelhetens skull bara av en String med namnet.

Publikt gränssnitt mot Model public Model(){... // Skapa modellen public void delete(string name){... // Ta bort en person public ArrayList<String> search(string target){... // Sök personer

View Vår View är ett fönster med några få komponenter:

Komponenter i View private JFrame frame; // Komponenter i NORTH private JPanel north; private JLabel label; private JTextField searchfield; private JButton searchbutton; // Komponenter i CENTER private JList<String> resultlist; private DefaultListModel<String> result; // Komponenter i SOUTH private JPanel south; private JButton deletebutton;

Publikt gränssnitt mot View public View(){... // Skapa en View public JTextField getsearchfield(){... //Sökfältet public JButton getsearchbutton(){... //Sökknappen public JButton getdeletebutton(){... //Deleteknappen public DefaultListModel<String> getresultmodel(){... //Listmodellen för resultat public JList<String> getresultlist(){... //Listan med resultat

Control Control registrerar Listeners på komponenter och hanterar vad som ska hända när användaren triggar event på dem Ska View uppdateras? Hur? Ska Model förändras? Control måste alltså ha tillgång till View såväl som Model

User actions Control ska hantera Användaren vill söka efter person Genom att trycka enter i sökfältet Genom att trycka på sökknappen Avändaren vill radera person Först markerar användaren personer som ska bort Sedan trycker användaren på Delete selected

Användaren vill söka Både sökfältet och sökknappen ska ha samma Listener. När eventet kommer, ska Control: Läsa sökfältet Fråga Model efter resultat genom att anropa seach() med sökfrasen Uppdatera resultatlistan med ev. resultat Återställa sökfältet (markerad text: sök här)

SearchAction private class SearchAction implements ActionListener{ public void actionperformed(actionevent ae){ searchforperson(); view.getsearchfield().settext("search here"); view.getsearchfield().requestfocus(); view.getsearchfield().selectall(); private void searchforperson(){ view.getresultmodel().removeallelements(); for(string match : model.search(view.getsearchfield().gettext()) ){ view.getresultmodel().addelement(match);

Användaren vill radera en person Delete-knappen måste ha en DeleteAction som action listener. Denna listener måste fråga listan vilken eller vilka element som är markerade, och radera dessa i Model. För att ge feedback till användaren, så visas i listan vilka personer som raderats.

DeleteAction private class DeleteAction implements ActionListener{ public void actionperformed(actionevent ae){ List<String> values = view.getresultlist().getselectedvalueslist(); view.getresultmodel().removeallelements(); for(string value : values){ model.delete(value); view.getresultmodel().addelement("deleted: "+value); view.getsearchfield().settext("search here"); view.getsearchfield().requestfocus(); view.getsearchfield().selectall();

Publikt gränssnitt mot Control public Control(View view, Model model){...//skapa Control public void controlit(){... // Take control! //controlit(): public void controlit(){ controlfieldandbutton(); // Register listeners controldeletebutton(); // Register listener

Publika gränssnitt i hela MVC-appen //Model: public Model(){... // Skapa modellen public void delete(string name){... // Ta bort en person public ArrayList<String> search(string target){... // Sök personer // View: public View(){... // Skapa en View public JTextField getsearchfield(){... //Sökfältet public JButton getsearchbutton(){... public JButton getdeletebutton(){... //Sökknappen //Deleteknappen public DefaultListModel<String> getresultmodel(){...//listmodellen public JList<String> getresultlist(){... //Listan med resultat // Control: public Control(View view, Model model){...//skapa Control public void controlit(){... // Take control!

Main-klassen public static void main(string[] args){ SwingUtilities.invokeLater(new Runnable(){ public void run(){ Model model = new Model(); View view = new View(); Control control = new Control(view, model); control.controlit(); ); // Fyra rader kod (resten är överkurs ;-) )

Model.java package mvc.model; import java.util.arraylist; import java.util.collections; public class Model{ private ArrayList<String> persons; public Model(){ initlist(); private void initlist(){ persons = new ArrayList<String>(); persons.add("arne Anka"); persons.add("sockerconny"); persons.add("ragnar Frunk"); persons.add("peter Parker"); persons.add("agent Carter"); persons.add("mandel Karlsson"); persons.add("archibald Haddock"); persons.add("stan Lee"); persons.add("lucky Luke"); Collections.sort(persons); // continued public void delete(string name){ persons.remove(name); public ArrayList<String> search(string target){ ArrayList<String> matches = new ArrayList<String>(); for(string person : persons){ if(person.tolowercase().contains(target.tolowercase())){ matches.add(person); return matches;

View.java package mvc.view; import javax.swing.*; import java.awt.*; public class View{ /* Components */ private JFrame frame; private JTextField searchfield; private JButton searchbutton; private JButton deletebutton; private JList<String> resultlist; private DefaultListModel<String> result; private JPanel north; private JPanel south; private JLabel label; /* Constructor */ public View(){ initandlayout(); /* Initialize and lay out the components */ private void initandlayout(){ initcomponents(); layoutcomponents(); frame.setsize(500,200); frame.setdefaultcloseoperation(jframe.exit_on_close); frame.setvisible(true); private void initcomponents(){ frame = new JFrame(); frame.setlayout(new BorderLayout()); north = new JPanel(); south = new JPanel(); label = new JLabel("Search for a person:"); searchfield = new JTextField(20); searchfield.settext("search here"); searchfield.requestfocus(); searchfield.selectall(); searchbutton = new JButton("Search"); deletebutton = new JButton("Delete selected"); result = new DefaultListModel<String>(); result.addelement("results:"); resultlist = new JList<String>(result); resultlist.setvisiblerowcount(20); private void layoutcomponents(){ north.add(label); north.add(searchfield); north.add(searchbutton); south.add(deletebutton); frame.add(north, BorderLayout.NORTH); frame.add(resultlist, BorderLayout.CENTER); frame.add(south, BorderLayout.SOUTH);

View.java (continued...) /* Accessor methods for the control */ public JTextField getsearchfield(){ return searchfield; public JButton getsearchbutton(){ return searchbutton; public JButton getdeletebutton(){ return deletebutton; public DefaultListModel<String> getresultmodel(){ return result; public JList<String> getresultlist(){ return resultlist; // end class

Control.java package mvc.control; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.arraylist; import java.util.list; import mvc.view.view; import mvc.model.model; public class Control{ private View view; private Model model; public Control(View view, Model model){ this.view = view; this.model = model; public void controlit(){ controlfieldandbutton(); controldeletebutton(); private class SearchAction implements ActionListener{ public void actionperformed(actionevent ae){ searchforperson(); view.getsearchfield().settext("search here"); view.getsearchfield().requestfocus(); view.getsearchfield().selectall();

Control.java private class DeleteAction implements ActionListener{ public void actionperformed(actionevent ae){ List<String> values = view.getresultlist().getselectedvalueslist(); view.getresultmodel().removeallelements(); for(string value : values){ model.delete(value); view.getresultmodel().addelement("deleted: "+value); view.getsearchfield().settext("search here"); view.getsearchfield().requestfocus(); view.getsearchfield().selectall();

Control.java (continuted) private void controlfieldandbutton(){ SearchAction sa = new SearchAction(); view.getsearchfield().addactionlistener(sa); view.getsearchbutton().addactionlistener(sa); private void controldeletebutton(){ DeleteAction da = new DeleteAction(); view.getdeletebutton().addactionlistener(da); private void searchforperson(){ view.getresultmodel().removeallelements(); for(string match : model.search(view.getsearchfield().gettext()) ){ view.getresultmodel().addelement(match);