Föreläsning 13: Fönster, knappar och appletar

Javaprogram kontra appletar

Ett javaprogram som ritar fönster och knappar på skärmen och en javaapplet som ritar på en webbsidan är på sätt och vis varandras motsatser. Javaprogrammet innehåller alltid main() som kanske anropar klassen Button. Observera att Button skrevs flera år före main(). Appleten innehåller inte något huvudprogram main() - huvudprogrammet finns ju i Netscape eller annan webbläsare. Appleten anropas alltså av ett program som kan ha skrivits flera år tidigare!

Hur skriver man anrop till en ännu inte påtänkt applet? Eftersom Java är ett objektspråk har man löst det så att en class Applet får finnas med i standardbiblioteket. Denna applet ritar inget och gör ingenting, så för att något roligt ska hända måste ens egen applet lägga till extra satser som inte finns i originalet. Det uttrycks på följande sätt

   public class Stars extends Applet {
	// Innehåll...
   }

Internet och webben

Världens datorer är sammankopplade med koppartrådar, optiska fibrer och radiolänkar till ett väldigt fysiskt nät. En lokal del av detta nät ser till att vi kommer åt våra egna filer vilken dator vi än loggar in på. I själva verket finns filerna på ett skivminne inne hos systemarna och en särskild dator kör kontinuerligt ett filserverprogram, som på begäran levererar dina filer till den dator du för tillfället kör på.

Liknande serverprogram levererar webbsidan till ditt Netscapeprogram, när du begär en webbadress. Det finns även epostservrar för epostdistribution, newsservrar för nätnyttsdiskussioner, namnservrar som översätter datoradresser av typen henrik.nada.kth.se till internetadresser av typen 130.237.222.96 och så vidare.

Den som vill lägga upp en hemsida måste kalla den för index.html och lägga den i sin Public-katalog. Webbsidan kommer då att ha adressen http://www.e.kth.se/~e98_ama/ (i alla fall om du är e98_ama). Surfa runt ett tag och kopiera sedan en sida du gillar. Så gör alla andra också! Om du vill ha in din applet på sidan får du någonstans i filen index.html lägga in följande rad.

<APPLET CODE="DinSon.class" WIDTH=250 HEIGHT=150> </APPLET> 
Inget hindrar förresten att filen består av endast denna rad, men det kan verka lite väl spartanskt.

Appletar

Klassen Applet gör ingenting, men den har i alla fall några inbyggda anrop, nämligen init(), start(), stop() och destroy() (som inte heller gör någonting). När Netscape laddar in en ny sida med en applet skapar den först ett objekt av appletklassen. I den nyaskapade appleten används sedan först appletens init() följt av start(). Om man sedan bläddrar bort sidan anropas stop() och när den sedan tas fram anropas start() igen. Man får tänka på det, så att man lägger sina satser på rätt ställe. Här har vi nu en enkel applet. Skriv ditt namn och tryck retur! Ändra namnet och tryck igen!
import java.awt.*; 
import java.applet.*;
import java.awt.event.*; 

public class DinSon extends Applet implements ActionListener {
    TextField namn;
    Label svar;

    public void init() {
        add(new Label("Och si, din son ska heta..."));
        add(new Label("Ja, vad heter du själv, förresten?"));
        namn = new TextField(14);
        namn.addActionListener(this);
        add(namn);
        svar = new Label("                                             ");
        add(svar);
    }
    
    public void actionPerformed(ActionEvent ae) {
        svar.setText("Si, din son ska heta "+namn.getText()+"sson!");
        validate();
    }
}

Man använder Label för textutskrifter och TextField för textinmatning. Netscape gör init()-anropet när sidan laddas in och sedan gör den ett anrop till actionPerformed() varje gång användaren bidrar med lite action, som att trycka retur i ett textfält eller klicka med musen på en knapp. Det är ibland nödvändigt att anropa validate() för att få appleten att upptäcka att den har ändrat utseende och bör rita om sej.

Nu gör vi en applet som läser in ett heltal. Det är klart värre. Hur skulle man göra det?

Vad appletar inte får göra

Appleten är ett program som hämtas utifrån och körs på den egna datorn. Det skulle kunna vara ett ondsint datavirus och därför tillåter inte Netscape att appleten gör något som skulle kunna ha oönskade följder. Appletar får varken läsa eller skriva filer på användarens dator, och det låter som en allvarlig begränsning. Det är det också, men den kan i alla fall läsa filer från den webbadress där den just hämtats.

Anta att appleten finns på någons hemsida och att den behöver läsa filen ord.txt i samma katalog. En webbadress heter också URL (uniform resource locator) och det finns en användbar klass java.net.URL, som kan användas så här.

import java.io.*; 
import java.net.*; 
import java.awt.*; 
import java.applet.*; 

public class FilApplet extends Applet {
    // En massa andra metoder...

    public void init() {
        try {
            URL url = new URL(getCodeBase(), "ord.txt");
            BufferedInputStream ordfil;
            ordfil = new BufferedInputStream(url.openStream());
            // Här finns vanliga Mio.getLine(ordfil) etc. T ex
            add(new Label("Första raden:" + Mio.getLine(ordfil)));
        }
        catch(Exception e) {
            add(new Label("Fel:" + e));
        }
    }
}

Felhantering try, catch och Exception kommer att behandlas i föreläsning 17.

^ Upp till kurssidan.


Sidansvarig: <vahid@nada.kth.se>
Senast ändrad 30 september 2003
Tekniskt stöd: <webmaster@nada.kth.se>