Risto Saarelman arvosteluperusteet Helsingin yliopiston Ohjelmointitekniikka (Java) -kurssin 2006-02-28 kurssikokeen tehtävään 3. Tehtävässä pyydettiin luonnostelemaan ohjelma, ei siis kirjoittamaan koko koodia. Jos esitys on riittävän selkeä, luonnostelu ei välttämättä vaadi lainkaan varsinaista koodia. Ratkaisun on kuitenkin oltava mielekkäästi toteutettavissa Javan AWT- tai Swing-käyttöliittymäkirjastoilla ja noudatettava pääpiirteittäin niiden käytäntöjä. Koska tehtävänanto on aika väljä esitysmuodon suhteen, monennäköisistä vastauksista sai pisteitä. Tärkeintä oli että vastauksessa näkyi joko selityksestä tai kommentoidusta esimerkkikoodista että vastaaja hahmotti GUI-ohjelmien ja tapahtumankäsittelyn keskeiset rakenteet. Alla on kaiken tarpeellisen toiminnallisuuden kattava hahmotelmani. Toteutus ei ole välttämättä fiksuin mahdollinen. Oletetaan että peli toteutetaan Swing-kirjastolla ja itsenäisenä sovelluksena eikä applettina. Ylin luokka on javax.swing.JFrame, joka vastaa ohjelman ikkunaa. Se sisältää (esimerkiksi javax.swing.JPanel-luokasta perityn) komponentin, johon pelinäkymä piirretään. Kutsuttakoon tätä nimellä GoalPanel. Koska tässä pelissä ei tarvita muita komponentteja, ei tarvitse pähkäillä layout-systeemien kanssa. Lisätään vain GoalPanel Maalivahti-JFrameen. Pelin kulku on yksinkertainen. Pelin alkaessa pallo lähtee ruudun yläreunan satunnaisesta pisteestä liikkumaan alaspäin satunnaisessa kulmassa. Pelaaja liikuttelee ruudun alareunassa olevaa mailaa estääkseen palloa liikkumasta ruudun alareunaan. Kun pallo pääsee mailan ohi, peli päättyy. Toteutetaan animointi kurssilla opitun mukaisesti suorittamalla pallon ja mailan päivittämistä omissa säikeissään. Pallon luokka on Ball ja mailan Bat. Molemmat perivät java.lang.Runnable-rajapinnan. Luokkien run-metodissa on silmukka, joka päivittää olion tilaa ja nukkuu joka päivityksen jälkeen Thread.sleep -metodin avulla niin että animaation nopeus säilyy vakiona. Runnable-olio ei vielä itsessään ole säie, vaan se kapseloidaan erillisen java.lang.Thread-olion sisään. GoalPanel omistaa mailan ja pallon, joten se voi käynnistää myös niiden säikeet. Pallo- ja maila-olioissa on viite GoalPanel-olioon. Ne kutsuvat päivittyessään GoalPanelin repaint()-metodia, joka kertoo GoalPanelille, että sen kannattaisi kohtapuoliin piirtää itsensä uusiksi. Mailan säie liikuttelee mailaa pelaajan komentojen mukaan. Pallon säie liikuttaa palloa ja kimmotuttaa sitä seinistä ja mailasta. Pallon säie myös huomaa jos pallo pääsee ruudun alareunaan, ja kutsuu pelin lopettavaa metodia jos näin käy. Peliä ohjataan näppäimistöltä. Näppäilyjen lukemiseen käytetään java.event.KeyListener-rajapinnan toteuttavaa oliota. Koska vain maila on kiinnostunut näppäilyistä, laitetaan mailaluokka toteuttamana KeyListenerin metodit. Mailaan toteutetaan metodit keyPressed ja keyReleased, jotka tarkkailevat painetaanko nuolinäppäimiä pohjaan tai nostetaanko niitä, ja päivittää mailan liiketilaa asianmukaisesti. Näppäilyjä vastaanottava GUI-komponentti olkoon GoalPanel. Laitetaan siis sen näppäinkuuntelijaksi mailaolio addKeyListener-metodilla. Kun GoalPanel on luotu, kutsutaan sen requestFocusInWindow()-metodia, jotta saataisiin se heti näppäilyjen vastaanottajaksi. Ohjelman main-metodi luo JFramen, laittaa siihen komponentiksi GoalPanelin ja antaa sitten käyttöliittymäsäikeiden huolehtia jatkosta.