Göm menyn

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

Här finns ett förslag på hur upplägget i laborationen kan se ut (kommer tillbaka efter LE2).

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.
TIPS: Använd inte Buttons till färg-knapparna. Då är det svårt att få det exakt så snyggt som man vill ha. Gör en egengjord komponent istället (se exempel från föreläsning) som håller reda på nuvarande vald färg.


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.
TIPS: Använd inte Button till form-knapparna. Då är det svårt att få det exakt så snyggt som man vill ha. Gör en egengjord komponent istället (se exempel från föreläsning) som håller reda på nuvarande vald form.



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