Graafinen käyttöliittymä, osa 2 Tapahtumankäsittely, käyttöliittymäkomponentteja Ohjelmoinnin jatko (Java) Metropolia Ammattikorkeakoulu Vesa Ollikainen
MVC-malli MVC-malli jakaa sovelluksen malli- ja näkymäkerroksiin. Ohjain toimii välittävänä komponenttina. Ohjelmoinnin jatko (Java) Metropolia Ammattikorkeakoulu Vesa Ollikainen
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. Ohjelmoinnin jatko (Java) Metropolia Ammattikorkeakoulu Vesa Ollikainen
Painikkeen kuuntelu MVC-mallissa Luodaan malli-, ohjain- ja näkymäluokat. Näkymäluokkaan kirjoitetaan toiminnallisuus käyttöliittymän rakentamiseksi. 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. Kukin tapahtumankuuntelijaluokka (anonyymi sisäluokka) rekisteröidään halutun painikkeen kuuntelijaksi. kutsutaan JButton-painikkeen metodia addActionListener(). Ohjelmoinnin jatko (Java) Metropolia Ammattikorkeakoulu Vesa Ollikainen
Esimerkki Kahden painikkeen kuuntelu voidaan toteuttaa kahden anonyymin sisäluokan avulla. Koodiesimerkki PistelaskurinGUI Pistelaskuri PistelaskurinOhjain Ohjelmoinnin jatko (Java) Metropolia Ammattikorkeakoulu Vesa Ollikainen
Pistelaskuriesimerkki: malli Ohjelmoinnin jatko (Java) Metropolia Ammattikorkeakoulu Vesa Ollikainen
Pistelaskuriesimerkki: näkymä Ohjelmoinnin jatko (Java) Metropolia Ammattikorkeakoulu Vesa Ollikainen
Pistelaskuriesimerkki: ohjain Ohjelmoinnin jatko (Java) Metropolia Ammattikorkeakoulu Vesa Ollikainen
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 Ohjelmoinnin jatko (Java) Metropolia Ammattikorkeakoulu Vesa Ollikainen
Säiliöt Säiliöt ”niputtavat” käyttöliittymäkomponentteja. Koodiesimerkki IlmoittautuminenGUI Säiliöt ”niputtavat” käyttöliittymäkomponentteja. Säiliöitä voidaan asettaa sisäkkäin. Ohjelmoinnin jatko (Java) Metropolia Ammattikorkeakoulu Vesa Ollikainen
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 Ohjelmoinnin jatko (Java) Metropolia Ammattikorkeakoulu Vesa Ollikainen
Esimerkki: JScrollPane Koodiesimerkki JScrollPaneGUI Ohjelmoinnin jatko (Java) Metropolia Ammattikorkeakoulu Vesa Ollikainen
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. Ohjelmoinnin jatko (Java) Metropolia Ammattikorkeakoulu Vesa Ollikainen
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]); } Ohjelmoinnin jatko (Java) Metropolia Ammattikorkeakoulu Vesa Ollikainen
GridLayout setTitle("GridLayout"); //… setTitle("GridLayout"); paneeli = new JPanel(new GridLayout(4,3)); for (int i = 0; i<12; i++) { paneeli.add(painikkeet[i]); } Ohjelmoinnin jatko (Java) Metropolia Ammattikorkeakoulu Vesa Ollikainen
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); Ohjelmoinnin jatko (Java) Metropolia Ammattikorkeakoulu Vesa Ollikainen
Valintapainikkeet ja valintaruudut Koodiesimerkki ValintakomponentitGUI JRadioButton, JCheckBox Yhteen kuuluvat valintapainikkeet yhdistetään ButtonGroup- olioon. Ohjelmoinnin jatko (Java) Metropolia Ammattikorkeakoulu Vesa Ollikainen
Luettelo- ja yhdistelmäruudut JList, JComboBox Koodiesimerkki LuetteloruudunGUI Ohjelmoinnin jatko (Java) Metropolia Ammattikorkeakoulu Vesa Ollikainen