Laboration 1: Yatzy. 1 Yatzy. 2 Användargränssnitt. Joachim von Hacht

Relevanta dokument
Arv och Grafiska Användargränssnitt

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

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

Objekt, Klasser, Paket m. m.

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

Samlingar, Gränssitt och Programkonstruktion! Förelasning 11!! TDA540 Objektorienterad Programmering!

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

Lab5 för prgmedcl04 Grafik

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

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

Tentamen FYTA11 Javaprogrammering

Lösningsförslag till tentamen

PROGRAMMERINGSTEKNIK TIN212

Tentamen i Grundläggande Programvaruutveckling, TDA548

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

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

Lösningar till tentamen i EDAF25

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.

Laboration 2: Ett kommunikationssystem

TENTAMEN OOP

Lösningsförslag till tentamen

TENTAMEN OOP

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

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

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

Vad kännetecknar en god klass. Vad kännetecknar en god klass. F12 Nested & Inner Classes

Lektion Händelsehanterare

Java-concept och Swing. Swing low, sweet chariot

Modeller, Objekt och Klasser

Kurs i programmering Java Uppgifter

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

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

Objektsamlingar i Java

Tentamen. Datalogi I, grundkurs med Java 10p, 2D4112, Lördagen den 30 november 2002 kl , salar E33, E34

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

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

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

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

I STONE. I Variabler, datatyper, typkonvertering. I Logiska och matematiska uttryck. I Metoder-returvärde och parametrar. I Villkorssatser if/else

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

Laboration 3 GUI-programmering

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

Lösningar till tentamen i EDAF25

Tentamen Programmering fortsättningskurs DIT950

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

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

Chapter 4: Writing Classes/ Att skriva egna klasser.

DAT043 - Föreläsning 7

Objektorienterad Programkonstruktion. Föreläsning 4 8 nov 2016

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

TENTAMEN PROGRAMMERING I JAVA, 5P SOMMARUNIVERSITETET

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

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

Lösningsförslag till tentamen

JAVA Mer om klasser och objektorientering

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

Mer om grafiska komponenter. Händelsestyrda program

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

Tentamen i Objektorienterad programmering

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

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Idag. statiska metoder och variabler. private/public/protected. final, abstrakta klasser, gränssnitt, delegering. wrapper classes

Objektorienterad Programkonstruktion. Föreläsning 2 2 nov 2016

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

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

UML. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Överlagring, static, testning, formella metoder och undantag! Förelasning 13!! TDA540 Objektorienterad Programmering!

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING. Övningstentamen 1

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

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

Tentamen Programmeringsteknik II Inledning. Anmälningskod:

Konstruktion av klasser med klasser

Arv. Objektorienterad och komponentbaserad programmering

Windows Forms Winstrand Development

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

Lösningsförslag. Programmeringsmetodik, KV: Java och OOP. 17 januari 2004

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING. Övningstentamen 2

Polymorfi. Objektorienterad och komponentbaserad programmering

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

tentaplugg.nu av studenter för studenter

Enum, mer om Arv, Abstrakta klasser, Polymorfism, Recursion! Förelasning 14!! TDA540 Objektorienterad Programmering!

Tentamen ID1004 Objektorienterad programmering May 29, 2012

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

TENTAMEN OOP

Classes och Interfaces, Objects och References, Initialization

Mer om metoder och abstraktioner

Föreläsning 8: Exempel och problemlösning

TENTAMEN. Objektorienterade applikationer CHALMERS. 2018/2019, lp 3 DAT055. Uno Holmer

Föreläsning 12. Länkade listor

Lösningsförslag till tentamen

DIAGNOSTISKT PROV. Tid. Hjälpmedel. Antaganden. Rättning. Övrigt. Diagnostiskt Prov. Klockan Inga

Objektorienterad Programmering (OOP) Murach s: kap 12-16

Rekursion. Att tänka rekursivt Att programmera rekursivt i Java Exempel. Programmeringsmetodik -Java 254

Bankkonto - övning. Övning 2 Skriv en metod, geträntan, som returnerar räntan.

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

Laboration 15 Grafiskt användargränssnitt

Lösningsförslag till omtentamen för TDA540 Objektorienterad Programmering

DAT043 - föreläsning 8

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy. Funktioner / metoder. Punktnotation. Evalueringsordning

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

Transkript:

Laboration 1: Yatzy Bakgrund Detta är en utsträckt laboration som är tänkt att leda fram till ett lite större program, ett Yatzy-spel för dator. Projektet skall även visa på hur man arbetar för att ta fram ett icke-trivialt program,... en process. Tanken är att vi under ordnade former, bit för bit skall bygga upp programmet av högkvalitativa (felfria) delar och på så sätt behärska den komplexitet det innebär att utveckla ett program. PÅ kurssidan finns gott om kodexempel, använd dessa! Sista datum för godkänt (därefter omtentaperiod) : Se kurssida. 1 Yatzy Antar att alla spelat Yatzy tidigare. Om ej se http://sv.wikipedia.org/wiki/yatzy. Vi kommer även att använda en tärningsmugg. OBS! Regler: Att om man t.ex. får tretal så kan detta även skrivas på 1 par, o.s.v. 2 Användargränssnitt Vi kommer inledningsvis att använda ett en relativt enkelt gränssnitt, därefter (frivilligt) kan man göra gränssnittet lite mer fancy. En grundläggande idé är att rader och tärningar är linjärt ordnade, de kommer att visas i en viss ordning i användargränssnittet. I modellen kommer vi därför att använda Array:er och/eller listor för tabellrader och tärningar. 1 Produced with Lyx, the open source wordprocessor

Figur 1: Yatzy med två olika användargränssnitt (GUI). Till vänster basic-versionen och till höger fancy-versionen. I basic-versionen är tärningarna med sexor låsta (behåller sina värden). OBS! Att det bara är utseendet som skiljer, innandömet är lika i båda fallen. 3 Modellen Modellen består av 6 klasser. Yatzy är själva spelet. Yatzy har 1-6 spelare och en tärningsmugg. Tärningsmuggen har 5 tärningar. Spelaren har en poängtabell (bara en kolumn egentligen) och kolumnen har rader med värden (RowValue). 4 Startkod Skapa en mapp för laborationen. På kurssidan nns startkod, hämta hem, spara i mappen och packa upp. 2 Produced with Lyx, the open source wordprocessor

Titta igenom koden och läs kommentarer! En del klasser hör inte till modellen utan är bara tekniska hjälpmedel t.ex. YatzyOptions. I appendix nns en bild som visar hur mappar och ler är organiserade i det slutliga projektet. I den nedladdade koden fattas klasser. Starta din utvecklingsmiljö och börja jobba... 5 En tärning Skapa en klass Dice för en tärning. Klassen skall internt använda java.util.random (import java.util.random;). Se appendix var klassen skall ligga. Klassen måste ha package yatzy; först i len (högst upp)! Klassen skall ha följande konstruktor och metoder; // Constructor. Create Dice with number of faces public Dice(int faces){...} // Roll dice, get result back public int roll() {...} // Get result of last roll (IllegalStateException if no roll done) public int getlastresult() {...} // If true will roll else not public void setenabled(boolean b) {...} Det nns en färdig test, TestDice, i paketet (mappen) test. Testen innehåller en main-metod och skall gå att köra som ett vanligt program. Använd testen för att kontrollera att tärningen fungerar som tänkt. Se kommentarer i koden. OBS! Du måste avkommentera koden i testen, även i main metoden. 6 En tärningsmugg Tärningsmuggen har ansvaret för att hantera alla tärningarna. Skapa en klass för denna. Klassen kan internt använda en Array eller en List för att hålla reda på tärningarna. Du väljer, men tänkt efter...! Klassen skall även hålla reda på det senaste resultatet av ett kast (resultatet för alla tärningarna). Konstruktor och metoder; 3 Produced with Lyx, the open source wordprocessor

// Contructor. Supply list of Dice, will not accept // empty list, if so IllegalArgumentException public DiceCup(List<Dice> dices){...} // Roll dice and return result for all as a list public List<Integer> roll() {...} // Enable/Disable Dice with given index public void setdieenabled(int index, boolean b) {...} // Get last result (empty list if no roll) public List<Integer> getlastresult() {...} Finns en test för klassen! 7 En resultatklass Vi låter varje spelare hantera sin egen kolumn i resultattabellen. Det nns en påbörjad klass Score som representerar en kolumn. Score-klassen använder den givna hjälpklassen RowValue. Klassen representerar en rad i kolumnen. Klassen vet vilket värde raden har och om värdet är satt (d.v.s. redan angivet = upptaget). Dessutom håller RowValue reda på vilken rad den hör hemma på. Egentligen inte nödvändigt men det blir bekvämt senare när vi kommer till GUI delarna. Konstruktor och metoder (som inte är klara) // Initialize the column (sum, bonus and total should be set, so user // can't write anything in) public Score() {...} // Method to sum all values for one to six (when calculating bonus) private int getsumonetosix() {...} // Method to calculate the toal private int gettotal() {...} // Set value for some row (if not already set) // Also update total and possible bonus public void setscore(int row, int value) {...} // Class method to get all possible outcomes from a given result (result // delivered from DiceCup). Returns a list where list index is the // row and index value is the value for the row public static List<Integer> getpossibilities(list<integer> result) {...} Metoden getpossibilities är komplicerad och måste brytas ner i många mindre hjälpmetoder där varje metod svarar på om det är möjligt att få ett par, två par,..., kåk och yatzy. Om det är möjligt att få t.ex. tretal så får man poängsumman i retur annars 0. Skapa klassmetoder för varje sådan fråga. Om det går att använda samma hjälpmetod för era fall så skall detta göras. Utnyttja hjälpklasserna för att bygga upp getpossibilities(). 4 Produced with Lyx, the open source wordprocessor

TIPS: Att sortera result (parametern till metoden) innan man skickar den till hjälpmetoderna underlättar betydligt i många fall. Det nns en påbörjad test. Använd den som utgångspunkt och bygg på med er tester. OBS! Under testning måste alla metoder vara public. Sätt metoder som bara används internt i klassen till private då testningen är avklarad. 8 Spelare Det nns en färdig klass för spelaren. Inspektera! 9 Integrationstestning Nu skall vi ha ett antal färdiga (och testade) klasser. Nästa mål är att koppla ihop klasserna för att försöka få ett fungerande händelseförlopp. Vi vill testa att spelaren kan kasta tärningen en gång (vi får ett resultat osv.) Det nns en färdig test, TestIntegration. Avkommentera och försök få metoden testplayerrollonce att fungera. Efter detta är den första versionen av vår modell klar. Gör en (eller era) back-up(er), zipp:a ihop och lägg på ett säkert ställe! 10 Yatzy Det nns en påbörjad klass Yatzy som reprsenterar hela spelet. Klassen använder de färdiga klasserna för att sköta spelet, ungefär som integrationstesten. Yazy är den enda klassen som direkt skall anropas från användargränssnittet (när vi klickar i GUI:et kommer metoder i Yatzy-klassen att anropas). En hel del kan delegeras direkt till andra klasser, kolla alltid om det du behöver redan nns! Konstruktor och metoder (som inte är färdiga) // Constructor, input the players, faces for dices and how // many roll for a player (default values in YatzyOptions) public Yatzy(List<Player> players, int dicefaces, int maxrolls){..} // Roll dice if possible (max rolls!) public List<Integer> roll() {...} // Same as Score public List<Integer> getpossibilities(){...} 5 Produced with Lyx, the open source wordprocessor

// Disable Dice with index i public void disabledice(int i) {...} // Enable Dice with index i public void enabledice(int i) {...} // Used to set the score for the actual player // If success returns true else false public boolean setscore(int rowindex, int userinput) {...} // Start the game, set actual player etc. public void start() {...} // Next player public void next() { 11 En kommandoradsversion av Yatzy Nu skall vi kunna spela en del av spelet m.h.a. en kommandorad, exampel nedan. Implementera en kommandorad i testklassen TestCommandLine. Vi instansierar ett Yatzy objekt och anropar olika metoder genom att skriva in kommandon (och trycka enter). Kommandoraden skall klara av de kommandon som nns i den färdiga metoden help(). // Running commandline h for help on commands > h q = quit a = actual player r = roll s = set value for actual player > a Player{name=Urban, score=score{values=[0(0,false), 1(0,false), 2(0,false),... > r [2, 3, 3, 1, 2] [1, 4, 6, 0, 0, 0, 0, 0, 6, 10, 0, 0, 0, 0, 0, 11, 0, 0] > s Enter index and score: 1 4 Player{name=Urban, score=score{values=[0(0,false), 1(4,true), 2(0,false),... När allt fungerar är vi färdiga med denna version av modellen. Spara undan som tidigare! 12 StandardYatzy När vi använder ett graskt GUI blir det ofta problem när vi t.ex. skall visa resultatet från ett tärningskast. Anropet till metoden som kastar sker på ett ställer i GUI:et (där 6 Produced with Lyx, the open source wordprocessor

knappen Roll nns) men resultatet skall visas på ett helt annat ställe (där tärningarna skall ritas upp). En lösning på detta är att använda händelsebaserad uppdatering av GUI:et. Modellen kommer att skicka en händelse när något inträat. GUI:et tar emot händelsen (och ev data) och reagerar utifrån vilken sorts händelse det är. Den händelsebaserade uppdateringen implementeras med en hjälpklassen EventBus och en subklass till Yatzy, StandardYatzy. Inspektera klassen EventBus. Klassen är en enum (och lite tekniskt komplicerad). Den enda instansen av klassen heter INSTANCE. Man kan använda klassen enligt följande // Register to be able to get events (this is some GUI object) EventBus.INSTANCE.register(this); // Send event to all registred to enable dice nr 4 EventBus.INSTANCE.publish(EventBus.Event.ENABLE_DICE, 4); Klassen loggar (skriver ut) all händelser som genereras, bra vid felsökning senare. Den påbörjade klassen StandardYatzy ärver Yatzy. I klassen överskuggar vi de metoder i Yatzy som påverkar GUI:et (lägg till @Override ovanför varje överskuggad metod). I de överskuggade metoderna anropar man superklassens metod (eftersom ingen ny logik tillkommer) och EventBus.INSTANCE.publish(...) med lämplig Event. All händelsegenerering nns alltså i StandardYatzy. Vi avvaktar med tester för StandardYatzy (om du vill kan du försöka skapa en egen test). 13 Ett grask användargränssnitt till StandardYatzy Vi skall nu påbörja utvecklingen av ett graskt användargränssnitt. Det nns en färdig klass MainFrame, för applikationens huvudfönster. Klassen fungerar även som lyssnare till menyn och använder att antal paneler för att bygga upp GUI:et. I metoden start() byggs modellen och hela GUI:et upp och kopplas samman. OBS! Att vi skapar ett StandardYatzy-objekt trots att variabeln yatzy är av typen Yatzy, fungerar eftersom StandardYatzy är en subklass. Klassen MainFrame skapas i klassen Main. Prova att köra Main!. När du startar skall ett GUI enligt bilden visas (de paneler som syns är ButtonPanel och DicePanel, poängtabellen, ScorePanel och Table saknas). 7 Produced with Lyx, the open source wordprocessor

TDA540 Figur 2: Sprängskiss över användargränssnittets konstruktion. Gränssnittet byggs lager på lager med paneler och övriga komponenter (paneler är blå). 13.1 ButtonPanel och DicePanel Vårt första mål är att få Roll-knappen att fungera så att tärningarnas resultat visas. Arbeta parallellt med metoderna actionperformed och onevent i klasserna Button- Panel och DicePanel. actionperformed hanterar händelser från GUI (knappklick). onevent skall hantera händelser skickade från StandardYatzy via EventBus (ENABLE_DICE t.ex.). Dice-panel kan behöva privata hjälpmetoder, t.ex. en metod som uppdaterar alla tärningar (texten på knapparna) och en metod som givet en komponent ger index för denna (så att vi kan göra enable/disable på rätt tärning). TIPS Alla Komponenter på panelerna ligger i en Component[]. Denna får man genom att anropa this.getcomponents(); Tärningarna i DicePanel låser man genom att man klickar på dem (det mesta sköts automatiskt av JToggelButton). 8 Produced with Lyx, the open source wordprocessor

13.2 En tabellklass Nu skall vi bygga en klass som visar poängtabellen (d.v.s. alla Score för alla spelare). I denna version är det tänkt att användaren skriver in ett resultat i tabellen och trycker enter (innebär också att man efter detta byter aktuell spelare). Skapa en klass Table som ärver JPanel. Klassen skall byggas upp med JLabel och JTextField. Använd en GridLayout för att få tabellutseendet. Mycket sker i konstruktorn, skapa komponenter, lägg till dessa,.. TIPS Klassen kommer att behöva omvandla mellan index (från Component[]) och rad, kolumn i tabellen. När vi senare använder tabellen vill vi bara ange rad och kolumn (bekvämt). Konstruktor och metoder... // Contructor. Create table with specified nr of rows and cols // Table is automatically augmented with one row for headers // and one col for labels (for rows). The supplied arrays are // used to set the text for headers and labels (using JLabel) // The table is 0-indexed i.e. top-left cell is 0,0. public Table(int rows, int cols, String[] headers, String[] labels) {...} // Make at cell editable depending on value of b (true/false) public void setcelleditable(int row, int col, boolean b) {...} // Enable/disable cell at row, col, depending on value of b (true/false) public void setcellenabled(int row, int col, boolean b) {...} // Set cell at row, col to value s public void setcell(int row, int col, String s) {...} // Get row for the text field (c is a text field which is a Component) public int getrow(component c) {... } // Add/remove actionlistener to all text fields public void addactionlistener(actionlistener a) { public void removeactionlistener(actionlistener a) { Det nns en test for Table. Använd denna under utvecklingen. 13.3 ScorePanel Den givna klassen StandarScorePanel använder Table. Klassen fungerar som en lyssnare på Table (lyssna på JTextField i Table). Avkommentera i klassen och försök att köra (ev. måste vissa saker xas till). Gör klart de metoder som är tomma. Jobba vidare tills det fungerar. Vid problem gå tillbaks och kör tester. Hitta ev på nya tester för saker som verkar osäkra. När det fungerar är första GUI-versionen klar. Spara undan som tidigare! 9 Produced with Lyx, the open source wordprocessor

TDA540 14 RobotYatzy I förra versionen skrev spelaren in ett resultat i tabellen. Nu skall vi göra en version där spelet visar alla tänkbara utfall i tabellen (Table). Användaren väljer genom att klicka på en cell. Skapa en subklass, RobotYatzy, till StandardYatzy. RobotYatzy kan skicka alla möjliga utfall till GUI:et så att spelaren kan välja (har du redan detta i Standard- Yatzy så ytta det till RobotYatzy). Använd EventBus som tidigare. Vi behöver en panel, RobotScorePanel, eftersom vi nu skall hantera musklick. Det som skiljer StandardScorePanel och RobotScorePanel är ganska lite, bara det som är specikt för enter-slag respektive musklick. Skapa därför en abstract klass AbstractScorePanel som innehåller allt som är gemensamt och låt StandardScorePanel och RobotScorePanel ärva denna. Låt den abstrakta klassen implementera EventBus.IEventHandler. Diskutera ev. med handledare innan du börjar (du har väl en backup på allt...?) Se till så att man inte kan skriva i cellerna då man använder RobotScorePanel. RobotScorePanel skall använda en inre klass som muslyssnare (en Mouse- Adapter). Lägg till i MainFrame.start(), så att man läser av från YatzyOptions om vi skall köra RobotYatzy eller ej. Om så skapas en RobotYatzy och en RobotScorePanel instans istället för Standard-instanser. Spara undan som tidigare. 15 Spara och Öppna Spel Vi vill kunna spara och öppna sparade spel. Det som sparas är spelarna och poäng tabellen för dessa. Vi sparar i en enkel textl med följande format; // Name, ordinal, then row and score and if set... Anna,0,0,3,true,1,4,true,2,0,false,3,0,false,4,0,false,5,0,... Urban,1,0,3,true,1,4,true,2,0,false,3,0,false,4,0,false,5,0,... Det som behövs i GUI-väg är klart, se metoder MainFrame.save() och open(). Gör klart klassen YatzyPlainFileReader som implementerar gränssnittet IYatzyReader. // IYatzyReader interface public List<Player> open(string filename); public void save(string filename, List<Player> players); 10 Produced with Lyx, the open source wordprocessor

Använd klassen tillsammans med YatzyReaderFactory för att implementera lhanteringen. Det nns en test, TestFileReader. 16 Användarvänlighet Det nns ett menyval View > Big font. När man väljer detta skall font-storleken öka för alla texter i GUI:et (och återställas om vi avmarkerar). Vi skall nu implementera detta. MainFrame måste implementera ItemListener, och därmed ha metoden public void itemstatechanged(itemevent e). Lägg till detta. Låt MainFrame vara lyssnare för menyvalet Big font, avkommentera i create- Menu(). Skapa en statisk metod i GUIOptions.setFont( Component c, Font f) som går igenom hela GUI:et och för alla komponenter sätter den valda fonten. Metoden blir mycket enklare om den är rekursiv (... den skall vara rekursiv). I metoden itemstatechanged i MainFrame använder ni attributet actualfont och GUIOptions.setFont() för att åstadkomma det vi vill. 17 Grak och Animation Frivillig uppgift. Det du behöver nns i paketet (mappen) yatzy.gui.fancy. Principen är att vi ersätter olika paneler med Fancy versioner av dessa, se README.txt Implementera paint()-metoden för klasserna AnimatedDiceButton och FancyRound- Button 11 Produced with Lyx, the open source wordprocessor

Appendix En bild över mappar (paket) och ler i Yatzy. Tyvärr blir det ganska många ler. De esta är dock små (lite kod) och många är helt färdiga, bara att använda. 12 Produced with Lyx, the open source wordprocessor