1 / 30

Objektno orijentisano programiranje vežbe – čas 1 2

Objektno orijentisano programiranje vežbe – čas 1 2. Biljana Stojanović. Meniji (JMenuBar). JMenuBar klasa definiše liniju menija koja se najčešće nalazi na vrhu prozora aplikacije.

chyna
Download Presentation

Objektno orijentisano programiranje vežbe – čas 1 2

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Objektno orijentisano programiranjevežbe – čas 12 Biljana Stojanović

  2. Meniji (JMenuBar) • JMenuBar klasa definiše liniju menija koja se najčešće nalazi na vrhu prozora aplikacije. • JMenu objekat predstavlja element na vrhu menija. Klikom na njega dobija se padajuća (drop down) lista elemenata menija. • Element menija definisani su klasom JMenuItem. • JPopupMenu klasa definiše kontekstni meni koji se najčešće koristi da se prikaže pri desnom kliku na komponentu. • JCheckBoxMenuItem je element menija sa checkbox-om. • JRadioButtonMenuItem definiše element menija koji je deo grupe gde samo jedan element može da bude obeležen u datom trenutku. • Grupa se kreira dodavanjem JRadioButtonMenuItem objekata ButtonGroup objektu. Biljana Stojanović

  3. Kreiranje menija • Dodavanje stavke meniju: • JMenuItem add(String) - kreira stavku sa datim imenom i dodaje je na kraj datog menija JMenuItem newItem = fileMenu.add(“New”); • JMenuItem add(JMenuItem) JMenuItem newItem = new JMenuItem(“New”); fileMenu.add(newItem); • Druge metode klase JMenuItem: • void setEnabled(boolean b); - ako je b true, stavka je dostupna, inače je nedostupna. Podrazumevano stanje je dostupno. • void setText(String label) – postavlja labelu stavke na dati string • String getText() – vraća labelu stavke Biljana Stojanović

  4. Postavljanje prečica (shortcut) • Tipična prečica: Alt + slovo iz labele stavke menija. fileMenu.setMnemonic(‘F’); • setMnemonic() je metod koji se nasleđuje iz klase AbstractButton, pa ga sve nasleđene klase imaju. • Efekat metoda je postavljanje prečice i podvlačenje slova iz prečice u labeli menija. • Naravno, prečica za svaki meni u liniji menija mora biti jedinstvena! Biljana Stojanović

  5. Akceleratori • Akcelerator (accelerator) je kombinacija tastera koje unosimo da bi obeležili stavku iz drop-down menija bez prolaska kroz proces prikazivanja menija. • Primer: Ctrl + slovo. lineItem.setAccelerator(KeyStroke.getKeyStroke(‘L’, InputEvent.CTRL_DOWN_MASK); • Statički metod getKeyStroke() iz klase javax.swing.KeyStroke vraća KeyStroke objekat koji odgovara argumentima (prvi je karakter, a drugi je neki od modifajera). • Modifajeri se zadaju kao bitovske konstante zadate u klasi InputEvent iz paketa java.awt.event. • Ova klasa definiše konstante koje zadaju kontrolne tastere na tastaturi i mišu. Biljana Stojanović

  6. Akceleratori • Nas trenutno interesuju: • SHIFT_DOWN_MASK • ALT_DOWN_MASK • META_DOWN_MASK • CTRL_DOWN_MASK • Kombinacija se izražava kao: InputEvent.ALT_DOWN_MASK + InputEvent.CTRL_DOWN_MASK; • Naravno, svaka kombinacija koja se dodeli nekoj stavki menija mora da bude jedinstvena. Biljana Stojanović

  7. Apleti • Apleti su programi koji su deo web-strane. • Glavna podrazumevana ograničenja za aplete su: • aplet ne sme da ima pristup nijednom fajlu na lokalnom računaru • aplet ne može da pozove nijedan drugi program sa lokalnog računara • aplet ne može da komunicira ni sa jednim računarom sem onog na kome se nalazi HTML strana koja sadrži aplet. Biljana Stojanović

  8. Apleti • JApplet klasa uključuje sledeće metode koje se automatski pozivaju od strane web pretraživača ili applet view-era koji kontroliše aplet: • void init() – inicijalizacija apleta; poziva se jednom od strane pretraživača kada aplet počne da se izvršava • void start() – startuje se obrada za aplet; poziva se od strane pretraživača odmah nakon init(); takođe se poziva ako se korisnik vrati na tekuću .html stranu nakon što ju je napustio. • void stop() – poziva se kada se korisnik pomeri sa strane koja sadrži aplet; stopiraju se sve operacije startovane metodom start() • void destroy() – poziva se nakon metoda stop() kada se pretraživač zatvori; ovde se mogu osloboditi svi resursi koje je aplet koristio; Biljana Stojanović

  9. Prevođenje aplikacije u aplet • Prevođenje aplikacije u aplet se može relativno lako izvršiti, imajući u vidu ograničenja za aplete. • Aplikacija startuje metodom main(). Za aplet se ne poziva main(), već init(), tako da je aplikacijskoj klasi potrebno dodati metod init(). • Druga očigledna razlika je što aplet uvek nasleđuje klasu JApplet. Biljana Stojanović

  10. Primer • Klasa Sketcher nasledjuje klasu JApplet. • Metod init() sada radi većinu stvari koje je radio metod main(). • Metod main() kreira instancu klase Sketcher i čuva je u statičkoj članici. Nakon toga main() poziva metod init() za novokreirani Sketcher objekat. • Kada se Sketcher pokrene kao aplikacija, izvršavanje kreće od metoda main() a rezultat je prozor aplikacije koji se prikazuje. • Kada se Sketcher pokrene kao aplet, Sketcher objekat će biti instanciran okolinom koja se izvršava od strane apleta, ali polje aplikacija neće biti inicijalizovano, dakle, biće podrazumevano null. • Ovo nam daje mogućnost da testiramo polje aplikacija u init() metodu kako bi se odlučilo da li da se pozove metod setDefaultCloseOperatin() nad objektom prozor. Biljana Stojanović

  11. Primer • Napomena!Nije poželjno da se aplet završi kada se zatvori prozor jer to nije u skladu sa načinom rada apleta, tako da ne treba navoditi metod setDefaultCloseOperation(EXIT_ON_CLOSE); • Čak i ako se Sketcher pokrene kao aplet, prozor aplikacije će se pojaviti kao poseban prozor iz apletviwer prozora – i dalje je pozicioniran u odnosu na ekran. • Naravno, kada implementiramo čitanje iz falja i upis u fajl, više neće biti dozvoljeno izvođenje Sketcher klase iz klase JApplet jer se time krši pravilo da aplet ne sme da pristupa fajlovima na lokalnoj mašini! • Takođe, nije preporučljivo kreirati okvirne prozore unutar apleta, dobiće se upozorenje iz appletview-era. Biljana Stojanović

  12. Obrada događaja • Za razliku od konzolnih programa, gde je tok izvršenja programa predefinisan, kod Windows aplikacija program je vođen onim što radimo sa GUI-jem. • Selektovanje stavke menija, klik na dugme mišem ili preko tastature, prouzrokuju odgovarajuće akcije u samom programu. • Ovakve akcije najpre prepoznaje operativni sistem. Na primer, kada kliknemo mišem, operativni sistem to registruje i beleži poziciju kursora na ekranu. Nakon toga, OS odlučuje koja aplikacija kontroliše prozor gde se nalazi kursor u trenutku pritiska dugmeta i obaveštava aplikaciju da je pritisnuto dugme miša. Biljana Stojanović

  13. Obrada događaja • Signali koje program prima od operativnog sistema kao razultat neke naše akcije predstavljaju događaje. • Svaki događaj koji program prepozna povezan je sa jednim ili više metoda koji se automatski poziva kada se događaj desi i koji vrši obradu događaja. • Program nije obavezan da reaguje na određeni događaj. Na primer, ako samo pomerimo miša, program ne mora da poziva bilo kakav kod da reaguje na tu akciju. Biljana Stojanović

  14. Obrada događaja Biljana Stojanović

  15. Primer • Neka korisnik klikne na dugme u GUI-ju našeg programa, događaj koji se generiše kao reakcija na klik je povezan sa JButton objektom. • Kada se klikne na dugme kreira se novi objekat koji predstavlja događaj – u ovom slučaju objekat tipa ActionEvent. On sadrži informacije o događaju i njegovom izvoru. • Objekat događaja koji odgovara kliku na dugme biće predat listener objektu koji je prethodno registrovan za ovu vrstu događaja. Biljana Stojanović

  16. Primer • Predavanje događaja listener objektu znači da izvor događaja poziva određeni metod u listener objektu, a kao argument mu predaje objekat događaja. • Listener objekat može da “sluša” događaje za jedan ili više različitih objekata. • Klasa koja predstvlja listener mora da implementira listener interface. U našem slučaju, to je interfejs ActionListener. • Kod koji treba da odgovori na događaj je deo metoda deklarisanog u interfejsu – u ovom slučaju radi se o metodu actionPerformed(). • Da bi omogućili da listener sluša događaje klika mišem, pozivamo addActionListener() metod za JButton objekat i predajemo listener objekat kao argument metoda. Biljana Stojanović

  17. Primer Biljana Stojanović

  18. Obrada događaja • Način na koji se događaji obrađuju u Javi, koristeći listener objekat, nazivamo model delegiranja događaja, jer se reagovanje na događaje ne sprovodi od strane samih objekata, već preko listener objekata. • Ipak, ne zahtevaju svi događaji obradu preko listener-a. Neke komponente mogu da obrade svoje događaje. Biljana Stojanović

  19. Obrada događaja • Važno je da se sav kod za obradu događaja izvršava u istoj niti, koja se razlikuje od one u kojoj se izvršava metod main(). • To podrazumeva da dok se izvršava kod za obradu jednog događaja, ne mogu se procesirati drugi događaji. • Javax.swing.Utilities klasa obezbeđuje statički metod invokeLater() koji kao argument očekuje tip Runnable (tj. referencu na objekat tipa koji implementira interfejs Runnable). Biljana Stojanović

  20. Obrada događaja • Najjednostavniji način da se kreira Runnable objekat koji će kreirati GUI za aplikaciju jeste upotrebom anonimne klase. • Kada se pokrene program, kreiraju se tri .class fajla – dva odgovaraju Sketcher i SketcherFrame klasama, a treći anonimnoj klasi. • Ceo kod za kreiranje GUI-a koji je bio deo main() metoda, sada je u odvojenoj statičkoj metodi. • Main() poziva statički metod invokeLater(). On izvršava run() metod za objekat koji je prosleđen kao argument niti za obradu događaja nakon što su procesirani svi događaji koji su čekali. • Predajemo objekat anonimne klase koja implementira interfejs Runnable metodu invokeLater(). Za Runnable klasu je jedino bitno da definiše run() metod. Biljana Stojanović

  21. Klase događaja • Na najvišem nivou razlikujemo dve široke klase događaja: • događaji niskog nivoa – vezani za tastaturu ili miš ili su to događaji vezani za operacije na prozoru (npr. zatvaranje). Primeri: “Pomeren je miš”, “Pritisnut je taster”, ... • semantički događaji – specifični događaji kao što je pritiskanje dugmeta klikom na njega da bi se izvršila neka akcija. Primeri: “Pritisnuto je OK dugme”, “Obeležena je Open stavka menija”, ... Biljana Stojanović

  22. Klase događaja • Najveći broj događaja koji se odnose na GUI programa predstavljen je klasama definisanim u java.awt.event paketu, dok se u javax.swing.event paketu nalaze klase za događaje koji su specifični za Swing komponente. Biljana Stojanović

  23. Događaji niskog nivoa • FocusEvent – događaji koji potiču od toga da li komponenta dobija ili gubi fokus sa tastature; samo ona koja je u fokusu može da prima ulaz sa tastature – ona je ili istaknuta, ili ima prikazan kursor • MouseEvent – događaji koji su rezultat korisničke akcije sa mišem (pomeranje, pritisak na dugme...) • KeyEvent – potiču usled pritiska dugmeta na tastaturi • WindowEvent – predstavljaju događaje vezane za prozor Biljana Stojanović

  24. Događaji niskog nivoa (MouseEvent) • MouseEvent – događaji koji su rezultat korisničke akcije mišem (pomeranje/pritisak na dugme itd). • Svaki događaj mišem opisan je u klasi MouseEvent tako što je identifikovan statičkom konstantom: • MOUSE_CLICKED, MOUSE_ENTERED, MOUSE_MOVED, MOUSE_PRESSED, MOUSE_EXITED, MOUSE_WHEEL, MOUSE_DRAGGED, MOUSE_RELEASED Biljana Stojanović

  25. Osluškivači niskog nivoa • Da bi kreirali klasu koja definiše osluškivač događaja, naša klasa mora da implementira listener interfejs. • Svi listener interfejsi su izvedeni iz interfejsa java.util.EventListener. • Najbitniji listener interfejsi: • WindowListener • WindowFocusListener • MouseListener • MouseMotionListener • MouseWheelListener • KeyListener • FocusListener Biljana Stojanović

  26. Osluškivači niskog nivoa (MouseListener) • MouseListener - definiše metode za obradu događaja vezanih za neke akcije mišem. • Metodi: • mouseClicked(MouseEvent e) – poziva se kada je kliknuto mišem na komponentu, tj. kada je dugme miša pritisnuto i pušteno. • mousePressed(MouseEvent e) – pritisnuto dugme miša nad komponentom • mouseReleased(MouseEvent e) – otpušteno dugme miša nad komponentom • mouseEntered(MouseEvent e) – kursor miša ulazi na površinu koju zauzima komponenta • mouseExited(MouseEvent e) – kursor miša napušta površinu koju zauzima komponenta Biljana Stojanović

  27. Adapterske klase • Adapterska klasa je klasa koja implementira listener interfejs sa metodama koje nemaju sadržaj, tako da ne rade ništa. • Ideja je da naša klasa bude izvedena iz apstraktne klase, te je dovoljno implementirati samo metode koji nas interesuju. • java.awt.event – FocusAdapter, WindowAdapter, KeyAdapter, MouseAdapter, MouseMotionAdapter • javax.swing.event - MouseInputAdapter Biljana Stojanović

  28. Semantički događaji • Semantički događaji se odnose na operacije nad komponentama GUI-a. • ActionEvent – kada se izvodi akcija kao što je klik na dugme ili stavku menija • ItemEvent – kada se komponenta selektuje (obeleži) ili deselektuje • AdjustmentEvent – kada se podešava neki podesiv objekat (npr. scrollbar) • Kao i kod događaja niskog nivoa, najzgodniji način za obradu semantičkih događaja je korišćenje osluškivača. Biljana Stojanović

  29. Semantički događaji • ActionEvent proizvode sledeći objekti: • Dugmeta: JButton, JToggleButton, JCheckBox • Meniji: JMenuItem, JMenu, JCheckBoxMenuItem, JRadioButtonMenuItem • Tekst: JTextField • ItemEvent proizvode sledeći objekti: • Dugmeta: JButton, JToggleButton, JCheckBox • Meniji: JMenuItem, JMenu, JCheckBoxMenuItem, JRadioButtonMenuItem • AdjustmentEvent proizvode objekti klase JScrollbar Biljana Stojanović

  30. Semantički događaji • Postoji osluškivački interfejs za svaki od tri tipa semantičkih događaja i svaki deklariše jedan metod: • ActionListener void actionPerformed(ActionEvent e) • ItemListener void itemStateChanged(ItemEvent e) • AdjustmentListener void adjustmentValueChanged(AdjustmentEvent e) Biljana Stojanović

More Related