Projekt 1 - En Bildvisare

VARNING

På denna sida och de andra projektsidorna finns det många länkar till webbsidor som beskriver alla metoder i en klass eller klasser i ett bibliotek. Ni behöver INTE, och jag upprepar, INTE följa dom och försöka förstå allt som finns i dom. Om ni gör det kommer ni aldrig bli klara med era uppgifter (det finns inte många Java-programmerare som kan alla klasser och metoder utantill). Däremot kommer ni behöva leta igenom dom filerna för hitta dom metoder ni behöver för att kunna lösa projektuppgifterna.

Beskrivning av uppgiften

Erat första projekt är att skapa ett Java-program som visar en bild på bildskärmen. Nedan följer beskrivningar av alla komponenter ni behöver för att skapa programmet: genom att sätta ihop delarna samt att hitta rätt metoder i JLabel-klassen kan ni lösa problemet.

Det första ni behöver för att lösa uppgiften är Swing-biblioteket som ni fick med när ni installerade Java. Biblioteket innehåller en väldigt stor uppsättning klasser som motsvarar alla de saker ni är vana vid från att använda datorer, till exempel: ramar, knappar, menyer, rulllistor, bilder etc. Utöver det finns det en stor uppsättning klasser som inte syns men som används för att kontrollera programmets beteende: klasser för att upptäcka när användare skriver något på tangentbordet, rör eller klickar på musen, eller när en knapp blivit nedtryckt. Förutom Swing-biblioteket behöver ni använda er av java.net.* som gör det möjligt att ladda in bilder.

För att kunna använda sig av alla dessa klasser behöver man importera dom. Det görs på följande sätt (kodsnutten ska ligga före klassdefinitionen):

import java.net.*;
import javax.swing.*;

Som tur är behöver man inte veta vad alla klasser gör och vilka metoder de har för att göra program med grafiska gränssnitt. Här är ett exempel på en main-metod som i princip kan användas som grund för alla Java-program som använder sig av Swing-biblioteket:

    public static void main(String[] argv) {
	/*
	 * Skapa en "ram", Java-terminologi för det som kallas fönster
	 * i Windows. Observera att ramen inte syns (och inte har någon
	 * storlek) förrän dessa sätts (se sist i programmet).
	 */
	JFrame frame = new JFrame("Bildvisare");

	/*
	*
	* Här ska det objekt och variabler programmet behöver skapas.
	*
	*/

	/*
	 * Ställer in ramens egenskaper som vi vill ha den. Metoden 
	 * setDefaultCloseOperation anropar vi för att vi vill att 
	 * programmet ska avslutas när man stänger fönstret. Ett 
	 * program kan annars fortfarande köra utan att det syns på 
	 * skärmen!!!
	 */
	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	frame.pack();
	frame.setVisible(true);

    }

Om ni skapar ett program från dom två ovanstående kodsnuttarna kommer ni få ett program som endast visar en minimal ram (fönster) med namnet "Bildvisare" och det enda man kan göra (förutom att ändra storleken på fönstret) är att avsluta det.

För att visa något inuti ramen behöver ni lägga till ett objekt vars klass implementerar gränssnittet Component (från biblioteket java.awt.*) till ramen. Component-gränssnittet innehåller allt stöd som Java behöver för att kunna rita upp objektet och märka av om användaren interagerar med det. Dessutom innehåller den funktioner för att Java ska kunna få vet hur stor yta objektet vill ha på skärmen.

En av dom enklaste klasserna som implementerar Component är JLabel. Den används för att visa en text eller en bild (kallad "icon" i Java-terminologi). Exempel på användande:

	JLabel label = new JLabel();
	label.setText("Hello World!");
Detta skapar en label men för att den ska synas i programmet måste den läggas till i ramen (eng. Frame) som skapades i main-metoden ovan. Detta görs genom ett anrop till metoden setContentPane:
	frame.setContentPane(label);

Det enda mer ni behöver för att kunna lösa uppgiften är att läsa in en bild från en webbaddress och sätta en label så den ska visa bilden. Hur man sätter er label att visa en bild får ni själva lösa genom att gå igenom de metoder som finns i JLabel, men att läsa in en bild görs på följande sätt:

      URL iconURL = null;

      try{ 
       iconURL = new URL("http://www.comics.com/comics/dilbert/archive/images/dilbert20365801030121.gif");
       }
      catch(MalformedURLException e) {}
      
      ImageIcon icon = new ImageIcon(iconURL);

I exemplet ovan laddas en bild med en skämtteckning (Dilbert). Detta görs genom att vi först deklarerar en URL (Uniform Resource Locator, en webbadress), och säger att den för närvarande är ingenting (null). Därefter försöker vi att skapa en ny URL. Detta kan misslyckas, om vi lyckas skriva något konstigt som inte är en giltig webaddress. Vi försöker (try) alltså skapa en URL, och fångar felet MalformedURLException, men gör inget åt det ({}). Om vi har angivit en felaktig URL, så kommer vi få ett körningsfel, ett NullPointerException (vi försöker använda något som inte har ett värde). Vi kan testa om vår variabel iconURL har något värde innan vi använder det genom att skriva:

   // Om iconURL inte (!=) är lika med null
   if (iconURL != null){
    ImageIcon icon = new ImageIcon(iconURL);
    ...
   }
   else{
    //Här skriver vi vad vi skall göra om iconURL är lika med null.
   }

Redovisning

När ni har ett fungerande program, valt bra variabelnamn, kommenterat er kod skall ni dels få ett körningsgodkännande (ni skall visa en körning av ert program för mig och berätta kortfattat vad ni har gjort) och även skickat källkoden (filerna som slutar med *.java) till mig (markus@cs.chalmers.se).

Lycka till!

/Markus