UU | IT | OOP med Java våren 2025

Uppgift 3 - Cirkelgång


Den här uppgiften kräver kunskaper i Swing och programmering av grafiska användargränssnitt. Du bör ha läst avsnitt 6 och 7 (och löst några övningsuppgifter) innan du sätter igång.

De avsnitt i anteckningarna som är särskilt relevanta för uppgiften är:

Din uppgift är att skriva ett grafiskt program som gör det möjligt att manipulera ett antal cirklar. Illustrationen nedan ger en skärmbild för en tänkbar lösning.

(De fyra fyrkanterna uppe i vänstra hörnet används för att välja färg. )

Denna uppgift ska lösas genom att cirklarna ritas upp med en metod paintComponent(), definierad i lämplig klass. Du ska inte behöva inte använda särskilt många klasser i Swing, det ska räcka med klasserna JFrame och JPanel. Dessutom behöver du en del funktionalitet från AWT: klasserna Color och Graphics samt klasser och gränssnitt för musinteraktion.

Du ska alltså inte låta cirklarna bli en del av Swing-hierarkin. Den klass som representerar cirklarna ska alltså inte ärva av någon klass i Swing-biblioteket. Du ska istället rita upp dem med paintComponent(), ungefär som i de exempel jag visar på i avsnitt 7.

Klassen som representerar cirklar ska hantera allt som rör cirklar: att kolla om ett musklick är på en cirkel, flytt av cirklar, ändra storlek på en cirkel samt uppritning av cirklar.

Val av färg

Det ska finnas något sätt att välja färg på de cirklar som skapas. Det ska gå att välja mellan minst fyra färger.

Det finns flera sätt att välja färg. Du får själv välja vilken lösning du använder (men förklara din lösning i rapporten).

Nya cirklar

Det ska gå att skapa nya cirklar (av vald färg) genom att klicka på någon tom plats i fönstret.

Ändring av storlek

Genom att klicka på kanten av en cirkel och sedan dra musen ska användaren kunna öka eller minska diametern på cirkeln.

Flytt

När användaren placerar musen över en cirkel (men inte vid kanten av en cirkel), håller ner knappen och drar musen ska cirkeln flytta sig.

Animering

Förflyttningar ska alltså vara animerade. När användaren placerar musen över en cirkel, håller ner knappen och drar musen ska cirkeln flytta sig.

När ett cirkel flyttas ska det förstås ske i en kontinuerlig rörelse, utan hopp eller liknande. Ett enkelt sätt att lösa detta är att helt enkelt rita om alla cirklar varje gång en cirkel flyttar sig. Det fungerar inte så bra om man har mängder av cirklar, men är acceptabelt för denna uppgift.

Överlapp

Om en cirkel delvis täcker en annan och man klickar på området som båda cirklarna täcker ska den senast flyttade cirkeln (som ser ut att ligga överst) flyttas eller ändra storlek.

Till exempel: På bilden ovan överlappar den gula och den blå cirkeln. Eftersom den gula cirkeln ser ut att ligga överst väljs den i första hand, men man kan välja den blå cirkeln genom att klicka på den inom det område som ej täcks av den gula.

Tips

Om att hitta en lösning

Det kan vara idé att bygga upp lösningen efter hand. Några olika sätt att börja:

Flytt av cirklar

Låt oss betrakta problemet i en dimension. Centrum av en cirkel befinner sig vid position a. Cirkeln har radie r.

Om man klickar vid position x, där a-r < x, men x<a+r, registreras klicket som ett klick på cirkeln. Avståndet mellan klickets position och cirkelns början är f. Vi har alltså att f=x-a. Man kan även skriva a+f=x, eller a=x-f.

Om vi nu flyttar musen till position x1 ska cirkeln flyttas, men relationen mellan musens position och cirkeln vara detsamma. Vi vill alltså att cirkeln hamnar på position a1, där a1+f=x1.

Du måste förstås lösa detta i två dimensioner.

En liten film

Här hittar du en liten film som kanske kan vara till hjälp.

Notera att de svarta ringarna som visas skapades av programmet som jag använde för inspelningen. De visar var jag klickade. Din lösning behöver inte rita dem.