import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JPanel; /** * Luokka Vastauspaneeli, joka periytyy luokasta JPanel. Luokka * piirtää vastauspaneelin ja sinne napit Matikka-luokan arpomien * tulosvaihtoehtojen mukaan. Napit reagoivat oikeisiin ja vääriin * vaihtoehtoihin vaihtamalla väriä. Luokka myös välittää Peli- * luokalle tiedon ensimmäisellä yrityskerralla saaduista oikeista * vastauksista ja kutsuu animaatiota aina oikean vastauksen * jälkeen. * @author Karoliina Tiuraniemi * @version 1.0, 18.1.2009 * */ public class Vastauspaneeli extends JPanel{ private static final long serialVersionUID = 1L; private Matikka matikka; private Ikkuna ikkuna; private Nappi nappi0; private Nappi nappi1; private Nappi nappi2; /** * Konstruktori, joka luo pelin vastauspaneelin. * @param matikka * @param ikkuna */ public Vastauspaneeli(Matikka matikka, Ikkuna ikkuna){ super(); this.matikka = matikka; this.ikkuna = ikkuna; System.out.println("Vastauspaneeli luotu"); } /** * Metodi, joka hakee luokan matikka arpomat vaihtoehdot * tehtävälle ja piirtää niiden mukaiset napit. */ public void piirra(){ this.matikka.arvoVaihtoehdot(); this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); MouseListener kuuntelija = new VastausKuuntelija(); this.nappi0 = new Nappi(this.matikka.annaTulos0()); Dimension nappikoko = new Dimension(100,100); this.nappi0.setMaximumSize(nappikoko); this.nappi0.piirra(); this.nappi0.addMouseListener(kuuntelija); this.add(nappi0); this.nappi1 = new Nappi(this.matikka.annaTulos1()); nappi1.setMaximumSize(nappikoko); nappi1.addMouseListener(kuuntelija); this.nappi1.piirra(); this.add(nappi1); this.nappi2 = new Nappi(this.matikka.annaTulos2()); nappi2.setMaximumSize(nappikoko); nappi2.addMouseListener(kuuntelija); this.nappi2.piirra(); this.add(nappi2); System.out.println("Vastauspaneeli piirretty"); repaint(); } /** * Sisäluokka Vastauskuuntelija, joka periytyy luokasta * Kuuntelija. * @author Karoliina Tiuraniemi * */ private class VastausKuuntelija extends Kuuntelija { private boolean vaarinVastattu = false; private boolean oikeinVastattu = false; /** * Metodi, joka kertoo mitä tapahtuu kun hiirellä klikataan * nappia. Jos nappia vastaava tulos on väärin, napin väri * muuttuu punaiseksi ja alapaneelin tekstiksi vaihtuu Väärin. * Jos nappia vastaava tulos on oikein eikä aikaisemmin ole * vastattu väärin, tuloslaskuria lisätään yhdellä. Joka * tapauksessa oikean tuloksen jälkeen käynnistyy animaatio. * * @param e MouseEvent */ public void mouseClicked(MouseEvent e){ if (e.getSource() instanceof JButton){ // talletetaan omaan muuttujaansa klikattu nappi JButton nappi = (JButton) e.getSource(); // jos on klikattu nappi0:aa if (nappi.equals(Vastauspaneeli.this.nappi0)){ // asetetaan arvaukseksi tulos0 Vastauspaneeli.this.matikka.asetaArvaus (Vastauspaneeli.this.matikka.annaTulos0()); } else if (nappi.equals(Vastauspaneeli.this.nappi1)){ Vastauspaneeli.this.matikka.asetaArvaus (Vastauspaneeli.this.matikka.annaTulos1()); } else if (nappi.equals(Vastauspaneeli.this.nappi2)){ Vastauspaneeli.this.matikka.asetaArvaus (Vastauspaneeli.this.matikka.annaTulos2()); } if (Vastauspaneeli.this.matikka.tulosOikein() && !this.oikeinVastattu){ nappi.setBackground(Varit.KIRKKAANVIHREA); Vastauspaneeli.this.ikkuna.vaihdaAlapaneelinTeksti ("Oikein."); // tällä muuttujalla varmistetaan, ettei ohjelma kaadu animaation aikana // jos klikataan oikeaa vastausta useamman kerran. this.oikeinVastattu = true; // oikeasta vastauksesta lisätään vuorolaskuriin Vastauspaneeli.this.ikkuna.annaPeli().lisaaVuorolaskuri(); // tarkistetaan, onko tähän kysymykseen vastattu aikaisemmin // väärin. jos ei, lisätään tuloslaskuriin piste. Vastauspaneeli.this.repaint(); System.out.println("Vastauspaneeli: nyt voi lähteä"); Vastauspaneeli.this.ikkuna.annaOtokkapaneeli().animaatio(); if (!this.vaarinVastattu){ Vastauspaneeli.this.ikkuna.annaPeli(). lisaaTuloslaskuri(); } } else if (!Vastauspaneeli.this.matikka.tulosOikein()){ Vastauspaneeli.this.ikkuna.vaihdaAlapaneelinTeksti ("Väärin."); nappi.setBackground(Varit.PUNAINEN); // lisätään tieto, että on vastattu väärin. this.vaarinVastattu = true; } } } } /** * Metodi, jonka sisään menee kaikki grafiikkakoodi. * @param g Graphics */ public void paintComponent(Graphics g) { // graphics olio tyyppimuunnetaan graphics 2D:ksi Graphics2D g2 = (Graphics2D) g; // määritellään käytetty väri g2.setPaint(Color.BLACK); // määritellään paneelin kokoinen neliö, jonka sisälle värjäys tulee int width = this.getWidth(); int height = this.getHeight(); Rectangle r = new Rectangle(0,0,width,height); // kutsutaan graphic-oliota, joka täyttää neliön. g2.fill(r); } }