Kysymyksen näyttäminen
Kun kysymykset on ladattu, on aika käydä ohjelman perustoiminnan kimppuun. lataaKysymykset()-metodi kutsui naytaKysymys()-metodia, jonka ohjelmoimme seuraavaksi. Aloittakaamme heti edellisen perään:
private void naytaKysymys(int kys) {
Kysymys k = (Kysymys)kysymykset.elementAt(kys);
labelKysymys.setText((kys+1)+"/"+kysymykset.size()+": "+k.haeKysymys());
for(int n=0;n naytettyKysymys=kys;
ryhma1.setSelectedCheckbox(null);
}
Metodin koodin ensimmäisellä rivillä haetaan vektorin elementAt()-metodilla se elementti, jonka järjestysnumero on parametrissa kys. Muista, että taulukointi alkaa myös vektorissa nollasta: ensimmäinen kysymys on siis 0! Seuraavaksi asetetaan kysymyksen otsikko ja vaihtoehdot silmukassa: tässä on huomattavan näppärää, että käytettävissä on Checkbox[]-taulukko vaihtoehdot, joka voidaan käydä läpi silmukalla.
Seuraavaksi asetetaan naytettyKysymys-muuttujaan tämänhetkisen kysymyksen numero, jotta muut metodit saavat sen tietoonsa myöhemmin. Viimeinen rivi poistaa ryhma1:sta valinnat, jolloin edellisen kysymyksen valinta-arvot eivät toistu seuraavaan. Tämän jälkeen ohjelman kontrolli jätetään normaalisti tapahtumien varaan: mitään koodia ei suoriteta kunnes käyttäjä tekee jotain.
Vastaa-nappi käyttöön
Hyppää takaisin Designer-tilaan ja tuplaklikkaa Vastaa-nappia. JBuilder muodostaa uuden tapahtumankäsittelijän buttonVastaa_actionPerformed. Kirjoitetaan seuraavaksi koodia sen käsittelyyn.
void buttonVastaa_actionPerformed(ActionEvent e) {
for(int n=0;n if (ryhma1.getSelectedCheckbox()==vaihtoehdot[n]) {
vastaa(n);
Kun käyttäjä klikkaa Vastaa-nappia, käydään vastausvaihtoehdot läpi. Jos jokin niistä on ruksittu, on se tehtävän vastaus: tällöin kutsutaan metodia vastaa, joka saa parametrikseen vastausvaihtoehdon numeron (0-3). Vastaa-metodin tehtäväksi jää yksinkertaisesti kirjata tehty vastaus kysymysolioon. Se onnistuu seuraavalla koodilla, joka kannattaa liittää tapahtumankäsittelijän rungon yläpuolelle:
private void vastaa(int vastaus) {
Kysymys k = (Kysymys)kysymykset.elementAt(naytettyKysymys);
k.vastaa(vastaus);
}
Ensimmäinen rivi etsii kysymykset-taulukosta tämänhetkisen kysymyksen muuttujaan k, ja toinen rivi kutsuu Kysymys-luokkaan laatimaamme vastaa()-metodia. Näin kysymys merkitään vastatuksi, ja sieltä voidaan myöhemmin kaivaa esille vastauksen tuomat pisteet.
Kun vastausasia on käsitelty, voidaan jatkaa tapahtumankäsittelijän ohjelmointia. Kun tehtävään on vastattu onnistuneesti, on aika siirtyä seuraavaan kysymykseen. Kirjoitetaan seuraava koodi vastaa(n)-rivin jälkeen:
if (!naytaSeuraava()) {
naytaTulos();
buttonVastaa.setEnabled(false);
}
return;
}
}
Luodaan metodi naytaSeuraava(), joka palauttaa totuusarvon false, mikäli uusia kysymyksiä ei enempää ole. Jos uusi kysymys löytyy, metodi näyttää sen ja palauttaa arvon true. Kysymysten loputtua näytetään tulostiedot metodilla naytaTulos(). Samalla muutetaan vastausnappulan tilaa siten, ettei sitä voi enää klikata: setEnabled(false). Uuden testin tehdäkseen käyttäjän on ladattava sivu uudelleen.
Metodin naytaSeuraava() koodi on seuraavanlainen:
private boolean naytaSeuraava() {
if (naytettyKysymys==kysymykset.size()-1) return false;
naytaKysymys(naytettyKysymys+1);
return true;
}
Logiikka on melko suoraviivainen. Kannattaa kuitenkin huomata, että kun tarkistetaan, onko näytillä vektorin viimeinen kysymys, täytyy vektorin elementtimäärän palauttavan size()-metodin arvosta vähentää yksi, koska se todella palauttaa elementtien lukumäärän; kuitenkin esimerkiksi kolmen kysymyksen vektorissa viimeisen kysymyksen numero on 2.
naytaTulos() puolestaan hoituu seuraavanlaisella koodilla:
private void naytaTulos() {
int pisteet=0;
for(int n=0;n pisteet+=((Kysymys)kysymykset.elementAt(n)).haePisteet();
labelKysymys.setText("Sait " + pisteet + " pistettä!");
for(int n=0;n }
Ratkaisu on melko yksinkertainen, sillä koodi vain asettaa kysymyksen näyttävän Labelin sisällöksi pistemäärästä kertovan tekstin. Sitä ennen pisteet lasketaan käymällä vektorin kysymysoliot yksi kerrallaan läpi ja kutsumalla kunnkin haePisteet-metodia. Lopuksi vaihtoehdot vielä kytketään pois päältä, sillä ilman kysymystä niillä ei myöskään tee mitään.
Enää vain kysymykset puuttuvat. Kirjoita niitä tekstitiedostoon ja tallenna se samaan hakemistoon testi-HTML:n kanssa, käännä appletti ja voilá! Nörttitestisi on kunnossa. Sitten voitkin alkaa miettimään, miten ohjelmaa voisi parantaa. Joitain vinkkejä saat seuraavalta sivulta, ja lisää keksii itsekin.