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.