DOGAĐAJI U JAVI
Da bi grafički korisnički interfejs(GUI) imao neku funkcionalnost, tj. da bi se omogućila interakcija korisnika sa GUI, potrebno je napraviti događaje u javi. Rad sa događajima u programiranju podrazumeva da kada se desi neki događaj u radu aplikacije, npr. klik na određenu komponentu swing paketa ili na određen taster na tastaturi pozove određena metoda kao reakcija na događaj.
Da bi se na neki događaj odreagovalo, potreban je osluškivač događaja, tj. objekat čija će odgovarajuća metoda biti pozvana da se izvrši kao reakcija na taj događaj.
U radu sa događajima, za davanje funkcionalnosti objektima osluškivačima događaje koriste se interfejsi iz javine biblioteke klasa. To su:
Osluškivač događaja je objekat koji implementira neki od interfejsa za davanje funkcionalnosti događajima.
Da bi se na neki događaj odreagovalo, potreban je osluškivač događaja, tj. objekat čija će odgovarajuća metoda biti pozvana da se izvrši kao reakcija na taj događaj.
U radu sa događajima, za davanje funkcionalnosti objektima osluškivačima događaje koriste se interfejsi iz javine biblioteke klasa. To su:
- ActionListener - upotrebljava se kod klika na određenu komponentu(npr. dugme)
- ItemListener - upotrebljava se kod klika na stavku padajuće liste ComboBox-a
- KeyListener - klik na određen taster na tastaturi
Osluškivač događaja je objekat koji implementira neki od interfejsa za davanje funkcionalnosti događajima.
VIDEO LEKCIJE
Video 1: Događaj klika dugmeta |
Video 2: Inventar aplikacija |
U ovom videu možete videti kako se implementira događaj klika dugmeta. klikom na dugme promeniće se boja pozadine panela.
|
Video pokazuje kako se kreira grafička aplikacija od početka do kraja. Kroz ovaj video može se videti kako se kreira jednostavan GUI, implementira događaj dugmeta i kako da se sa polja za tekst preuzimaju brojevi kao tekst i kako se postavlja rezultat izračunavanja na polje za tekst(JTextField).
|
|
|
Primer: Događaj klika dugmeta:
Klik dugmeta proizvodi objekat ActionEvent klase i ovaj objekat nosi informacije o tom objektu. Da bi se reagovalo na klik dugmeta potreban je “osluškivač događaja”, tj. objekat neke klase koja implementira interfejs ActionListener. Metoda koja će se pozvati kao reakcija događaja je definisana u interfejsu i zove se actionPerformed i kao argument te metode dobija objekat klase ActionEvent.
Da bi ovo pokazali kreiraćemo jedno dugme i jednu labelu sa tekstom kao na slici:
Da bi ovo pokazali kreiraćemo jedno dugme i jednu labelu sa tekstom kao na slici:
Posmatrajmo sledeći kod unutar glavne (main ) metode:
Da bi dodali događaj klika dugmeta, prvo treba da dodamo osluškivač događaja. To je objekat klase koja implementira interface ActionListener. Pošto je to interfejs iz javine biblioteke klasa. treba ga samo povezati sa tekućom klasom pomoću službene reči implements.
Vidimo da je prikazana greška. To je zbog toga što smo u obavezi da apstraktne metode iz interfejsa ActionListener u klasi Dugme dovršimo jer smo je pomoću reči interface povezali sa ovom klasom. Klikom na lampicu sa leve strane netbeans će uneti metodu koja je u interfejsu apstraktna.
U ovom interfejsu treba implementirati u stvari samo jednu metodu actionPerformed, koja će se pozivati kao reakcija na događaj klika dugmeta.
Treba obrisati sadržaj koji je ubačen automatski posle klika na lampicu i napisati sopstveni kod, onaj koji se izvršava posle klika dugmeta.
Sada dalje pravimo objekat za osluškivanje događaja:
Sada dalje pravimo objekat za osluškivanje događaja:
Moramo takođe naznačiti komponentu koja se osluškuje, tako što toj komponenti dodamo osluškivač. Ta komponenta je dugme, a osluškivač dodajemo kao na slici:
Sada bi metoda actionPerformed trebalo da se poziva kao reakcija na klik dugmeta.
Proveru da se ta metoda zaista poziva dobićemo ako u toj metodi npr napišemo kod koji će ispisati neku poruku na labelu. Tekst na labelu ispisujemo metodom setTekst:
Proveru da se ta metoda zaista poziva dobićemo ako u toj metodi npr napišemo kod koji će ispisati neku poruku na labelu. Tekst na labelu ispisujemo metodom setTekst:
Na slici se vidi da kad posle reference objekta stavimo operator “.” ne otvara se lista atributa i metoda objekta label. Pošto je ta labela kreirana u main metodi kao lokalna u ovoj drugoj metodi nije dostupna. Da bi bila dostupna potrebno je da bude deklarisana kao atribut za klasu:
Deklaracija je sada prebačena izvan glavne(main) metode ali još uvek unutar klase tako da predstavlja atribut za klasu. Sada ponovo pokušavamo da pristupimo metodama tog objekta u metodi actionPerformed:
Sada više nema grešaka. Pokrenimo aplikaciju i posle klika dugmeta tekst u labeli se menja u “Kliknuto je dugme”, što pokazuje da je metoda actionPerformed zaista pozvana kad se desi događaj klika dugmeta.
Događaj tastature(KeyListener)
Događaj tastature proizvode pritisnuti ili otpušteni tasteri sa tastature. Da bi aplikacija odreagovala na pomenute događaje potreban je objekat koji osluškuje pomenute događaje i koji ima u sebi metode koje će se pozvati kao reakcija na te događaje. Ove metode su definisane interfejsom KeyListener. Pomenute metode su:
KeyTyped(ActionEvent e) - Kratko pritiskanje tastera
KeyPressed(ActionEvent e) - Dugo pritiskanje i zadržavanje pritiskanja tastera
KeyReleased(ActionEvent e) - Otpuštanje tastera
Klasa pomoću koje se kreira objekat koji osluškuje pomenute događaje mora da implementira interfejs KeyListener. Takođe je potrebno dodati ovaj objekat(osluškivač) komponenti koja se osluškuje. Ova komponenta treba da ima trenutni fokus. Pokažimo to na sledećem primeru.
KeyTyped(ActionEvent e) - Kratko pritiskanje tastera
KeyPressed(ActionEvent e) - Dugo pritiskanje i zadržavanje pritiskanja tastera
KeyReleased(ActionEvent e) - Otpuštanje tastera
Klasa pomoću koje se kreira objekat koji osluškuje pomenute događaje mora da implementira interfejs KeyListener. Takođe je potrebno dodati ovaj objekat(osluškivač) komponenti koja se osluškuje. Ova komponenta treba da ima trenutni fokus. Pokažimo to na sledećem primeru.
Primer: Pomeranje objekta pomoću tastera strelica u 4 pravca
Napraviti aplikaciju koja iscrtava objekat kruga veličine 30*30px na panelu i obezbediti njegovo pomeranje u 4 pravca: levo, desno, gore, dole pritiskom na tastere strelica, kako je prikazano na sledećoj slici:
Video pokazuje kako treba implementirati događaje tastature u programskom jeziku JAVA. Jednostavna grafička aplikacija koja omogućava korisniku da pritiskom na strelice pomera grafički objekat u 4 normalna pravca: levo,desno, gore, dole. Interfejs: KeyListener
|
Kreirajmo prvo početni prozor aplikacije(JFrame). Za to nam treba sledeći kod:
Kreiran je prozor dimenzija 500*500 px i na njega je dodata tabla, panel po kome će se kretati objekat. Tabla je klasa koja nasleđuje JPanel i postavljen je na sredini prozora(win.setLocationRelativeTo(null);)
Tabla je klasa čiji objekat treba da implementira interfejs KeyListener, što znači da će objekat te klase biti osluškivač, ali će takođe biti i objekat koji se osluškuje. Kreirajmo sada klasu, dodajmo konstruktor i implementiraćemo pomenuti interfejs:
Tabla je klasa čiji objekat treba da implementira interfejs KeyListener, što znači da će objekat te klase biti osluškivač, ali će takođe biti i objekat koji se osluškuje. Kreirajmo sada klasu, dodajmo konstruktor i implementiraćemo pomenuti interfejs:
Metoda addKeyListener( ) dodaje objekat klase Tabela(this) kao osluškivač događaja samom sebi, tj. tabela je takođe i objekat koji se osluškuje. Ona mora imati fokus i zato je pozvana metoda setFocusable(true).
Dodavanje "implements KeyListener" pored naziva klase, obavezuje nas da implementiramo metode iz tog interfejsa i to treba uraditi na sledeći način: Klikom na lampicu treba odabrati "implement all abstract methods" i pomenute metode, još ne implementirane, biće ubačene u telo klase, kao što se vidi na sledećoj slici:
Dodavanje "implements KeyListener" pored naziva klase, obavezuje nas da implementiramo metode iz tog interfejsa i to treba uraditi na sledeći način: Klikom na lampicu treba odabrati "implement all abstract methods" i pomenute metode, još ne implementirane, biće ubačene u telo klase, kao što se vidi na sledećoj slici:
Vidimo da se u telu tih metoda proizvodi izbacivanje izuzetka "UnsupportedOperationException" ukoliko se ove metode ostave ne implementiranim.
Pre nego što implementiramo ove metode treba da kreiramo objekat klase Ellipse2D.Double iz paketa "java.awt.geom", koji se definiše kao polje za datu klasu.
Podrazumevane vrednosti širine, visine i položaja objekta(krug) definisane su konstruktorom.
Takođe treba prepraviti metodu za crtanje "paint" nasleđenu iz JComponent, koja je zadužena za iscrtavanje objekta, što je prikazano na sledećoj slici:
Pre nego što implementiramo ove metode treba da kreiramo objekat klase Ellipse2D.Double iz paketa "java.awt.geom", koji se definiše kao polje za datu klasu.
Podrazumevane vrednosti širine, visine i položaja objekta(krug) definisane su konstruktorom.
Takođe treba prepraviti metodu za crtanje "paint" nasleđenu iz JComponent, koja je zadužena za iscrtavanje objekta, što je prikazano na sledećoj slici:
Više o crtanju pomoću metode paint pogledajte u sledećoj lekciji Crtanje u prozoru
U ovom primeru ćemo implementirati samo metodu KeyPressed( ), dok u ostale dve metode treba obrisati ili iskomentarisati kod koji izbacuje izuzetak "UnsupportedOperationException".
Pomenute metode kao parametar dobijaju objekat klase KeyEvent koji nosi informacije o samom događaju. Npr. pomenuti objekat možemo iskoristiti da saznamo koji taster je proizveo događaj, tj. njegov kod:
e.getKeyCode() i to se dodeljuje promenljivoj key.
Posle određivanja koji taster je korisnik pritisnuo, pomoću if-else if naredbe, vrši se premeštanje objekta u određenom pravcu za 1 px.
Za premeštanje se koristi metoda setFrame( ) koja se primenjuje na postojeći objekat, dakle, nije potrebno kreirati novi.
e.getKeyCode() i to se dodeljuje promenljivoj key.
Posle određivanja koji taster je korisnik pritisnuo, pomoću if-else if naredbe, vrši se premeštanje objekta u određenom pravcu za 1 px.
Za premeštanje se koristi metoda setFrame( ) koja se primenjuje na postojeći objekat, dakle, nije potrebno kreirati novi.
Događaj tastature-primer 2:
Primer se može primeniti kao deo 2D igrice. Na prozoru sa prikazom svemira u pozadini postaviti svemirski brod i omogućiti njegov pomeranje levo, desno, gore, dole upotrebom KeyListener interfejsa. Sledeći video pokazuje kako to treba uraditi.
|
|
Prethodno
|<Grafika u javi |
Sledeće
Crtanje u prozoru>| |