bild
Skolan för
elektroteknik
och datavetenskap

Laboration 1

Förberedande uppgifter

Kösystemet Sima för hjälp och redovisning

Vi använder Sima för kö till hjälp och redovisning. Välj prutt i Sima. Om du inte använt Sima tidigare så fråga någon av lärarna.

Underkatalog för kursen

Detta bör vara självklart för alla: Skapa en egen katalog för kursen där varje labb får en underkatalog (som vid behov själva ges underkataloger).

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. De första 3 föreläsningarna + första övningen går igenom det som behövs.

Mål

Att få grundläggande förståelse för Javas grafiska komponenter, fristående grafiska program, händelser & lyssnare, applets och paket.

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.
  • Skapa och köra enkla applet-program.
  • Göra den enklaste formen av paket.
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 men 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.
Alla initieringar av fönstret ska göras i den nya klassens konstruktor!
Se till att författarnas namn står i fönstret. 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 ifö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 flera (minst två) knappar och lägg i fönstret. Provkör! Kontrollera att knapparnas tillstånd ändras oberoende av varandra.

Uppgift 5 – En applet

Skriv ett Applet-program med samma funktionalitet som 4B, dvs visar minst två knappar som man kan trycka på oberoende av varandra. Samma klass MyButton ska förstås användas här. För att köra en applet behövs en html-fil. Här är en minimal sådan:

<applet code = Labb1.class width = 300 height = 150></applet>

Labb1.class är den kompilerade versionen av Labb1.java Programmet körs i ett fönster som är 300 pixlar brett och 150 pixlar högt. Appletprogram kan köras på webbsidor eller i appletviewer som startas från ett terminalfönster. I en IDE (utvecklingsmiljö) kan applets köras på andra sätt. Även om slutdestinationen för ett applet-program är en webbsida så använder man helst appletviewer under testfasen.

appletviewer Labb1.html
Här kör vi appleten Labb1.class som är den kompilerade versionen av Labb1.java i ett fönster som är 300 pixlar brett och 150 pixlar högt.

Uppgift 6 – Liten paketövning

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 7 – Rita UML-klassdiagram

över knappkomponent, applet 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

Visa upp, provkör och och förklara följande:

  • Knappkomponenten enligt 4B i ett eget paket
  • Minst två objekt av komponenten i ett fristående fönster.
    Gruppmedlemmarnas namn ska synas i fönstret.
  • Minst två objekt av komponenten i en applet.
  • Ett UML-klassdiagram över alla klasser som används och hur de hänger samman.
    Endast klassnamn behöver stå i UML-rutorna, inga metoder eller variabler alltså.
Visa hur knapptryckningar ändrar knappobjektens tillstånd.

När handledaren är nöjd, be om hans/hennes underskrift på ditt kvittensblad!
Kvittensbladet finns för utskrift på kurshemsidan under Laborationer.

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 sin "omvärld".
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–vektor 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

Visa upp, provkör och och förklara följande:

  • Progam enligt specifikationen ovan.
  • UML-diagram med endast klassnamn.

Be om underskrift på kvittensbladet.

Copyright © Sidansvarig: Ann Bengtsson <ann@nada.kth.se>
Uppdaterad 2014-03-23