Helsingin yliopisto / Tietojenkäsittelytieteen laitos / 581258-1 Johdatus ohjelmointiin
Copyright © 1997 Arto Wikla. Tämän oppimateriaalin käyttö on sallittu vain yksityishenkilöille opiskelutarkoituksissa. Materiaalin käyttö muihin tarkoituksiin, kuten kaupallisilla tai muilla kursseilla, on kielletty.

6.1 Sovelma (Java 1.0.2)

(Muutettu viimeksi 8.12.1997)

Sovelmia esitellään käyttäen Javan versiota 1.0.2, koska Netscape® Communicator 4.04 -selain (käytössä mm. laitoksen Linux-järjestelmässä) ei osaa Javan versioita 1.1.*.

Idea

Sovelma (applet) on WWW-sivulla suoritettava ohjelma. Sovellus (application) on se jo tutuksi tullut main-metodilla käynnistyvä "tavallinen ohjelma". Sovelma on Bytecode-välikielelle käännetty ohjelma, class-tiedosto, joka ladataan verkosta WWW-sivun osaksi. WWW-selain tulkitsee sovelman.

Sovelma voi olla melkein mikä tahansa Java-ohjelma. Turvallisuussyistä sovelman toimintamahdollisuudet ovat kuitenkin sovellusta rajoitetummat (selainkohtaisia eroja voi olla):


Laaditaan pikku sovelma maailman tervehtimiseen (HoiSovelma.java):
import java.awt.Graphics;

public class HoiSovelma extends java.applet.Applet {
  public void paint(Graphics g) {
     g.drawString("Hoi maailma!", 10, 50);
  }
}
Sovelman paint-metodiin ja java.awt.Graphics-luokkaan tutustutaan kappaleessa 6.2.

Ja sitten kirjoitetaan WWW-sivu html-kielellä (HoHoi.html)

<html>
<head>
<title>HoHoi!</title>
</head>
<body>
Sovelmani sanoo:
<br>
<APPLET CODE="HoiSovelma.class" WIDTH=250 HEIGHT=70>
Selain ei ymmärrä Javaa!
</APPLET>
<p>
Siinä se tuli, jos tuli!
</body>
</html>

Ja tältä sovelma näyttää WWW-sivulla:
-----------------------------------------------
Sovelmani sanoo:
Selain ei ymmärrä Javaa!

Siinä se tuli, jos tuli!

-----------------------------------------------

Sovelma on tapahtumaohjattu

Sovelmalla ei ole itsellään mitään pääohjelmaa. Sovelmaa suorittava selain on tavallaan "pääohjelman" asemassa. Sovelman toimintatapa on ns. tapahtumaohjattua (event driven): Sovelman tapahtumiin reagoivat metodit ovat ns. tapahtumankäsittelijöitä (event handlers).

Sovelman graafinen käyttöliittymä (GUI) toteutetaan pakkauksen java.awt tarjoamin välinein (Button, Checkbox, TextField, TextArea, List, Choice, Scrollbar, ...).

Sovelman elinkaari

Sovelman elinkaaren tärkeimmät tapahtumat ovat: Selain siis aiheuttaa kaikki nämä tapahtumat sovelmalle! Alustaminen ja lopettaminen tapahtuvat vain kerran, käynnistyminen ja pysähtyminen voivat tapahtua moneen kertaan. Esimerkiksi animaatiota näyttävän sovelman voi olla järkevää lopettaa animointi, kun sivua ei katsella. Jotakin raskasta laskutoimitusta tekevä sovelma sensijaan voisi tehdä hommiaan vaikkei sitä koko ajan vahdittaisikaan.

Luokka Applet - kaikkien sovelmien yliluokka - määrittelee nuo tapahtumiin reagoivat metodit tyhjinä. Siksi selain voi kaikille sovelmille nuo tapahtumat aiheuttaa, mutta oletusarvoisesti sovelma ei niihin reagoi.

Sovelma voi korvata (override) metodit omillaan, jos reagointia halutaan.

Esimerkissä HoiSovelma yllä ei tarvittu mitään reagointeja noihin tapahtumiin, senkuin vain tulostettiin teksti.

Esimerkki Mary Campionen ja Kathy Walrathin teoksesta " The Java Tutorial" (Simple.java):

Sovelma tulostaa tapahtumia sekä kenttäänsä että standarditulosvirtaan, joka näkyy Netscapessa ns. Java-konsolilla (valitse "Communicator/Java Console").

import java.applet.Applet;
import java.awt.Graphics;

public class Simple extends Applet {

  StringBuffer buffer;

  public void init() {
    buffer = new StringBuffer();
    addItem("initializing... ");
  }

  public void start() {
    addItem("starting... ");
  }

  public void stop() {
    addItem("stopping... ");
  }

  public void destroy() {
    addItem("preparing for unloading...");
  }

  void addItem(String newWord) {
    System.out.println(newWord);
    buffer.append(newWord);
    repaint();
  }

  public void paint(Graphics g) {
    //Draw a Rectangle around the applet's display area.
    g.drawRect(0, 0, size().width - 1, size().height - 1);

    //Draw the current string inside the rectangle.
    g.drawString(buffer.toString(), 5, 15);
  }
}


You can't run applets.


Huom: Java-konsoli ei ole normaali väline sovelmien tulostiedoille. Konsoli on vain testausväline.

Sovelman liittäminen html-sivulle

Html-sivujen muoto (se on dynaaminen!) määritellään elementteinä: kappaleina, otsikoina, taulukkoina, ..., jotka ilmaistaan ns. tunnisteiden (tag) avulla.

Sovelma sijoitetaan html-sivulle ns. <APPLET>-tunnisteella. Aloitustunnisteeseen kirjoitetaan sovelman tietoja:

<APPLET CODE="HoiSovelma.class" WIDTH=250 HEIGHT=70>
Tämä teksti tulostetaan, jos selain ei ymmärrä Javaa.
</APPLET>

<APPLET>-tunnisteeseen voidaan koodiviitteen lisäksi liittää muitakin määreitä, mm.: <APPLET>- ja </APPLET>-tunnisteiden väliin voidaan kirjoittaa virheilmoitusteksti, joka tulostuu, jos selaaja ei ymmärrä sovelmia. Samaan väliin voidaan myös lisätä <PARAM>-tunnisteita, joilla sovelmalle voidaan www-sivulta antaa parametreja:
<APPLET CODE="XSovelma.class" 
       
CODEBASE="http://www.cs.Helsinki.fi/~wikla/JohdOhj/Sisalto/6/"
          WIDTH=300 HEIGHT=100>
        
<PARAM name="Teksti" value="HiioHei">

Selain ei ymmärrä Javaa!
</APPLET>

Parametrien arvoja voidaan lukea getParameter(merkkijono)-metodilla:
import java.awt.Graphics;

public class XSovelma extends java.applet.Applet {

  String teksti;
   
  public void init() {
    teksti = getParameter("Teksti");
  }

  public void paint(Graphics g) {
     g.drawString(teksti, 10, 50);
  }
}

Tuo html-määrittely ja sovelma näyttävät tältä:

Selain ei ymmärrä Javaa!



Sovelma voi tutkia selaimelta saamaansa tulostusalueen kokoa ilmauksilla:

this.size().width
this.size().height

Esimerkki:
import java.awt.Graphics;

public class XSovelma2 extends java.applet.Applet {

  String teksti;
   
  public void init() {
    teksti = getParameter("Teksti");
  }

  public void paint(Graphics g) {

    int leveys  = this.size().width;
    int korkeus = this.size().height;

    g.drawRect(0,0, leveys-1, korkeus-1); 
    g.drawString(teksti, 7, 14);
  }
}

Testataan sovelmaa seuraavilla html-määrittelyillä:

<APPLET CODE="XSovelma2.class" WIDTH=210 HEIGHT=100>
<PARAM name="Teksti" value="210x100">
Selain ei ymmärrä Javaa!
</APPLET>

<APPLET CODE="XSovelma2.class"  WIDTH=100 HEIGHT=70>
<PARAM name="Teksti" value="100x70">
Selain ei ymmärrä Javaa!
</APPLET>

<APPLET CODE="XSovelma2.class" WIDTH=50 HEIGHT=30>
<PARAM name="Teksti" value="50x30">
Selain ei ymmärrä Javaa!
</APPLET>

<APPLET CODE="XSovelma2.class" WIDTH=60 HEIGHT=200>
<PARAM name="Teksti" value="60x200">
Selain ei ymmärrä Javaa!
</APPLET>

Tulos näyttää tällaiselta:
Selain ei ymmärrä Javaa! Selain ei ymmärrä Javaa! Selain ei ymmärrä Javaa! Selain ei ymmärrä Javaa!


Takaisin luvun 6 sisällysluetteloon.