TDDE10 Objektorienterad programmering i Java
Ritprogrammet
Syfte
Huvudsyftet med denna labb är att öva på objektorientering och att göra ett grafiskt gränssnitt. Fokus bör ligga på att dela upp problemet i lämpliga klasser som representerar de olika objekt som behöver finnas för att lösa problemet.
Problembeskrivning
Året är 1995 och mjukvaruföretaget Orange Corp. vill att deras senaste operativsystem skall komma med ett förinstallerat program "Ritprogrammet". Programmet riktar sig till barn i åldern 6-12 år. De har följande minimikrav på programmet:
- Programmet skall ha en rityta och olika ritverktyg.
- Man skall kunna rita ut olika former (åtminstone cirklar, kvadrater och trianglar).
- Man skall kunna rita ut former i olika färger (åtminstone 8 färger).
- Man skall kunna "rensa" bilden (om man vill börja om från början).
- Man skall kunna "ångra" senaste formen/formerna man ritade ut genom att trycka på ångra-knappen.
- Man skall kunna spara sina bilder på fil för att sedan öppna upp dem i programmet (frivilligt).
JavaFX
JavaFX är det grafikbibliotek vi använder i laborationen samt i projektet. För hjälp med installation, hur man får det att fungera i Eclipse, etc. hänvisar vi till "JavaFX-referens" under kursmaterial i menyn till vänster.
Förslag till klassdiagram
Del A: Grundläggande funktionalitet
Skapa lämpliga klasser för att få upp ett fönster med titeln "Välkommen till Ritprogrammet!". I detta fönster skall man kunna rita ut svarta (ifyllda) cirklar genom att klicka med musen. Det rekommenderas starkt att man separerar ritytan från modellen (d.v.s. den klass som håller reda på cirklarna). Vi vill alltså skilja på datalagring och funktionaitet. Ritytan ska själv få bestämma hur den skall ritas ut, men kommer då behöva hämta data från modellen. Det skall även finnas en panel längst ner i fönstret med knapparna för "rensa" och "ångra". När "rensa"-knappen trycks på skall allt i ritytan försvinna, och när "ångra"-knappen trycks på skall den senast utritade cirkeln/formen försvinna. I synnerhet "ångra" ställer krav på hur vi representerar data i modellen. Diskutera gärna era tankar kring detta med din assistent innan ni kommer allt för långt med själva programmeringen.
Du får själv välja storleken på fönstret och storleken på cirklarna.
Krav
Observera att "Modell-klassen" är ett absolut krav. Vi vill sköta datalagringen separat från funktionaliteten som ritytan har.
- Du skall använda dig av JavaFX-klasserna VBox, Canvas och Button.
- Du får inte använda dig av JavaFX-klasserna Rectangle, Polygon eller Circle, utan du skall skapa en egen klass för att representera cirklarna. Det är cirkelklassen som skall bestämma hur den själv ritas ut (du får dock givetvis använda vilka metoder du vill i ditt GraphicsContext-objekt).
- Ritytan, modellen (d.v.s. det data som "bilden" består) och panelen med knappen skall vara tre separata klasser.
- Cirklarna skall dyka upp "mitt under" muspekaren då man klickar.
Del B: Ändra Färg
Du skall nu lägga till en panel på ena sidan om ritytan där användaren kan välja färg på cirklarna (genom att klicka på den färg som önskas). Det kan vara lämpligt att ha två klasser för detta, en för själva sidopanelen och en för färgväljarkomponenten inuti.
Krav
- Du skall ha minst 8 färger.
- Det skall vara tydligt vilken färg som för nuvarande är vald.
- Om man senare vill lägga till färger till programmet så skall man endast behöva modifiera denna (eller dessa) klasser.
Del C: Ändra Form
Du skall nu läga till en till komponent där användaren kan välja vilken form som skall ritas ut då man klickar på ritytan. Ett hett tips är att nu skapa en klasshirarki av formerna. Skapa en abstrakt superklass för formerna och låt de övriga formerna ärva och överskugga lämpliga metoder.
Krav:
- Formväljarkomponenten skall representeras med en egen klass.
- Du skall åtminstone ha formerna cirkel, kvadrat och triangel, men får ha fler om du vill. Observera att du, likt Cirkeln, inte får använde JavaFX-klasserna Rectangle, Circle, Polygon, osv. till att representera dina former utan du måste göra egna klasser. Utritningsfunktionen för de respektive formerna skall ej ta emot färg, x- och y-koordinat, det bör varje form ha lagrat internt.
- Det skall vara tydligt vilken form som för nuvarande är vald.
- Om man senare skulle vilja lägga till en till form till programmet så skall man endast behöva modifiera klassen för formväljarkomponenten.
Del D (frivillig men bonusgivande): Spara/Öppna
Avslutningsvis skall du lägga till knappar för att spara och öppna filer i ditt program. Obs: du behöver inte spara datat som ett bildformat (t.ex. .png, .jpg m.fl) utan det räcker att spara på ett format som ritprogrammet klarar av att läsa. När en fil öppnas så ersätts eventuellt innehåll på ritytan med det som lästes från filen.
För att kunna spara ner färger behöver de vara serializable. För att lösa det behöver man skapa en wrapper-klass till Color-klassen. Ni kan också använda en färdigskapad gjord av oss. Den hittar ni här.
Krav:
- Du skall använda dig av de inbyggda klasserna ObjectOutputStream och ObjectInputStream för skrivning/läsning till fil.
- Du skall använda dig av den inbyggda klassen FileChooser för att låta användaren välja vilken fil som skall sparas/öppnas.
Klar att redovisa?
När du gjort del A-C ovan kan du redovisa laborationen. Kolla checklistan nedan så att du fått med allt!Checklista för inlämnat material:
- Är materialet inlämnat i tid?
- Är alla delar inlämnade?
- Följer koden kodstandarden? Avvikelser ger rest.
- Är koden enhetligt indenterad? Slarvig indentering ger omedelbart rest.
- Är koden kommenterad enligt kodstandarden?
- Används inkapsling? Om det finns fall där instansvariabler accessas utanför klassen ger det omedelbart rest.
- Uppfyller programmet kravspecifikationen?
- Används klasshirarkier? Om inte, har ansvar hamnat på rätt ställe i koden och har fullständiga uppräkningar undvikits?
- Är programmet "lätt" att utöka med nya färger/former?
Sidansvarig: Magnus Nielsen
Senast uppdaterad: 2024-02-15