Nada

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 {
       - - -                         }

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 anropar den först appletens init() och sedan dess 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.*; 

public class DinSon extends Applet                                 {
  TextField namn=new TextField(14)                                 ;
  public void init()                                               {
    add(new Label("Och si, din son ska heta..."))                  ; 
    add(new Label("Ja, vad heter du själv, förresten?"))           ; 
    add(namn)                                                      ;}
  public boolean action(Event e, Object arg)                       {
    add(new Label("Si, din son ska heta "+namn.getText()+"sson!")) ;
    validate()                                                     ;
    return true                                                    ;}}
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 action 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. Ändra talet och tryck retur!

import java.awt.*; 
import java.applet.*; 

public class Stars extends Applet                                  {
  TextField antal=new TextField(3)                                 ;
  TextField stjärnor =new TextField(30)                            ;
  public void init()                                               {
    add(new Label("Antal stjärnor:"))                              ; 
    add(antal)                                                     ;
    add(stjärnor)                                                  ;}
  public boolean action(Event e, Object arg)                       {
    int n=Integer.parseInt(antal.getText())                        ;
    String stars=""                                                ;
    for(int i=0;i<n;i++) stars+="*"                                ;
    stjärnor.setText(stars)                                        ;
    return true                                                    ;}}

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å användaren henriks hemsida och att den behöver läsa filen word3 på 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 Fan extends Applet                                    {
  - - -
    try                                                            {
      URL word3 =new URL("http://www.nada.kth.se/~henrik/word3")      ;
      BufferedInputStream ordfil                                   ;
      ordfil=new BufferedInputStream(word3.openStream())           ;
      /*Nu kan vanliga Mio.GetLine(ordfil) etc användas*/}
    catch(Exception e)                                             {
      showStatus("Fel:"+e)                                         ;}
Felhantering try, catch och Exception kommer att behandlas i föreläsning 17. Mera tips om hur man gör om labb 7 till en applet finns i filen fanapplet på kursbiblioteket. Om du inte följande applet fungerar i din webbläsare bör du läsa den filen.

Sidansvarig: <henrik@nada.kth.se>
Senast ändrad 18 mars 1999
Tekniskt stöd: <webmaster@nada.kth.se>