Labb1_H20
Laboration 1 - En liten knappkomponent
Uppgiften i labben är ganska liten men för den som är Java-nybörjare är det mycket nytt som kan vara svårt. Föreläsning F1 och F2-självstudier samt första övningen går igenom det som behövs. Titta särskilt på övningen för att hitta liknande exempel på grafik och lyssnare!
Mål
Att få grundläggande förståelse för Javas grafiska komponenter, fristående grafiska program, händelser och lyssnare.
Innehåll
- Skapa och köra enkla fristående grafiska program.
- Använda grafikbibliotek.
- Göra en egen grafisk komponent genom att bygga på en komponent från ett grafikbibliotek.
- Implementera knapptryckning, att "något händer" när man trycker på en knapp.
Uppgiften har detaljerade instruktioner i steg. Den som tycker uppgiften är lätt behöver inte göra alla steg. Ni ska redovisa program från och med uppgift 4B. Läs igenom instruktionen så att ni får med allt som krävs. Gör det som behövs från de tidigare stegen och se till att ni kan svara på frågor om alla deluppgifter.
Uppgift 1 – Gör ett fristående javaprogram
Skriv ett program som öppnar ett fristående fönster med ram på datorskärmen. Gör det genom att skriva en klass som ärver från biblioteksklassen JFrame
.
Se till att författarnas namn står i fönstret, t.ex. genom att de står i ramen som fönstrets titel. Andra alternativ finns. Ge fönstret en snygg bakgrundsfärg. Följande metodanrop i konstruktorn åstadkommer att programmet avslutas när man stänger fönstret:
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Prova först utan denna rad, man kan enkelt kommentera bort den. Hur avslutas programmet då?
Uppgift 2 – Skapa en utvidgad knappkomponent med två tillstånd
Skapa en klass MyButton
som ärver från JButton
. Knappen ska ha två olika tillstånd. Låt tillstånden representeras av färg och text på knappen. Det behövs alltså två färger och två texter för varje knapp. Knappens aktuella tillstånd ska synas genom dess bakgrundsfärg och text på knappen. Knappens konstruktor bör ha huvudet
MyButton(Color c1, Color c2, String s1, String s2)
Definiera en metod toggleState()
i MyButton
. Toggle brukar betyda att man växlar mellan två tillstånd. Metoden ska ändra knappens tillstånd, alltså byta både färg och text till den andra. Så här kan det se ut när man skapar objekt av MyButton
new MyButton(Color.white, Color.cyan, "On", "Off")
new MyButton(Color.green, Color.red, "Run", "Stop")
Uppgift 3 – Knapp i fönstret
Utvidga uppgift1-programmet så att en knapp (eller några knappar) från uppgift 2 läggs i fönstret. Använd metoden add(...)
i JFrame
. Kör programmet och tryck på knappen. Tyvärr händer inget.
Uppgift 4 – Knapp att trycka på
del A: För att en knapptryckning ska ha effekt måste det finnas ett lyssnarobjekt som lyssnar på knappen. Lyssnarobjektet ska vara av en klass som implementerar interfacet ActionListener
vilket innebär att klassen har metoden
public void actionPerformed(ActionEvent e) { ... }
Låt ramklassen (den som ärver från JFrame
) implementera ActionListener
och låt dess actionPerformed()
anropa toggleState()
. Kom ihåg att koppla lyssnarobjektet till knappen! Kontrollera att det fungerar!
del B: Tag bort lyssnaregenskapen från fönsterklassen (eller tag en kopia så att ni har kvar båda versionerna). Låt istället knappkomponenten lyssna på sig själv, alltså låt MyButton
implementera ActionListener
och ha metoden public void actionPerformed(ActionEvent e)
som anropar toggleState()
. Skapa minst två knappar och lägg i fönstret. Provkör! Kontrollera att knapparnas tillstånd ändras oberoende av varandra. Ett alternativ till att ändra i klassen MyButton
är att skapa en ny klass som ärver från MyButton
och har egenskapen att den lyssnar på sig själv och togglar sitt tillstånd.
Uppgift 5 – Liten paketövning — frivillig
I labb4 så ska paket användas för att åstadkomma en viss funktionalitet i en designprincip. Då måste du kunna hantera paket. Beskrivningen nedan stämmer inte precis om du använder en IDE (utvecklingsmiljö). Se till att du kan göra paket när det är dags för labb 4!
Ett paket definieras av en underkatalog. Välj ett paketnamn, gör en underkatalog med det namnet och lägg knappklassen MyButton
där. Skriv lämpliga package
och import
överst i inblandade javafiler så att det hela fungerar igen. Hur gör man paket? Läs här!
Uppgift 6 – Rita UML-klassdiagram
över knappkomponent och fristående program. Alla klasser (nya och från bibliotek) ska vara med men det räcker att skriva klassernas namn i rutorna. Inga detaljer om insidorna, dvs metoder och variabler, behövs. Rita gärna diagrammet innan programmen skrivs.
Att redovisa för grunduppgift
- Knappkomponenten enligt 4B.
- Minst två objekt av komponenten i ett fristående fönster.
Gruppmedlemmarnas namn ska synas i fönstret. - Ett UML-klassdiagram över alla klasser och interface som används och hur de hänger samman.
Endast klass- och interfacenamn behöver stå i UML-rutorna, inga metoder eller variabler alltså. Superklasser till biblioteksklasser ska inte tas med i diagrammet. Det gäller t.ex. superklasser till JButton och JFrame.
Extrauppgift för högre betyg
Mål:
- Att få en ökad förståelse för händelser och lyssnare, hur en knapptryckning kan påverka "omvärlden".
- Att kunna ge indata till ett fristående program via kommandoraden.
Uppgift
Skriv ett program som liknar grunduppgiftens med ett fristående fönster och knappar. Antalet knappar ska anges på kommandoraden när programmet startas, t.ex. om man vill ha sex st knappar:
java labb1X 6
Knapparna ska ha olika texter men får ha samma färger. Programmet måste kunna ta emot ett godtyckligt antal knappar men det duger att att provköra med 3–4 stycken. Ge alla data på kommandoraden, t.ex. så här
java labb1X 3 On Off Run Stop Mamma Mia
Nu ska tre knappar skapas. Den första har de två tillståndstexterna "On" och "Off", den tredje har "Mamma" och "Mia". Data från kommandoraden kommer till programmet som den String
–array som är parameter till metoden main()
. I klassen Integer
finns metoden Integer.parseInt()
som omvandlar String
till int
. Läs dokumentationen!
Programmets funktionalitet
Alla knappar ska visas i fönstret men när man trycker på en knapp ska alla andra knappar ändra utseende. Den man tryckte på ska inte ändras. Vilket av alternativen 4A och 4B för lyssnarens placering passar bäst i den här uppgiften? Kan man tänka sig en helt annan konstruktion? Programmet måste fungera för godtyckligt antal knappar. Löses t.ex. genom att använda en array
, alltså en struktur med typen MyButton[]
.
Att redovisa för extrauppgift
- Progam enligt specifikationen ovan.
- UML-diagram med endast klass- och interfacenamn.