Programski jezici leto 2010-11
Grafički programi Koriste grafičke mogućnosti: boje, fontove, geometrijske oblike, slike,... Komuniciraju sa korisnikom preko grafičkog korisničkog interfejsa koji se sastoji od grafičkih komponenti: prozor, meni, dugme, oznaka, tekstualno polje,... 2
Programiranje grafičkih programa se razlikuje od programiranja konzolnih programa, jer je način njihovog izvršavanja različit Grafički program se ne izvršava sinhrono (od početka do kraja, jedna naredba iza druge), već asinhrono Grafički program se sastoji od naredbi koje se izvršavaju kao reakcija na korisnikove aktivnosti nad komponentama grafičkog interfejsa programa 3
Klasični pristup: programski se određuje kada korisnik unosi ulazne podatke i kada dobija izlazne podatke Grafički pristup: korisnik određuje kada unosi ulazne podatke i kada dobija izlazne podatke (izbor iz menija, klik na dugme,...) Korisnikove aktivnosti sa fizičkim uređajima miša i tastature nad grafičkim elementima programa su drugi oblik ulaznih podataka (događaji) 4
Programiranje grafičkih programa je programiranje vođeno događajima (engl. event-driven programming) Grafički program dobija događaje kao ulaz Deo grafičkog programa koji reaguje na određeni događaj se naziva rukovalac događaja (engl. event listener, event handler) 5
Java grafički programi svoj korisnički interfejs grade integrisano sa ostalim naredbama Java grafički programi koriste klase iz dve standardne biblioteke za rad sa grafičkim komponentama Biblioteka AWT (Abstract Window Toolkit) do Java verzije 1.1 u paketu java.awt Biblioteka Swing od Java verzije 1.2 u paketu javax.swing 6
Biblioteka AWT podržava minimalni skup komponenti grafičkog interfejsa koje poseduju sve platforme koje podržavaju Javu Oslanja se na odgovarajući operativni sistem Izgleda podjednako osrednje na svim platformama Klase u paketima java.awt.* 7
Biblioteka Swing je napisana od nule Obezbeđuje veći broj složenijih grafičkih komponenti od biblioteke AWT Ne oslanja se na operativni sistem Jednako izgleda i radi na svim platformama Klase u paketima javax.swing.* Nazivi klasa počinju sa Jxxx 8
Grafički elementi za pravljenje korisničkog interfejsa Prozor (pravougaonik na ekranu) Okvir (permanentni prozor) Dijalog (privremeni prozor) Komponenta (element koji ima veličinu i poziciju na ekranu i proizvodi događaje) Kontejner (komponenta koja može obuhvatati druge komponente) 9
Okvir Prozor najvišeg nivoa (ne nalazi se unutar drugog prozora i ne može se dodati drugom prozora) Glavni prozor grafičkog programa Mogućnosti: može se otvoriti i zatvoriti, može mu se promeniti veličina, može obuhvatati druge komponente Klasa JFrame 10
Okvir 11
public class PrazanOkvir { public static void main(string[] args) { } } JFrame okvir = new JFrame("Prazan okvir"); okvir.setsize(300, 200); okvir.setlocation(100, 150); okvir.setdefaultcloseoperation(jframe.exit_on_close); okvir.setvisible(true); 12
Kontejneri (okvir, panel) Mogu se samostalno prikazati na ekranu Služe za grupisanje komponenti Komponente (dugme, oznaka, tekstualno polje, meni,...) Mogu se prikazati samo unutar nekog kontejnera 13
Primer: Grafičko programiranje 14
Primer: Grafičko programiranje JButton dugmeok = new JButton("OK"); JLabel oznakaime = new JLabel("Unesite svoje ime: "); JTextField tekstpoljeime = new JTextField("Ovde upišite svoje ime"); JCheckBox potvrdastudent = new JCheckBox("Student"); JRadioButton radiodugmezaposlen = new JRadioButton("Zaposlen"); JComboBox kombpoljegodina = new JComboBox(new String[]{"I godina", "II godina", "III godina", "IV godina"}); 15
Dodavanje komponenti kontejneru: add() public class TestGUIKomponente{ public static void main(string[] args) { // Konstruisanje glavnog prozora (okvira) JFrame okvir = new JFrame("Test GUI komponente"); okvir.setlocation(100, 150); okvir.setdefaultcloseoperation(jframe.exit_on_close); // Konstruisanje komponenti JButton dugmeok = new JButton("OK");... 16
} } // Konstruisanje panela za komponente JPanel panel = new JPanel(); // Smeštanje komponenti u panel panel.add(dugmeok);... // Smeštanje panela u okvir okvir.add(panel); okvir.pack(); okvir.setvisible(true); 17
Koordinate grafičkih elemenata okvir.setbounds(100, 150, 300, 200); 18
Razmeštanje komponenti unutar kontejnera Prilikom dodavanja komponente unutar kontejnera (metodom add()), automatski se određuje pozicija i veličina komponente Svaki kontejner ima podrazumevani postupak razmeštanja komponenti unutar njega Postupak razmeštanja se može promeniti metodom: public void setlayout(layoutmanager m) 19
Standardni postupci razmeštanja (engl. layout manager) FlowLayout GridLayout BorderLayout... 20
Primer: 21
Primer: 22
Rukovaoci događajima Programiranje grafičkih programa se zasniva na događajima Grafički program reaguje na razne vrste događaja Događaji se dešavaju u nepredvidljivim trenucima i po nepredvidljivom redosledu 23
Rukovaoci događajima Događaji su predstavljeni objektima klasa koje su naslednice klase EventObject Događaji su razvrstani prema tipu događaja događaji klika na dugme događaji rada sa mišem događaji rada sa tastaturom... 24
Rukovaoci događajima Mehanizam rukovanja događajima Komponenta u kojoj se događaj desio je izvor događaja Kada se desi događaj, JVM konstruiše objekat koji opisuje nastali događaj Konstruisani objekat događaja se prenosi tačno određenom metodu rukovaoca događaja i taj metod se poziva radi obrade događaja 25
Rukovaoci događajima Rukovalac događaja mora biti objekat klase koja implementira specijalni interfejs Rukovalac događaja se mora eksplicitno pridružiti komponenti koja je potencijalni izvor događaja 26
Rukovaoci događajima Odnos između klasa i interfejsa za rukovanje događajima 27
Rukovaoci događajima Tipovi događaja koje generišu komponente (izvori događaja) Tip događaja Interfejs rukovaoca događaja ActionEvent ActionListener MouseEvent MouseListener WindowEvent WindowListener KeyEvent KeyListener FocusEvent FocusListener ItemEvent ItemListener TextEvent TextListener ComponentEvent ComponentListener ContainerEvent ContainerListener...... 28
Rukovaoci događajima Standardna imena interfejsa i metoda Rukovalac događaja implementira odgovarajući XxxxListener interfejs Rukovalac događaja se pridružuje komponenti metodom addxxxxlistener() U rukovaocu događaja se izvršava tačno određeni metod koji obrađuje događaj 29
Rukovaoci događajima Primer: akcijski događaj (ActionEvent) za klik na dugme tasterom miša Akcijski događaj se obrađuje pomoću ActionListener objekta ActionListener objekat mora imati metod actionperformed() Taj metod se automatski poziva kada se desi akcijski događaj 30
Rukovaoci događajima Rukovalac događaja za klik na dugme mora biti objekat klase koja implementira interfejs ActionListener To obezbeđuje da rukovalac događaja za klik na dugme sadrži metod koji se poziva kada se desi događaj klika na dugme 31
Rukovaoci događajima Format klase RD koja predstavlja rukovaoca događaja i služi za konstruisanje ActionListener objekta: public class RD implements ActionListener {... public void actionperformed(actionevent e) { // Naredbe koje obrađuju // događaj klika na dugme } } 32
Rukovaoci događajima Primer: brojanje klikova na dugme 33