import java.awt.*; import java.applet.*; import java.awt.event.*; import java.awt.image.*; /* Tiedosto: KuvapainikeTesti.java Tekijä: Juha Peltomäki, 12.1998. Aihe: Oman komponentin - kuvapainikkeen - toteutteminen. Toiminta: Ohjelmassa toteutetaan Canvas-luokasta peritty oma painikekomponentti. Painikekomponentissa on kaksi kuvaa, joista toinen aktivoituu hiiren napin ollessa alhaalla ja toinen aktivoituu hiiren napin ollessa ylhäällä. Komponentti toteuttaa hiiren tapahtumien kuuntelun, jotta siitä saada itsekseen toimiva osa ohjelmaa. Lisäksi komponentti toteuttaa muutamia vakiometodeita, joita sen on pakko toteuttaa. Luokassa on toteutettu seuraavat metodit: * KuvaPainike(String nimi1, String nimi2) - alustajametodi. * alusta_kuva(String alas, String ylos) - lataa kuvat luokan käyttöön. * paint() - piirtää komponentin ruudulle. * Dimension getPreferredSize() - palauta oletuskoko. * Dimension getMinumumSize() - palauta minimikoko. * addActionListener(ActionListener tk) - lisää hiiren tapahtumankuuntelija. * removeActionListener(ActionListener tk) - poistaa hiiren tapahtumankuuntelijan. Lisäksi on toteututtu sisäinen luokka PainikkeenKuuntelija (extends MouseAdapter), joka hoitaa hiiren painikkeen painimiseen reagoimisen tarkastaen samalla, onko hiiren kursori kuvapainikkeen alueella. */ class KuvaPainike extends Canvas { protected ActionListener tapaht_kuuntelija = null; int leveys, korkeus; boolean painettu = false; boolean alhaalla = false; Image alhaalla_kuva, ylhaalla_kuva; public KuvaPainike(String alas, String ylos) { alusta_kuva(alas, ylos); leveys = ylhaalla_kuva.getWidth(this); korkeus = ylhaalla_kuva.getHeight(this); setSize(leveys, korkeus); addMouseListener(new PainikkeenKuuntelija()); // addMouseMotionListener(new PainikeLiikkeenKuuntelija()); } public void alusta_kuva(String alas, String ylos) { MediaTracker mt = new MediaTracker(this); try { alhaalla_kuva = getToolkit().getImage(alas); ylhaalla_kuva = getToolkit().getImage(ylos); mt.addImage(ylhaalla_kuva, 0); mt.addImage(alhaalla_kuva, 1); mt.waitForAll(); } catch (Exception kesk_poikkeus) { System.out.println("POikkeusviesti: " + kesk_poikkeus.toString()); } } public void paint(Graphics piirtopinta) { if (alhaalla) piirtopinta.drawImage(alhaalla_kuva, 0, 0, this); else piirtopinta.drawImage(ylhaalla_kuva, 0, 0, this); } /* Palauttaa komponentin mitat. */ public Dimension getPreferredSize() { Dimension mitat = new Dimension(alhaalla_kuva.getWidth(this), ylhaalla_kuva.getWidth(this)); return mitat; } /* Palauttaa komponentin minimikoon. */ public Dimension getMinumumSize() { return this.getPreferredSize(); } /* Lisätään tapahtumien kuuntelijat. */ public void addActionListener(ActionListener tk) { tapaht_kuuntelija = AWTEventMulticaster.add(tapaht_kuuntelija, tk); } /* Poistetaan tapahtumien kuuntelijat. */ public void removeActionListener(ActionListener tk) { tapaht_kuuntelija = AWTEventMulticaster.remove(tapaht_kuuntelija, tk); } /* Sisäinen luokka, jossa toteutetaan hiiren napin painamisen ja vapauttamisen kuuntelu. */ public class PainikkeenKuuntelija extends MouseAdapter { public void mousePressed(MouseEvent hiiritap) { Point piste = hiiritap.getPoint(); if ( (piste.x > 0 && piste.x < leveys) && (piste.y > 0 && piste.y < korkeus) ) { alhaalla = true; painettu = true; repaint(); } } public void mouseReleased(MouseEvent hiiritap) { Point piste = hiiritap.getPoint(); if (alhaalla) { alhaalla = false; repaint(); } if ( (piste.x > 0 && piste.x < leveys) && (piste.y > 0 && piste.y < korkeus)&& painettu) { ActionEvent tt = new ActionEvent(hiiritap.getComponent(), 0, "Painettu"); if (tapaht_kuuntelija != null) tapaht_kuuntelija.actionPerformed(tt); } painettu = false; } } } /* Pääohjelma, jossa testataan kuvapainikkeen toimintaa. Molemmilla kuvapainikkeilla on esimerkissä saman tapahtumankäsittelyluokka KuvaPainikkeenKuuntelija. */ public class KuvaPainikeTesti extends Applet { KuvaPainike p1, p2; public void init() { setLayout(new FlowLayout()); p1 = new KuvaPainike("painike1.gif", "painike2.gif"); p1.addActionListener(new KuvaPainikkeenKuuntelija()); p2= new KuvaPainike("painike4.gif", "painike3.gif"); p2.addActionListener(new KuvaPainikkeenKuuntelija()); add(p1); add(p2); } public class KuvaPainikkeenKuuntelija implements ActionListener { public void actionPerformed(ActionEvent tapaht) { if (tapaht.getSource() == p1) showStatus("Viimeksi painettu painiketta p1"); else if (tapaht.getSource() == p2) showStatus("Viimeksi painettu painiketta p2"); } } }