Graafinen käyttöliittymä, osa 3 Hiiritapahtumat, valikot, Look and Feel
Taustaa: painikkeen käsittely Painikkeen tapahtumalähde on JButton-komponentti. Tapahtuma synnyttää aina tapahtumaolion. painikkeelle ActionEvent Tapahtumankuuntelijaluokassa määritetään, mitä tapahtuman syntyessä tehdään. Tapahtumankuuntelijaluokka toteutetaan usein anonyyminä sisäluokkana. Luokka toteuttaa ActionListener-rajapinnan. metodi actionperformed() Kuuntelijaluokka (yleensä anonyymi sisäluokka) rekisteröidään komponentin kuuntelijaksi
Hiiritapahtuman käsittely Hiiritapahtuman lähteenä on komponentti, johon liittyvää hiiren käyttöä tarkkaillaan esim JFrame, JLabel, Tapahtumaolio MouseEvent sisältää tietoa hiiren vaiheista esim getx(), gety(), getbutton() Tapahtumankuuntelijan on toteutettava soveltuva rajapinta MouseListener MouseMotionListener MouseWheelListener
MouseListener-rajapinta Viisi tapahtumankäsittelymetodia rajapinnassa MouseListener public void mousepressed(mouseevent e) public void mousereleased(mouseevent e) public void mouseclicked(mouseevent e) public void mouseentered(mouseevent e) public void mouseexited(mouseevent e)
MouseMotionListener- ja MouseWheelListener-rajapinnat Kaksi tapahtumankäsittelymetodia rajapinnassa MouseMotionListener: public void mousemoved(mouseevent e) public void mousedragged(mouseevent e) Yksi tapahtumankäsittelymetodi rajapinnassa MouseWheelListener: public void mousemoved(mousewheelevent e)
Sovitinluokat Rajapinnat MouseListener ja MouseMotionListener vaativat useiden metodien toteuttamisen. Sen sijaan, että tapahtumankuuntelija toteuttaisi ao. rajapinnan, se voidaankin periyttää ns. sovitinluokasta. Hiiren sovitinluokka on nimeltään MouseAdapter. Sovitinluokka sisältää tyhjät toteutukset em. rajapintojen metodeille. Soveltuvat hyvin käytettäviksi anonyymeinä sisäluokkina toteutettujen tapahtumankuuntelijoiden kanssa.
Esimerkki sovitinluokan käytöstä Koodiesimerkki HiirinappiGUI Koodiesimerkit ovat Tuubi-työtilassa (Dokumentit/Työtiedostot). Esimerkissä JPanel-komponenttiin sisältöpaneeli liitetään hiiren kuuntelija. Kuuntelijassa ylikirjoitetaan sovitinluokan metodi mouseclicked(). Muut sovitinluokan metodit jäävät oletusarvoisiin, tyhjiin toteutuksiinsa. Kuuntelija on toteutettu anonyyminä sisäluokkana. Kun anonyymi sisäluokka luodaan luokasta (kuten tässä), syntyy aliluokka. Kun anonyymi sisäluokka luodaan rajapinnasta (kuten ActionListener), syntyy sen toteuttava luokka.
Esimerkki Koodiesimerkki KuvapelinGUI Kuvapeli KuvapelinOhjain Seurataan hiiren liikkeitä valokuvan päällä (JLabel) Reagoidaan hiiren liikkeeseen: onko aarre löytynyt? Painikkeen painallus päivittää etäisyyden aarteeseen.
Valikot Valikoiden luominen selkiyttää käyttöliittymää keskikokoisessa ja suuressa sovelluksessa. Valikko (JMenu) Valikkorivi (JMenuBar) Vaihtoehto (JMenuItem)
Valikot Luo valikkorivi JMenuBar valikkorivi = new JMenuBar(); Luo valikko JMenu valikkoa = new JMenu( Tiedosto ); Lisää valikko valikkoriviin valikkorivi.add(valikkoa) Luo vaihtoehtoja vaihtoehtoa1 = new JMenuItem( Ensimmäinen vaihtoehto ); vaihtoehtoa2 = new JMenuItem( Toinen vaihtoehto );
Valikot Lisää vaihtoehdot valikkoon valikkoa.add(vaihtoehtoa1); valikkoa.add(vaihtoehtoa2); Lisää erotinviiva valikkoa.addseparator(); Lisää vaihtoehtoon toimintokomento. vaihtoehtoa1.setactioncommand( A1 ); Lisää vaihtoehdolle kuuntelija vaihtoehtoa1.addactionlistener(kuuntelija); Aseta valikkorivi tämän ikkunan (JFrame) valikkoriviksi setjmenubar(valikkorivi);
Esimerkki Valikkorivissä kaksi valikkoa. Yksi valikon vaihtoehto sisältää alivalikon. Yksi vaihtoehdoista on valintaruututyyppinen (JCheckBoxMenuItem) Koodiesimerkki ValikkoesimerkinGUI ValikkoesimerkinMalli ValikkoesimerkinOhjain
Look and Feel try { } UIManager.setLookAndFeel( UIManager.getCrossPlatformLookAndFeelClassName ()); catch (Exception e) { } System.out.println("Look and Feel - asetus epäonnistui.") Look and Feel määrää käyttöliittymän ulkoasun Laitteistoriippumaton (Java) Laitteistokohtainen esim. Windows Käsiteltävä viisi poikkeusta: ClassNotFoundException, InstantiationException, IllegalAccessException, UnsupportedLookandFeelException ja ClassCastException