Appletti käyntiin
Kun Nörttitesti käynnistyy, on käyttöliittymän luonnin jälkeen ensimmäinen asia kysymysten hakeminen. Lisätään init()-metodin perään kutsu omaan lataaKysymykset()-metodiin, johon voimme sijoittaa haluamamme latauskoodin. Tähän riittää, kun laitamme viimeiseksi riviksi ennen init():n loppusulkua lataaKysymykset();
.
Huomaa samalla, että lisättyämme applet-velhon kakkosruudussa appletillemme oman parametrin, on initin ensimmäiseksi osaksi ilmestynyt getParameter-kutsu, joka hakee parametrin tiedot kysymysURL-nimiseen muuttujaan, kuten määrittelimmekin.
Ennen varsinaista koodausurakkaa lisätään seuraavat rivit Applet-luokkaan JBuilderin tekemien muuttujamäärittelyjen jälkeen, mutta kuitenkin ennen ensimmäisiä metodeita:
public static final int VAIHTOEHTO_MAARA = 4;
Checkbox[] vaihtoehdot = new Checkbox[] { vast1,vast2,vast3,vast4 };
Vector kysymykset = new Vector();
int naytettyKysymys;
Ensimmäinen rivi määrittelee vakion VAIHTOEHTO_MAARA, joka kertoo vain yksinkertaisesti vaihtoehtojen määrän kysymyksessä. Sen koodaaminen vakioksi on kuitenkin hyvätapaista, koska tällöin määrän muuttaminen onnistuu ilman koko koodin selailua ja nelosten etsimistä. Toinen rivi luo taulukon Checkboxeja, joiden arvoiksi annetaan jbInitin alustamat neljä vaihtoehtoa: vast1-vast4. Tätä taulukkoa tarvitaan myöhemmin vaihtoehtojen tarkistelussa.
Lisäksi alustetaan Vector-olio, johon kysymykset varastoidaan. Vektori on taulukon kaltainen rakenne, kuitenkin sillä erotuksella ettei vektorin kokoa tarvitse määritellä etukäteen, vaan sinne voidaan lisäillä elementtejä lennossa. Viimeiseksi määritelty int kertoo, mitä kysymystä ollaan näyttämässä.
Jotta Vector-luokkaa voitaisiin käyttää, täytyy ohjelman alkuun vielä lisätä seuraava rivi:
import java.util.Vector;
Tiedot verkosta
Kun nämä muuttujat on luotu, laaditaan metodi private void lataaKysymykset()
, joka hoitaa kysymystietojen haun verkon yli ja niiden tallentamisen.
private void lataaKysymykset() {
try {
URL urli = new URL(this.getDocumentBase(),this.kysymysURL);
BufferedReader reader = new BufferedReader(new InputStreamReader(urli.openStream()));
Aloitetaan metodi kirjoittamalla koko koodi try-lohkon sisään, sillä ymmärrettävästi verkon yli haussa voi tapahtua varsin monenlaisia virheitä. Koodin toisella rivillä alustetaan URL-luokan ilmentymä "urli". Koko nimeltään URL on java.net.URL, ja sen avulla voidaan hakea tietoa Internetistä. Ensimmäiseksi parametriksi annetaan getDocumentBase()-kutsun tulos, joka kertoo, mistä päin verkkoa appletti itse ladattiin, ja toiseksi parametriksi itse kysymystiedoston nimi.
Tämän jälkeen muodostetaan java.io.BufferedReader-luokan olio, joka osaa lukea kaikentyyppisiä syöttövirtoja. Tälle annetaan parametriksi InputStreamReader-luokan olio, joka puolestaan muodostetaan lukemalla luodusta URL-oliosta openStream()-kutsulla annetusta verkko-osoitteesta lähtevä tietovirta. Hieman sekavaa, mutta kuitenkin melko helppoa: nyt BufferedReaderilla voidaan lukea suoraan verkon yli tiedostoa, aivan kuin se olisi omalla levyllä oleva tiedosto.
java.net- ja java.io-paketit täytyy ottaa käyttöön import-lauseella ennen niiden käyttöä tässä metodissa. Lisää siis vielä koodin alkuun seuraavat rivit:
import java.net.*;
import java.io.*;
Jatketaan seuraavaksi itse tiedon lukemisen parissa. BufferedReader-luokka osaa lukea tietoa rivi kerrallaan, ja se palauttaa null-arvon kun tiedosto loppuu. Tämän oletuksen nojalla voidaan helposti laatia lyhyt silmukka, joka lukee kysymyksen ja 4 vaihtoehtoa tiedostosta, jossa erottimina ovat rivinvaihdot. Tiedoston muoto on sellainen, että kukin kysymys vie aina 9 riviä: ensin kysymysteksti, sitten neljä vaihtoehto-pistearvo-paria. Esimerkiksi seuraava muodostaisi yhden järkevän kysymyksen:
Kuinka usein vaihdat paitasi?
Kerran päivässä
1
Kahdesti viikossa
2
Kerran viikossa
4
Kerran vuodessa
10
Seuraava kysymys kirjoitetaan suoraan edellisen perään. Koodi tällaisen kysymystiedoston lukemiseen on seuraavanlainen:
String rivi;
while((rivi=reader.readLine())!=null) {
Kysymys k = new Kysymys(rivi,VAIHTOEHTO_MAARA);
for(int n=0; n<VAIHTOEHTO_MAARA; n++) {
rivi=reader.readLine();
int pistearvo = Integer.parseInt(reader.readLine());
k.lisaaVaihtoehto(rivi,pistearvo);
}
kysymykset.addElement(k);
}
Huomaa erityisesti silmukan kolmannella rivillä oleva uuden kysymysolion muodostaminen. Sisempi for-silmukka lisää kysymysolioon parsitut vaihtoehdot, ja kun ne on luettu, lisätään uusi kysymys k vektoriin nimeltä kysymykset metodilla addElement().
reader.close();
naytaKysymys(0);
} catch(IOException ex) {
ex.printStackTrace();
}
}
Metodin koodin loppu on yksinkertaista tavaraa: suljetaan BufferedReader-olio ja kutsutaan naytaKysymys-metodia (parametrina kysymys numero 0, eli ensimmäinen). Jos virheitä tuli, catch-lohko tulostaa asiaan liittyvät tiedot poikkeusluokkaan IOException kuuluvalla printStackTrace()-metodilla.