300 likes | 420 Views
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.
E N D
Objektno orijentisano programiranjevežbe – čas 12 Biljana Stojanović
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ć
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ć
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ć
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ć
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ć
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ć
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ć
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ć
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ć
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ć
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ć
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ć
Obrada događaja Biljana Stojanović
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ć
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ć
Primer Biljana Stojanović
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ć
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ć
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ć
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ć
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ć
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ć
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ć
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ć
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ć
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ć
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ć
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ć
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ć