GRAAFISEN KÄYTTÖLIITTYMÄN OHJELMOINTI JAVA SWING Käyttöliittymäkomponentteja Sovelluksen pääikkunan luominen Rinnakkainen toiminnallisuus Miten käyttöliittymä lopetetaan? Ikkunan peruskomponentit Mihin kohtaan ikkunaa komponentti laitetaan? Paneelit (JPanel) Käyttöliittymätapahtumien käsittely Tapahtumaohjattu ohjelmointi Tapahtuman kuuntelijaluokat
GRAAFISEN KÄYTTÖLIITTYMÄN OHJELMOINTI JAVA SWING Java-ohjelman graafinen käyttöliittymä (Graphical User Interface, GUI) voidaan toteuttaa käyttämällä AWT (Abstract Windowing Toolkit) -luokkakirjastoa Swing-luokkakirjastoa edellisten yhdistelmää Sovellus (Application) käyttöjärjestelmän alla suoritettava ohjelma Sovelma (Applet) www-sivuilla suoritettava ohjelma
Käyttöliittymäkomponentteja JButton JFrame JLabel JTextField
JFrame-luokan periytyminen Object Kaikkien Java-luokkien yläluokka Component +setsize() +setlocation() +setbounds() +setbackground() +setforeground() +setvisible() Komponentin koko Komponentin sijainti Komponentin sijainti ja koko Komponentin taustaväri Komponentin etualanväri Näyttää/piilottaa komponentin Container +add() +setlayout() Lisää komponentin säilöön Asettaa sijoittelumanagerin
JFrame-luokan peritytyminen jatkuu : Container Panel +add() +setlayout() Window +addwindowlistener() Kehyksetön ikkuna Tapahtumakuuntelijan kytky Dialog Frame -settitle Ikkuna, jossa on kehykset ja otsikkopalkki JFrame +getcontentpane()
Paketti javax.swing sisältää mm. seuraavia luokkia: JFame JDialog JPanel kehystetty ikkuna dialogi ikkuna paneeli JButton JTextField JLabel JTextArea painike tekstikenttä otsikkoteksti tekstialue JCheckBox, JCheckBoxMenuItem JRadioButton, JRadioButtonMenuItem, JComboBox, JList valintaruutu, valinta valintaruutu valinta valintalista, luettelo JMenuBar, JMenu, JMenuItem JScrollBar valikon paikka, valikko valikkorivi vierityspalkki
Component Luokkien JPanel, JLabel, JTextField, JTexArea ja JButton periytyminen: JComponent : JPanel JLabel AbstractButton +JPanel() +JPanel (LayoutManager mgr)() +JLabel() +settext(string s)() +addactionlistener() JTextComponent JButton +settext() +gettext() +seteditable() +JButton(String s)() JTextArea JTextField +JTextArea (int col, int row)() +append() +JTextFiled() +JTextField (int col)()
Sovelluksen pääikkunan luominen import javax.swing.*; import java.awt.*; import java.awt.event.*; Import-lauseet, jotta voidaan käyttää olemassa olevia komponentteja } public class FrIkkuna extends JFrame { } public FrIkkuna() { // ikkunan otsikko settitle("esimerkki-ikkuna"); // ikkunan koko setsize(200, 150); // ikkunan sijainti setlocation(100, 100); public static void main(string[] args) { } FrIkkuna fr = new FrIkkuna(); fr.setvisible(true); FrIkkuna periytetään JFrame-luokasta Tuo ikkuna näkyviin
Sovelluksen luoma ikkuna: :
Rinnakkainen toiminnallisuus graafista käyttöliittymää käsittelevä Java-ohjelma on monisäikeinen (Multithreading) säie (Thread) oma kontrolli oma ohjelmakohta Syntyy pääsäie Esim. public static void main(string[] args) { } FrIkkuna fr = new FrIkkuna(); fr.setvisible(true); Syntyy itsenäinen käyttöliittymäsäie, joka huolehtii ikkunasta
Miten käyttöliittymä lopetetaan? mikäli Java-sovellus on tuonut näkyviin yhdenkään ikkunan sen suoritus täytyy lopettaa System.exit(0) metodin kutsulla kun pääikkuna suljetaan, yleensä halutaan että koko sovellus päättyy laitetaan pääikkunan muodostimeen lause setdefaultcloseoperation(jframe.exit_on_close) ko. lause suorittaa System.exit-lauseen, kun käyttäjä painaa ikkuna sulkemisruutua
Esim. import javax.swing.*; import java.awt.*; import java.awt.event.*; public class FrIkkuna extends JFrame { public FrIkkuna() { } // ikkunan otsikko settitle("esimerkki-ikkuna"); // ikkunan koko setsize(200, 150); // ikkunan sijainti setlocation(100, 100); setdefaultcloseoperation(jframe.exit_on_close); public static void main(string[] args) { } FrIkkuna fr = new FrIkkuna(); fr.setvisible(true); }
IKKUNAN PERUSKOMPONENTIT Komponenttien määrittely JButton btlopeta = new JButton ( Lopeta ); JLabel lbetunimi = new JLabel ( Etunimi: ); JTextField tfetunimi = new JTextField ( 10 ); Komponenttien sijoittelu ikkunaan Komponentit lisätään ikkunaan Container-olion add-metodilla: Esim. Container sisalto = this.getcontentpane(); sisalto.add(komponentti);
Mihin kohtaan ikkunaa komponentti laitetaan? A) Käytetään sijoittelumanageria: FlowLayout sijoittelumanageri: Container sisalto = this.getcontentpane(); sisalto.setlayout (new FlowLayout( ) ); tasaustapa CENTER (oletus), LEFT tai RIGHT Ks. FrSijoittuEsim1.java
Mihin kohtaan ikkunaa komponentti laitetaan jatkuu BorderLayout sijoittelumanageri: pyrkii järjestämään komponentit viiteen erilliseen maantieteelliseen lokeroon: NORTH, WEST, CENTER, EAST, SOUTH Ks. FrSijoittuEsim2.java
GridLayout sijoittelumanageri Mihin kohtaan ikkunaa komponentti laitetaan jatkuu jakaa ikkunan ruudukoksi, jossa kaikki ruudut ovat samankokoisia esim. Container sisalto = this.getcontentpane(); sisalto.setlayout (new GridLayout(2,2)) ==> Container sisalto = this.getcontentpane(); sisalto.setlayout (new GridLayout(0,3)) ==> Ks. FrSijoitteluEsim3.java
B) Sijoitetaan komponentit itse: Komponenttien sijoittelu Mihin kohtaan ikkunaa komponentti laitetaan jatkuu xy-koordinaatisto, siten ettö origo (nollapiste) on alueen vasemmassa ylälaidassa 0,0 x-akseli y- a k s e l i koordinaattiyksikkö on pikseli (pixel) koordinaatiston koko riippuu näytön tarkkuudesta (640x480, 800x600, 1280x1024)
Mihin kohtaan ikkunaa komponentti laitetaan jatkuu sijoittelumalli otetaan poispäältä: Container sisalto = this.getcontentpane(); sisalto.setlayout (null); komponenttien sijainti ja koko asetetaan btkeltainen.setlocation( 45, 50); // (x,y) btkeltainen.setsize ( 70, 25 ); // (leveys,korkeus) // tai (x, y, leveys, korkeus) btkeltainen.setbounds (45, 50, 70, 25); Ks. SijoitteluEsim4.java
Paneelit (JPanel) Usein on tarpeen jakaa näyttö useaan osaan ja sijoittaa kuhunkin osaan tietyt komponentit tietyssä järjestyksessä. Tällöin käytetään apuna paneelielementtiä edustavaa luokkaa JPanel Ensin sijoitetaan näytön sijoittelumanagerin avulla kaikki paneelit näyttöön Sitten määritellään jokaiselle paneelikomponentille oma sijoittelumanagerinsa (ei pakko) ja sijoitetaan jokaisen paneeliin sinne kuuluvat komponentit Ks. FrJPanel.java
Käyttöliittymätapahtumien käsittely Tapahtumaohjattu ohjelmointi (event driven programming): ohjelman suorituksen kontrolli on käyttöliittymässä käyttäjän toimenpiteet (ikkunan sulkeminen, painikkeen painaminen yms.) huomioi ajonaikainen järjestelmä ja välittää näistä tiedot TAPAHTUMINA sovellukselle
Tapahtumaohjattu ohjelmointi Käyttäjän toimenpide aiheuttaa tapahtuman Komponenttiolio kutsuu tapahtumaan kytketyn kuuntelijaolion tiettyä metodia Tapahtuman käsittelymetodi käyttöliittymäkomponenttiolio Tapahtuma kuuntelijaolio
Tapahtumaohjattu ohjelmointi Käyttöliittymäkomponenttiin on ensin kytkettävä tapahtumakuuntelija olio Kytkentää riippuu komponentin luokasta Esim. painikkeeseen kytketään tapahtumakuuntelija addactionlistetener-metodilla Esim. btlisaa.addactionlistener(new AlsLisaa()); Parametriksi luodaan tapahtumakuuntelijaolio
Tapahtuman kuuntelijaluokat käyttöliittymätapahtuman käsittely tehdään tapahtuman kuuntelijaluokassa esim. painikkeeseen kytketyn kuuntelijaluokan on luvattava, että se toteuttaa ActionListener-rajapinnan class AlsLisaa implements ActionListener { } Kun luokka lupaa toteuttaa ActionListener-rajapinnan luokan on sisällettävä seuraavan muotoinen actionperformedmetodi: public void actionperformed(actionevent e) { // tähän tulee koodi, // jolla reagoidaan tapahtumaan }
Esim. public class FrLaskuri1 extends JFrame {... private void asettelekomponentit() { btlisaa.addactionlistener ( new AlsLisaa () ); } class AlsLisaa implements ActionListener { public void actionperformed (ActionEvent e) { int lkm = Integer.parseInt(tfLaskuri.getText()); lkm++; } } tflaskuri.settext(""+lkm);
Kuuntelijaluokan toteutus sisäluokkana (inner class) eli kuuntelijaluokka määritellään toisen luokan sisällä Ympäröivä olio omistaa sisäluokan olion sisäluokan olio voi käsitellä ympäröivän luokan yksityisiä tietoja ja kutsua ympäröivän luokan metodeja sisäluokat eivät näy ympäröivän luokan ulkopuolelle käytetään yleensä vain tapahtuman kuuntelijoiden ohjelmoinnissa