Događaji u Javi
Da bi grafički korisnički interfejs (GUI) imao interaktivnost, potrebno je implementirati događaje u Javi. Rad sa događajima omogućava aplikaciji da reaguje na korisničke akcije, kao što su klikovi na dugmad ili pritisci na tastere. Kada se dogodi događaj, poziva se određena metoda kao reakcija. Da bi se na događaj reagovalo, potreban je osluškivač događaja, objekat čija se metoda poziva kao odgovor 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
Dešavanjem nekog događaja kreira se objekat klase koja nasleđuje klasu Event(ActionEvent, KeyEvent, ItemIvent itd.). Ovaj objekat nosi informacije o samom događaju(šta je izvor događaja npr) i prosleđuje se metodi koja se poziva kao reakcija na taj događaj.
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:

Posmatrajmo sledeći kod unutar glavne (main ) metode:
public static void main(String[] args) {
System.out.println("Radi");
JFrame win = new JFrame("Događaj dugmeta");
win.setSize(500, 300);
win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
win.getContentPane().setLayout(new FlowLayout());
// labela sa tekstom
JLabel labela = new JLabel("Nije kliknuto ni jedno dugme");
labela.setSize(150, 25);
win.getContentPane().add(labela);
// dugme
JButton dugme = new JButton("Klikni");
dugme.setSize(100, 25);
win.getContentPane().add(dugme);
win.setVisible(true);
}
Da bi dodali događaj klika dugmeta, prvo treba da dodamo osluškivač događaja. To je objekat klase koja implementira interfaceActionListener. Pošto je to interfejs iz javine biblioteke klasa. treba ga samo povezati sa tekućom klasom pomoću službene reči implements.
public class Dugme implements ActionListener { // NetBeans podvlači grešku: metoda actionPerformed još nije napisana
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
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.
win.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
throw new UnsupportedOperationException("Not supported yet."); // ovo NetBeans ubacuje sam – treba obrisati
}
}
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:
public class Dugme implements ActionListener {
// osluškivač događaja
static Dugme osluskivac = new Dugme();
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
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:
dugme.setSize(100, 25);
win.getContentPane().add(dugme);
dugme.addActionListener(osluskivac); // dugme dobija osluškivača
win.setVisible(true);
}
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:

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:
public class Dugme implements ActionListener {
// osluškivač događaja
static Dugme osluskivac = new Dugme();
static JLabel labela; // labela je sada atribut klase – vidi se i u actionPerformed
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
JFrame win = new JFrame("Događaj dugmeta");
win.setSize(500, 300);
win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
win.getContentPane().setLayout(new FlowLayout());
// labela sa tekstom
labela = new JLabel("Nije kliknuto ni jedno dugme");
labela.setSize(150, 25);
win.getContentPane().add(labela);
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:
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class Dugme implements ActionListener {
// osluškivač događaja
static Dugme osluskivac = new Dugme();
static JLabel labela;
public static void main(String[] args) {
JFrame win = new JFrame("Događaj dugmeta");
win.setSize(500, 300);
win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
win.getContentPane().setLayout(new FlowLayout());
// labela sa tekstom
labela = new JLabel("Nije kliknuto ni jedno dugme");
labela.setSize(150, 25);
win.getContentPane().add(labela);
// dugme
JButton dugme = new JButton("Klikni");
dugme.setSize(100, 25);
win.getContentPane().add(dugme);
dugme.addActionListener(osluskivac);
win.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
labela.setText("Kliknuto je dugme"); // reakcija na klik
}
}
Ceo program sa prethodnih slika, sa ispisom teksta na labeli posle klika.

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.
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:
public class DogadjajTastature {
public static void main(String[] args) {
JFrame win = new JFrame("Dogadjaj tastature");
Tabla tabla = new Tabla();
win.add(tabla);
win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
win.setSize(500, 500);
win.setLocationRelativeTo(null); // prozor na sredini ekrana
win.setResizable(false);
win.setVisible(true);
}
}
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:
public class Tabla extends JPanel implements KeyListener {
public Tabla() {
brod = new SvemirskiBrod(this);
addKeyListener(this); // dodaje osluškivač događaja tastature
setFocusable(true);
setDoubleBuffered(true);
}
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:
@Override
public void keyTyped(KeyEvent arg0) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void keyPressed(KeyEvent arg0) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void keyReleased(KeyEvent arg0) {
throw new UnsupportedOperationException("Not supported yet.");
}
}
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:
SvemirskiBrod brod;
final int TABLA_WIDTH = 600;
final int TABLA_HEIGHT = 600;
private final String svemir = "slike/space.jpg";
@Override
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2 = (Graphics2D)g;
// iscrtava svemir (slika razvučena preko cele table)
ImageIcon ii = new ImageIcon(svemir);
g2.drawImage(ii.getImage(), 0, 0, TABLA_WIDTH, TABLA_HEIGHT, 0, 0,
ii.getImage().getWidth(null), ii.getImage().getHeight(null), this);
// iscrtava brod
g2.drawImage(brod.getImage(), (int)brod.getX(), (int)brod.getY(), this);
}
Više o crtanju pomoću metode paint pogledajte u sledećoj lekciji Crtanje u prozoruU ovom primeru ćemo implementirati samo metodu KeyPressed( ), dok u ostale dve metode treba obrisati ili iskomentarisati kod koji izbacuje izuzetak "UnsupportedOperationException".
@Override
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
double x = objekat.getX();
double y = objekat.getY();
if (key == KeyEvent.VK_UP) {
objekat.setFrame(x, y - 1, OBJ_WIDTH, OBJ_HEIGHT);
}
if (key == KeyEvent.VK_DOWN) {
objekat.setFrame(x, y + 1, OBJ_WIDTH, OBJ_HEIGHT);
}
if (key == KeyEvent.VK_LEFT) {
objekat.setFrame(x - 1, y, OBJ_WIDTH, OBJ_HEIGHT);
}
if (key == KeyEvent.VK_RIGHT) {
objekat.setFrame(x + 1, y, OBJ_WIDTH, OBJ_HEIGHT);
}
repaint(); // ponovo iscrtava tablu sa novim položajem
}
@Override
public void keyReleased(KeyEvent arg0) {
// throw new UnsupportedOperationException("Not supported yet.");
}
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.
Događaj tastature-primer 2
Napredne tehnike obrade događaja u Swing-u i JavaFX-u
Java nudi bogat sistem za rad sa događajima u GUI aplikacijama, a napredne tehnike obrade događaja omogućavaju efikasnije i fleksibilnije interakcije korisnika.
1. Swing – Lambda izrazi i anonimne klase: U Swing-u se događaji najčešće obrađuju pomoću anonimnih klasa ili lambda izraza (Java 8+), što omogućava kraći i čitljiviji kod. Na primer:
JButton button = new JButton("Klikni me");
button.addActionListener(e -> System.out.println("Dugme je kliknuto!"));2. JavaFX – Property Binding i Event Filters: JavaFX uvodi property binding, što omogućava automatsko osvežavanje komponente kada se promeni povezana vrednost, kao i Event Filters koji se koriste za obradu događaja pre nego što stignu do ciljanog čvora. Na primer:Button button = new Button("Klikni me");
button.addEventFilter(MouseEvent.MOUSE_CLICKED, e -> System.out.println("Klik pre nego što dugme obradi događaj"));
3. U poređenju: JavaFX nudi moderniji dizajn, animacije i alate za prilagođavanje interakcija sa korisnikom, dok Swing pruža osnovne komponente i lakoću integracije sa postojećim Java aplikacijama.
Ove tehnike omogućavaju da se efikasno upravlja događajima, kao i da se unapredi UX kroz elegantne i prilagodljive komponente.
Proveri znanje
Otvori kviz
Kviz: Događaji u Javi
1. Šta je događaj (event)?
2. Koji interfejs reaguje na klik dugmeta?
3. Šta radi dugme.addActionListener(...)?
4. Koji interfejs osluškuje tastaturu?
| 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>| |
DOGAĐAJI U JAVI
Da bi grafički korisnički interfejs (GUI) imao interaktivnost, potrebno je implementirati događaje u Javi. Rad sa događajima omogućava aplikaciji da reaguje na korisničke akcije, kao što su klikovi na dugmad ili pritisci na tastere. Kada se dogodi događaj, poziva se određena metoda kao reakcija. Da bi se na događaj reagovalo, potreban je osluškivač događaja, objekat čija se metoda poziva kao odgovor 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:
public static void main(String[] args) {
System.out.println("Radi");
JFrame win = new JFrame("Događaj dugmeta");
win.setSize(500, 300);
win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
win.getContentPane().setLayout(new FlowLayout());
// labela sa tekstom
JLabel labela = new JLabel("Nije kliknuto ni jedno dugme");
labela.setSize(150, 25);
win.getContentPane().add(labela);
// dugme
JButton dugme = new JButton("Klikni");
dugme.setSize(100, 25);
win.getContentPane().add(dugme);
win.setVisible(true);
}
public class Dugme implements ActionListener { // NetBeans podvlači grešku: metoda actionPerformed još nije napisana
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
win.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
throw new UnsupportedOperationException("Not supported yet."); // ovo NetBeans ubacuje sam – treba obrisati
}
}
Sada dalje pravimo objekat za osluškivanje događaja:
public class Dugme implements ActionListener {
// osluškivač događaja
static Dugme osluskivac = new Dugme();
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
dugme.setSize(100, 25);
win.getContentPane().add(dugme);
dugme.addActionListener(osluskivac); // dugme dobija osluškivača
win.setVisible(true);
}
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:
public class Dugme implements ActionListener {
// osluškivač događaja
static Dugme osluskivac = new Dugme();
static JLabel labela; // labela je sada atribut klase – vidi se i u actionPerformed
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
JFrame win = new JFrame("Događaj dugmeta");
win.setSize(500, 300);
win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
win.getContentPane().setLayout(new FlowLayout());
// labela sa tekstom
labela = new JLabel("Nije kliknuto ni jedno dugme");
labela.setSize(150, 25);
win.getContentPane().add(labela);
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class Dugme implements ActionListener {
// osluškivač događaja
static Dugme osluskivac = new Dugme();
static JLabel labela;
public static void main(String[] args) {
JFrame win = new JFrame("Događaj dugmeta");
win.setSize(500, 300);
win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
win.getContentPane().setLayout(new FlowLayout());
// labela sa tekstom
labela = new JLabel("Nije kliknuto ni jedno dugme");
labela.setSize(150, 25);
win.getContentPane().add(labela);
// dugme
JButton dugme = new JButton("Klikni");
dugme.setSize(100, 25);
win.getContentPane().add(dugme);
dugme.addActionListener(osluskivac);
win.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
labela.setText("Kliknuto je dugme"); // reakcija na klik
}
}
Ceo program sa prethodnih slika, sa ispisom teksta na labeli posle klika.
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.
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:public class DogadjajTastature {
public static void main(String[] args) {
JFrame win = new JFrame("Dogadjaj tastature");
Tabla tabla = new Tabla();
win.add(tabla);
win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
win.setSize(500, 500);
win.setLocationRelativeTo(null); // prozor na sredini ekrana
win.setResizable(false);
win.setVisible(true);
}
}
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:
public class Tabla extends JPanel implements KeyListener {
public Tabla() {
brod = new SvemirskiBrod(this);
addKeyListener(this); // dodaje osluškivač događaja tastature
setFocusable(true);
setDoubleBuffered(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:
@Override
public void keyTyped(KeyEvent arg0) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void keyPressed(KeyEvent arg0) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void keyReleased(KeyEvent arg0) {
throw new UnsupportedOperationException("Not supported yet.");
}
}
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:
SvemirskiBrod brod;
final int TABLA_WIDTH = 600;
final int TABLA_HEIGHT = 600;
private final String svemir = "slike/space.jpg";
@Override
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2 = (Graphics2D) g;
// iscrtava svemir (slika razvučena preko cele table)
ImageIcon ii = new ImageIcon(svemir);
g2.drawImage(ii.getImage(), 0, 0, TABLA_WIDTH, TABLA_HEIGHT, 0, 0,
ii.getImage().getWidth(null), ii.getImage().getHeight(null), this);
// iscrtava brod
g2.drawImage(brod.getImage(), (int) brod.getX(), (int) brod.getY(), this);
}
@Override
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
double x = objekat.getX();
double y = objekat.getY();
if (key == KeyEvent.VK_UP) {
objekat.setFrame(x, y - 1, OBJ_WIDTH, OBJ_HEIGHT);
}
if (key == KeyEvent.VK_DOWN) {
objekat.setFrame(x, y + 1, OBJ_WIDTH, OBJ_HEIGHT);
}
if (key == KeyEvent.VK_LEFT) {
objekat.setFrame(x - 1, y, OBJ_WIDTH, OBJ_HEIGHT);
}
if (key == KeyEvent.VK_RIGHT) {
objekat.setFrame(x + 1, y, OBJ_WIDTH, OBJ_HEIGHT);
}
repaint(); // ponovo iscrtava tablu sa novim položajem
}
@Override
public void keyReleased(KeyEvent arg0) {
// throw new UnsupportedOperationException("Not supported yet.");
}
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:
Napredne tehnike obrade događaja u Swing-u i JavaFX-u
Java nudi bogat sistem za rad sa događajima u GUI aplikacijama, a napredne tehnike obrade događaja omogućavaju efikasnije i fleksibilnije interakcije korisnika.1. Swing – Lambda izrazi i anonimne klase: U Swing-u se događaji najčešće obrađuju pomoću anonimnih klasa ili lambda izraza (Java 8+), što omogućava kraći i čitljiviji kod. Na primer:
JButton button = new JButton("Klikni me");
button.addActionListener(e -> System.out.println("Dugme je kliknuto!"));2. JavaFX – Property Binding i Event Filters: JavaFX uvodi property binding, što omogućava automatsko osvežavanje komponente kada se promeni povezana vrednost, kao i Event Filters koji se koriste za obradu događaja pre nego što stignu do ciljanog čvora. Na primer:Button button = new Button("Klikni me");
button.addEventFilter(MouseEvent.MOUSE_CLICKED, e -> System.out.println("Klik pre nego što dugme obradi događaj"));
3. U poređenju: JavaFX nudi moderniji dizajn, animacije i alate za prilagođavanje interakcija sa korisnikom, dok Swing pruža osnovne komponente i lakoću integracije sa postojećim Java aplikacijama.
Ove tehnike omogućavaju da se efikasno upravlja događajima, kao i da se unapredi UX kroz elegantne i prilagodljive komponente.
