Graafinen käyttöliittymä, osa 2 Tapahtumankäsittely, käyttöliittymäkomponentteja
MVC-malli M Malli V Näkymä Päivitys C Ohjain Päivitys Tapahtumat MVC-malli jakaa sovelluksen malli- ja näkymäkerroksiin. Ohjain toimii välittävänä komponenttina.
Tapahtumankäsittely Graafinen ohjelma on tapahtumaohjattu. Kukin tapahtuma on lähtöisin jostakin tapahtuman lähteestä. Tapahtuma synnyttää aina tapahtumaolion. painikkeelle ActionEvent Tapahtumankuuntelijaluokassa määritetään, mitä tapahtuman syntyessä tehdään. ActionListener-rajapinnan toteutus: metodi actionperformed Kuuntelijaluokka rekisteröidään komponentin kuuntelijaksi Tapahtuman kuuntelijaluokka toteutetaan usein anonyyminä sisäluokkana, joka kutsuu ohjaimessa olevaa Swing-riippumatonta tapahtuman jatkokäsittelymetodia.
Painikkeen kuuntelu MVC-mallissa 1. Luodaan malli-, ohjain- ja näkymäluokat. Näkymäluokkaan kirjoitetaan toiminnallisuus käyttöliittymän rakentamiseksi. 2. Kuhunkin painikkeeseen liitetään anonyymi sisäluokka, joka määritetään ActionEvent-tapahtumien käsittelijäksi. Kirjoitetaan metodi actionperformed(), jonka sisällä tehdään ne toimenpiteet, joihin painikkeen painamisen on johdettava. Käytännössä kutsutaan ohjaimen jatkokäsittelymetodia. Jatkokäsittelymetodin parametrit eivät sisällä Swing-komponentteja. 3. Kukin tapahtumankuuntelijaluokka (anonyymi sisäluokka) rekisteröidään halutun painikkeen kuuntelijaksi. kutsutaan JButton-painikkeen metodia addactionlistener().
Esimerkki Kahden painikkeen kuuntelu voidaan toteuttaa kahden anonyymin sisäluokan avulla. Koodiesimerkki PistelaskurinGUI Pistelaskuri PistelaskurinOhjain
Pistelaskuriesimerkki: malli
Pistelaskuriesimerkki: näkymä
Pistelaskuriesimerkki: ohjain
Tapahtumankuuntelijan muut toteutustavat Erillisissä luokissa Nimetyissä sisäluokissa Oma sisäluokka kullekin painikkeelle Yhteinen sisäluokka kaikille painikkeille Tapahtuman lähde selvitettävä ns. toimintokomennon avulla. Painikkeeseen liitetään haluttu merkkijono metodilla setactioncommand() Merkkijono saadaan kysyttyä tapahtumaoliolta metodilla getactioncommand() Koodiesimerkit PistelaskurinGUI2 PistelaskurinGUI3
Säiliöt JFrame Koodiesimerkki IlmoittautuminenGUI JPanel JPanel JPanel JPanel JPanel Säiliöt niputtavat käyttöliittymäkomponentteja. Säiliöitä voidaan asettaa sisäkkäin.
Säiliöt JFrame on normaalisti ylimmän tason säiliö. Muita vaihtoehtoja JApplet, JDialog, JWindow JPanel on perussäiliö alemmilla tasoilla. Komponentteja lisätään add()-metodilla. Muita säiliöitä: JScrollPane JTabbedPane JSPlitPane
Esimerkki: JScrollPane Koodiesimerkki JScrollPaneGUI
Sijoittelijat Sijoittelija määrää, miten komponentit sijoitellaan säiliön sisällä. Tutustutaan kolmeen sijoittelijaan FlowLayout Vasemmalta oikealle, ylhäältä alas GridLayout Ruudukko BorderLayout Keskialue ja neljä reuna-aluetta Oletussijoittelijana on FlowLayout.
FlowLayout settitle("flowlayout"); paneeli = new JPanel(new FlowLayout()); for (int i = 0; i<=5; i++) { } paneeli.add(painikkeet[i]); settitle("flowlayout, vasen tasaus"); paneeli = new JPanel(new FlowLayout(FlowLayout.LEFT)) ; for (int i = 0; i<=5; i++) { } paneeli.add(painikkeet[i]);
GridLayout // settitle("gridlayout"); paneeli = new JPanel(new GridLayout(4,3)); for (int i = 0; i<12; i++) { paneeli.add(painikkeet[i]); } //
BorderLayout settitle("borderlayout"); paneeli = new JPanel(new BorderLayout()); paneeli.add(painikkeet[0], BorderLayout.NORTH); paneeli.add(painikkeet[1], BorderLayout.SOUTH); paneeli.add(painikkeet[2], BorderLayout.WEST); paneeli.add(painikkeet[3], BorderLayout.EAST); paneeli.add(painikkeet[4], BorderLayout.CENTER);
Valintapainikkeet ja valintaruudut Koodiesimerkki ValintakomponentitGUI JRadioButton, JCheckBox Yhteen kuuluvat valintapainikkeet yhdistetään ButtonGroupolioon.
Luettelo- ja yhdistelmäruudut JList, JComboBox Koodiesimerkki LuetteloruudunGUI