Você está na página 1de 72

Struktura Java GUI aplikacije

Poinjemo sa gradnjom prve Java GUI aplikacije. Da bismo to uradili, potrebno je da


savladamo jo novog materijala. Da biste gradili Java aplikaciju, potrebno je da znate
Java kd koji se koristi kao gradivni blok. Sada ete se upoznati sa Java kodom koji
obavlja taj deo posla. Trebalo bi da imate poverenja u nas kako budete napredovali u
svom poznavanju Jave, tako ete biti sve spremniji da piete sve sloenije programe.
Brzo ete se uveriti da nije teko razumeti taj kd.
Pogledajmo strukturu Java GUI aplikacije. Na ovom kursu koristiemo termine
aplikacija, program i projekt kao sinonime. GUI aplikacija se sastoji od okvira (frame),
sa pridruenim kontrolama (controls) i kodom (code). Pretoimo to u sliku:
Frame
Control

Control

Control

Control

Control

Control
{Code}

Aplikacija (projekt) je napravljena od:


Okvir (Frame) prozor koji kreirate za korisniki interfejs (takoe se naziva i kao
forma)
Kontrole (Controls) Grafiki elementi postavljeni u okvir da omogue korisniku
interakciju (polja za tekst (text boxes), labele (labels), trake za pomeranje
sadraja prozora (scroll bars), dugmad (buttons) itd.). Okviri i kontrole su objekti.
Svojstva (Properties) Svaka karakteristika okvira ili kontrole se specificira
preko svojstva. Primer svojstva obuhvata nazive, potpise, veliinu, boju, poloaj i
sadraj. Java primenjuje podrazumevana (default) svojstva. Moete prilikom
projektovanja promeniti svojstva ili ak kada se aplikacija izvrava.
Metodi (Methods) Ugraene procedure koje se mogu uvesti da preduzmu
neke akcije ili da promene ili utvrde svojstvo konkretnog objekta.
Metodi dogaaja (Event Methods) - Kd koji se odnosi na neki objekt ili
kontrolu. To je kd koji se izvrava kada se odreeni dogaaj desi. U naim
aplikacijama, ovak kd emo pisati u Java jeziku.
Opti metodi (General Methods) - Kd koji se ne odnosi na objekte. Taj kd
mora biti uveden ili pozvan u aplikaciji.
Aplikacija prikazana na prethodnoj slici ima samo jednu formu ili okvir. Kako budemo
napredovali sa kursom, praviemo aplikacije sa sve vie formi. Kd za svaku formu bie
obino smeten u svoj fajl sa oznakom tipa (ekstenzijom) .java.
Pridravaemo se sledeih koraka kod gradnje Java GUI aplikacije:
1. Kreiranje okvira.
2. Kreiranje korisnikovog interfejsa postavljanjem kontrola u okvir.
3. Pisanje koda za metode dogaaja kontrole (a moda i drugih metoda).

Ova procedura se primenjuje bez obzira da li pravite vrlo prostu aplikaciju ili neku koja
obuhvata mnotvo kontrola o ogroman broj redova programskog koda. Da vas
podsetim, GUI aplikacije koje emo mi praviti koristie Java Swing i AWT (Abstract
Windows Toolkit) komponente.
Svaki od ovih koraka zahteva od nas da piemo Java kd a ponekad i mnogo koda.
Dogaajima upravljana (event-driven) priroda Java aplikacija dozvoljava nam da
gradimo svoje aplikacije po fazama i da je testiramo posle svake faze. Moete napraviti
jedan metod, ili deo metoda odjednom i onda ga prepravljati sve dok ne proradi kako
elite. Ovo minimizuje greke i uliva vama kao programeru poverenje poto vaa
aplikacija polako poprima konaan oblik.
Bez obzira na vae napredovanje u programiranju uvek koristite ovaj sekvencijalni
pristup u graenju Java aplikacije. Gradite po malo, testirajte to, malo prepravite i
testirajte ponovo. Vrlo brzo ete imati zavrenu aplikaciju.

Swing kontrole
Kontrole koje emo koristiti u GUI aplikacijama bie Swing komponente. Ove
komponente su definisane u paketu javax.swing i sve imaju nazive koji poinju sa
slovom J. Ovde emo pokazati nekoliko kontrola kako biste stekli uvid ta su one i kako
izgledaju i ta rade. Prvo emo koristiti etiri kontrole: okvir (JFrame), dugme
(JButton), labelu (JLabel) i polje za tekst (JTextField). Koristiemo ih u naim
primerima bez mnogo objanjavanja kako se one koriste. Kasnije emo obraditi svojstva
i dogaaje koji su pridrueni razliitim kontrolama.

Kontrola JFrame:

Kontrola okvir je osnovni kontejner za druge kontrole. To je okruenje za Java


projekt. Svojstvo title postavlja informaciju o potpisu (caption). Svaka aplikacija koju
emo graditi poee graenjem klase koja proiruje kontrolu JFrame.

Kontrola JButton:

Kontrola dugme se koristi za pokretanje neke akcije. Svojstvo text se koristi za


postavljanje potpisa (caption).

Kontrola JLabel:

Kontrola labela omoguava postavljanje informacije u obliku formatiranog teksta u


okvir (svojstvo text).

Kontrola JTextField:

Kontrola polje za tekst prihvata samo jedan red informacije koju upisuje korisnik
(svojstvo text).

Kontrola JTextArea:

Kontrola oblast za tekst prihvata vie redova informacije koju upisuje korisnik
(svojstvo text).

Kontrola JCheckBox:

Kontrola polje za potvrdu se koristi za obezbeivanje Da/Ne odgovora na pitanje.

Kontrola JRadioButton:

Kontrola radio dugme se koristi za selektovanje iskljuivo jedne opcije iz grupe


opcija. Uvek morate da radite sa grupom radio dugmadi.

Kontrola JComboBox:

Kontrole kombinovano polje (Combo box) se esto koriste u GUI aplikacijama.


Korisnici mogu da izaberu stavku iz padajue liste (sa spiska gradovi, zemlje,
artikli).

Kontrola JList:

Kontrola lista je slina kontroli kombinovano polje, samo to je deo sa listom uvek
vidljiv. Kod kontrole liste moe se izabrati vie stavki a ne samo jedna kao kod
kombinovanog polja.

Kontrola JScroll:

Kontrola za pomeranje prikazanog sadraja prozora (scroll bar) koristi se za


selektovanje iz opsega vrednosti. Ova kontrola je uvek u kombinaciji sa drugom
kontrolom koja je povezana sa selekcijom ove kontrole.
Sada emo pokrenuti JCreator i razmotriti svaki korak u procesu razvoja aplikacije,
ukljuujui korienje Swing kontrola.
Pripremio Dragan Markovi

Java GUI (2)


Kreiranje okvira
Prvi korak kod gradnje Java GUI aplikacije je kreiranje okvira. U isto vreme kada
kreiramo okvir mi postavljamo i osnovno okruenje za ceo program. Kd
(Stopwatch.java) koji kreira okvir unutar ovog osnovnog okruenja je definisan Java
klasom sa istim nazivom:
/*
* toperica (Stopwatch)
*/
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Stopwatch extends JFrame
{
public static void main(String args[])
{
// Konstruisanje okvira
new Stopwatch().show();
}
public Stopwatch()
{
// Konstruktor okvira
setTitle("Stopwatch Application");
setSize(300, 100);
}
}
Kd piite red po red i paljivo vodite rauna da ste otkucali sve kako je pokazano.
Kako kucate, uoiete da poto ste otkucali levu vitiastu zagradu ({), JCreator editor
dodaje odgovarajuu desnu vitiastu zagradu (}) i automatsku uvlai sledei red.
Editor primenjuje pravilo uvlaenja svakog bloka koda. Po definiciji, JCreator uvlai
za 4 znaka svaki nivo. Da biste promenili ovu vrednost, izaberite stavku Configure u
glavnom meniju a zatim stavku Options. Selektujte Java Editor i upiite novu
vrednost za Tabs Size. Na ovom kursu mi emo koristiti uvlaenje od 2 znaka a ne 4
(stvar linog izbora).
Kao kod vitiastih zagrada, kada otkucate desnu zagradu dodaje se odgovarajua
desna zagrada. Takoe, treba uoiti jo jednu stvar a to je da editor koristi razliite
boje za razliite stvari u kodu. Zeleni tekst pretstavlja komentare. Kd se ispisuje
crnom bojom a kljune rei plavom. Ova kolorna ema ponekad pomae kod
identifikovanja greaka koje ste napravili prilikom kucanja.

Kada zavrite upisivanje koda, trebalo bi da vidite:

Ovaj kd kreira okvir proirujui (extending) Swing JFrame objekt, to znai da on


uzima sve karakteristike takvog okvira. Kd ima konstruktora (constructor) za objekt
Stopwatch. Trebalo bi da ste primetili da on koristi (izvrava) dva metoda: jedan za
postavljanje naslova (setTitle) i drugi za postavljanje veliine (setSize). Konstruktora
poziva metod main da kreira okvir. Mi emo koristiti istu osnovnu strukturu u svakom
naem projektu na ovom kursu. Bie graen konstruktor za okvir i sve pridruene
kontrole i dogaaje kontrole. Okvir e biti konstruisan u metodu main.
Kompajlirajte projekt (pritisnite <F7> ili izaberite u meniju Build, zatim Compile
Project). Pokrenite izvravanje projekta (pritisnite <F5> ili izaberite Build, zatim
Execute Project). Videete na ekranu svoj prvi okvir:

Kreiranje korisnikog interfejsa


Poto imamo kreiran okvir, sada emo kreirati korisniki interfejs stavljanjem
kontrola u okvir. Ovo stavljanje podrazumeva pisanje nekoliko redova logikog Java
koda po eljenoj kontroli.

Objekt pod nazivom menader rasporeda (layout manager) odreuje kako su


kontrole rasporeene unutar okvira. Naveemo ovde nekoliko menadera
rasporeda i njihove karakteristike:
FlowLayout
BorderLayout
CardLayout
GridLayout
GridBagLayout
BoxLayout
SpringLayout

Stavlja kontrole u sukcesivne redove, uklapajui kontrolu


koliko je mogue u dati red.
Stavlja kontrole naspram jedne od etiri ivice okvira.
Stavlja kontrole jednu na drugu slino pilu karata.
Stavlja kontrole unutar specificirane pravougaone mree.
Stavlja kontrole sa specificiranom vrlo fleksibilnom
pravougaonom mreom.
Rasporeuje kontrole ili po redovima ili kolonama.
Rasporeuje kontrole na poloaje definisane by sprints
and struts.

Ovog puta koristiemo GridBagLayout. Po mom miljenju, on nudi interfejs


najlepeg izgleda. Kako budemo odmicali sa kursom, saznavaete sve vie i vie
o mogunostima ovog menadera. Ako elite moete prouavati mogunosti i
drugih menadera rasporeda.
Okvir je u stvari napravljen od nekoliko razliitih okana (panes). Kontrole se stavljaju
na okno sadraja (content pane) okvira. GridBagLayout menader deli okno
sadraja u mreu redova i kolona:
Column 0

Column 1

Column 2

Column 3

Column 4

Column 5

Row 0
Row 1
Row 2
Row 3
Row 4
Row 5

Gornji red je Row 0 i numeracija redova se poveava kako idemo niz mreu. Leva
kolona je Column 0 i numeracija kolona se poveava sa leva na desno du mree.
Objekt GridBagConstraints se koristi za stavljanje kontrole i pozicioniranje unutar
razliitih elemenata mree. Kontrole se stavljaju u ovu mreu navoenjem odreene
kolone (gridx lokacija) i reda (gridy lokacija). Numeracija i kolona i redova poinje od
nule (0). Mrea ne mora da bude (ali moe) dimenzionisana. Ona automatski raste
kako se kontrole dodaju. Videemo kako je GridBagLayout menader veoma
fleksibilan. Kontrole mogu da zahvate vie od jedne kolone/reda i mogu da se
smeste (koristei insets) bilo gde unutar elementa mree.
Jednim redom koda u naem konstruktoru okvira potrebno je specificirati da emo u
oknu sadraja okvira koristiti GridBagLayout:
getContentPane().setLayout(new GridBagLayout());

Da bi stavili kontrolu u GridBagLayout mreu, treba preduzeti sledee korake:

Deklarisati kontrolu.
Kreirati kontrolu.
Uspostaviti svojstva eljene kontrole.
Dodati kontrolu rasporedu okna sadraja na eljenu poziciju.

U projektima koje gradimo, sve kontrole bie deklarisane na nivou klase (class level
scope), to znai da e kontrole i pridruena svojstva i metodi biti na raspolaganju
svakoj metodi u klasi. Prema tome, sve kontrole bie deklarisane odmah posle leve
zagrade za otvaranje klase, pre prvog metoda. Poto kontrole treba da budu na
raspolaganju u okviru klase, njihova deklaracija e imati kao prefiks slubenu re
static.
Takoe, kontrolama emo dodeljivati raspoznavajue nazive (meaningful names).
Uobiajena je praksa da se kontrolama dodeljuju nazivi koji poinju sa nekim opisom
njihove namene, zatim se nadovezuje tip kontrole na kraju naziva. Takva konvencija
dodeljivanja naziva olakava itanje i pisanje Java koda. Primeri naziva za kontrole
dugme, labela i polje za tekst (kontrole koje emo koristiti u naem primeru
toperice):
startButton
stopButton
elapsedLabel
startTextField
Da biste deklarisali kontrolu, upiite naredbu:
static ControlType controlName;
U Swing biblioteci, kontrola dugme je tipa JButton. Prema tome, da bi deklarisali
nae dugme startButton, koristimo:
static JButton startButton;
Da bi kreirali prethodno deklarisanu kontrolu, koristimo naredbu:
controlName = new ControlType();
Za nae dugme za poetak merenja vremena, Java kd je:
startButton = new JButton();
Proces deklarisanja i kreiranja kontrole moe se objediniti u jedan red koda. Mi
emo uvek tako raditi. Za na primer, deklaracija kontrole treba da bude:
static JButton startButton = new JButton();
Sledei korak je da podesimo svojstva eljene kontrole. Format tog koda je:

controlName.setPropertyName(PropertyValue);
Ovde je setPropertyName metod za podeavanje eljenog svojstva. Kada budemo
detaljno diskutovali kontrole, objasniemo veinu ovih metoda. Za sada, samo emo
ih koristiti bez objanjavanja. Za primer, da biste podesili tekst koji se pojavljuje na
dugmetu za start vremena Start Timing, treba da napiete sledee:
startButton.setText(Start Timing);
Sledei korak (da, znam da ima mnogo koraka) je da pozicioniramo kontrolu u
GridBagLayout mrei. Prvo, treba da deklariemo objekt tipa GridBagConstraints
da bi omoguili pozicioniranje. Pretpostavimo da se ovaj objekt naziva
gridConstraints, tada deklaracija ima sledei oblik:
GridBagConstraints gridConstraints = new
GridBagConstraints();
Ova naredba se stavlja na vrh koda konstruktora okvira.
Sada koristimo trostepeni proces da stavimo svaku kontrolu u mreu. Odluimo se za
x lokaciju (desiredColumn) i y lokaciju (desiredRow). Zatim, koristimo sledei kd
za primerak kontrole sa nazivom controlName):
gridConstraints.gridx = desiredColumn;
gridConstraints.gridy = desiredRow;
getContentPane().add(controlName, gridConstraints);
Staviemo dugme za startovanje vremena u gornji levi ugao mree, zato koristimo:
gridConstraints.gridx = 0;
gridConstraints.gridy = 0;
getContentPane().add(startButton, gridConstraints);
Da bi okonali stavljanje kontrola u okvir, pokrenimo metod pack:
pack();
Ovime se pakuje mreni raspored u okvir i kontrole postaju vidljive.
Na kraju, odluite koje kontrole elite da postavite u okvir. Za svaku kontrolu
potrebno je:
Naredba za deklarisanje i kreiranje (na nivou klase)
Tri reda koda za stavljanje kontrola (konstruktor metod)
Kada su sve kontrole postavljene u okvir, morate da izvrite metod pack finalizujete
stavljanje. U sledeem nastavku bie dat primer, posle ega e sve biti mnogo
jasnije.
Pripremio Dragan Markovi

Primer 2
Aplikacija Stopwatch pisanje koda
Ono to je preostalo da se uradi je da se napie kd aplikacije. Pisaemo kd za
potreban odziv na svaki dogaaj. U ovoj aplikaciji imamo tri takva dogaaja: klik na
svako dugme.
1. Ispod redova koji deklariu kontrole okvira, deklariemo tri promenljive na nivou
klase:
static long startTime;
static long stopTime;
static double elapsedTime;
Ovime postavljamo startTime, endTime i elapsedTime kao promenljive na nivou
klase.
2. U konstruktoru okvira dodajmo metod dogaaja windowClosing (svakom GUI
projektu bie potreban taj kd stavimo ga posle reda kojim se definie naslov
okvira):
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
exitForm(e);
}
});
Sada dodajemo kd odgovarajueg metoda dogaaja:
private void exitForm(WindowEvent e)
{
System.exit(0);
}
Ovaj metod se stavlja pre zavrne desne vitiaste zagrade klase Stopwatch
(uobiajeno mesto za metode). Ovaj red koda kae aplikaciji da se zaustavi.
Kreirajmo sada dogaaj actionPerformed za startButton. Dodajmo sluaoca (ovde
stavljamo posle koda koji stavlja kontrolu u okvir):
startButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
startButtonActionPerformed(e);
}
});

Zatim, dodajmo metod dogaaja posle metoda konstruktora:


private void startButtonActionPerformed(ActionEvent e)
{
// click of start timing button
startTime = System.currentTimeMillis();
startTextField.setText(String.valueOf(startTime));
stopTextField.setText("");
elapsedTextField.setText("");
}
U ovoj proceduri, kada se klikne na dugme Start Timing, ita se tekue vreme
pomou sistemske funkcije (u millisekundama) i stavlja ga u polje za tekst pomou
metoda setText. Takoe, briemo druga polja za tekst. U prethodnom kodu (i svim
kodovima na ovom kursu),svaki red koji poinje sa dve kose crte (//) je komentar. Na
vama je da odluite da li ete te redove pisati ili ne. Komentari nisu neophodni za
korektan rad aplikacije.
3. Sada dodajemo sluaoca za metod dogaaja actionPerformed za stopButton:
stopButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
stopButtonActionPerformed(e);
}
});
Zatim dodajemo ovaj metod dogaaja posle metoda startButtonActionPerformed:
private void stopButtonActionPerformed(ActionEvent e)
{
// click of stop timing button
stopTime = System.currentTimeMillis();
stopTextField.setText(String.valueOf(stopTime));
elapsedTime = (stopTime - startTime) / 1000.0;
elapsedTextField.setText(String.valueOf(elapsedTime));
}
Kada se klikne na dugme Stop Timing, oitava se tekue vreme (stopTime),
izraunava proteklo vreme (u sekundama) i stavljaju obe vrednosti u njima
pripadajue kontrole tipa polja za tekst.
4. Na kraju, potreban nam je kd u metodu actionPerformed za kontrolu exitButton.
Dodajemo sluaoca:
exitButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
exitButtonActionPerformed(e);

}
});
Dodajemo sada metod:
private void exitButtonActionPerformed(ActionEvent e)
{
System.exit(0);
}
Ova rutina zatvara okvir kada se klikne na dugme Exit.
Zbog bolje preglednosti dat je kompletan kd Stopwatch.java (novododati kd je
zasenen):
/*
* Stopwatch.java
*/
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Stopwatch extends JFrame
{
// declare controls used
static JButton startButton = new JButton();
static JButton stopButton = new JButton();
static JButton exitButton = new JButton();
static JLabel startLabel = new JLabel();
static JLabel stopLabel = new JLabel();
static JLabel elapsedLabel = new JLabel();;
static JTextField startTextField = new JTextField();
static JTextField stopTextField = new JTextField();
static JTextField elapsedTextField = new JTextField();
// declare class level variables
static long startTime;
static long stopTime;
static double elapsedTime;
public static void main(String args[])
{
new Stopwatch().show();
}
public Stopwatch()
{
// frame constructor
setTitle("Stopwatch Application");
addWindowListener(new WindowAdapter()

{
public void windowClosing(WindowEvent e)
{
exitForm(e);
}
});
getContentPane().setLayout(new GridBagLayout());
// add controls
GridBagConstraints gridConstraints = new
GridBagConstraints();
startButton.setText("Start Timing");
gridConstraints.gridx = 0;
gridConstraints.gridy = 0;
getContentPane().add(startButton, gridConstraints);
startButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
startButtonActionPerformed(e);
}
});
stopButton.setText("Stop Timing");
gridConstraints.gridx = 0;
gridConstraints.gridy = 1;
getContentPane().add(stopButton, gridConstraints);
stopButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
stopButtonActionPerformed(e);
}
});
exitButton.setText("Exit");
gridConstraints.gridx = 0;
gridConstraints.gridy = 2;
getContentPane().add(exitButton, gridConstraints);
exitButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
exitButtonActionPerformed(e);
}
});
startLabel.setText("Start Time");
gridConstraints.gridx = 1;
gridConstraints.gridy = 0;
getContentPane().add(startLabel, new GridBagConstraints());

stopLabel.setText("Stop Time");
gridConstraints.gridx = 1;
gridConstraints.gridy = 1;
getContentPane().add(stopLabel, gridConstraints);
elapsedLabel.setText("Elapsed Time (sec)");
gridConstraints.gridx = 1;
gridConstraints.gridy = 2;
getContentPane().add(elapsedLabel, gridConstraints);
startTextField.setText("");
startTextField.setColumns(15);
gridConstraints.gridx = 2;
gridConstraints.gridy = 0;
getContentPane().add(startTextField, new
GridBagConstraints());
stopTextField.setText("");
stopTextField.setColumns(15);
gridConstraints.gridx = 2;
gridConstraints.gridy = 1;
getContentPane().add(stopTextField, gridConstraints);
elapsedTextField.setText("");
elapsedTextField.setColumns(15);
gridConstraints.gridx = 2;
gridConstraints.gridy = 2;
getContentPane().add(elapsedTextField, gridConstraints);
pack();
}
private void startButtonActionPerformed(ActionEvent e)
{
// click of start timing button
startTime = System.currentTimeMillis();
startTextField.setText(String.valueOf(startTime));
stopTextField.setText("");
elapsedTextField.setText("");
}
private void stopButtonActionPerformed(ActionEvent e)
{
// click of stop timing button
stopTime = System.currentTimeMillis();
stopTextField.setText(String.valueOf(stopTime));
elapsedTime = (stopTime - startTime) / 1000.0;
elapsedTextField.setText(String.valueOf(elapsedTime));
}
private void exitButtonActionPerformed(ActionEvent e)

{
System.exit(0);
}
private void exitForm(WindowEvent e)
{
System.exit(0);
}
}
Prouite kd da biste uoili kako su metodi stavljeni.
Kompajlirajte (pritisnite <F7>) i izvrite aplikaciju (pritisnite <F5>). Isprobajte kako
funkcionie. Ako vaa aplikacija ne radi, proverite kd jo jednom. Snimite aplikaciju
kao Primer 2 u svoj radni folder. Kod probanja aplikacije trebalo bi da dobijete prikaz
slian prethodnoj slici:

Pokuajte sami da napravite izmene u aplikaciji toperice:


A. Pokuajte da promenite boju pozadine okvira.
B. Uoite da moete da pritisnete dugme Stop Timing pre dugmeta Start Timing.
To ne bi smelo da ostane tako. Promenite aplikaciju tako da to ne moe da se
desi. Takoe, dugme Start Timing ne bi trebalo da moe da se pritisne sve dok
dugme Stop Timing nije bilo pritisnuto. Savet: Pogledajte za kontrolu dugme
svojstvo enabled.
C. Da li ste razmiljali o kontinualnom prikazivanju End Time i Elapsed Time? To
zahteva dobro poznavanje prirode Jave, tj. upravljanje dogaajima. Pogledajte
detaljno klasu Timer (istraujte malo Javu). Podeavanjem svojstva delay ove
klase na vrednost 1000, ona generie sopstvene dogaaje svake sekunde.
Stavite kd slian tome u metod dogaaja za stopButton metoda
actionPerformed klase Timer i posmatrajte ta se deava.

Zadaci za vebanje:
Zadatak 1 - Beep Problem. Napravite aplikaciju sa jednim dugmetom. Kada se klikne
na dugme, raunar se oglasi (zapiti).
(Koristite metod Toolkit.getDefaultToolkit().beep() ).

Zadatak 2 - Text Problem. Napravite aplikaciju sa jednim dugmetom. Kada se klikne


na dugme, promeni se svojstvo text dugmeta. Ovo omoguava da se dugme koristi za
vie namena. Ako elite da vratite nazad natpis na dugmetu, kliknite na dugme jo
jednom (bie vam potrebna naredba if ).
Zadatak 3 - Enabled Problem. Napravite aplikaciju sa dva dugmeta. Kada kliknete na
jedno dugme, ono biva onemogueno (enabled = false) a drugo omogueno, tj,
dostupno (enabled = true).
Zadatak 4 - Date Problem. Napravite aplikaciju sa dugmetom. Kada se klikne na
dugme, raunar prikazuje tekui datum u kontroli tipa polje za tekst. Da biste ovo reili
potrebno je da prouite klasu Date.

Dijalog za potvrivanje (JOptionPane)


esto korieni okvir za dijalog u Java GUI aplikacijama je dijalog za potvrivanje
(confirm dialog, poznat i kao okvir sa porukom (message box)). Ovaj dijalog
doputa da prikaete korisniku poruke i primite povratnu informaciju za dalji rad.
Moe da se koristi za prikazivanje poruka o grekama, opisivanje potencijalnih
problema ili za prikaz rezultata nekog izraunavanja. Dijalog za potvrivanje se
implementira korienjem Java Swing klase JOptionPane. Dijalog za potvrivanje je
univerzalan, ima mogunost da prikae poruku, opcionu ikonu i izabrani skup
dugmadi. Korisnik odgovara klikom na dugme u okviru za dijalog.
Sigurno ste imali prilike da vidite dijaloge za potvrivanje ukoliko ste koristili neku
Windows aplikaciju. Setite se svih primera koje ste videli. Na primer, dijalozi za
potvrivanje se koriste kod snimanja fajla pre nego to napustite aplikaciju da vas
upozore ako disk jedinica nije spremna. Na primer, ako dok piete tekst u Microsoft
Wordu, pokuate da napustite, videete dijalog za potvrivanje:
poruka
naslov

Ikona

dugme

U ovom okviru za dijalog oznaeno je vie delova koje moete da kontroliete. Ubrzo
ete saznati kako moete da uobliite prema svojim potrebama dijalog za
potvrivanje.
Da biste koristili metod confirm dialog, morate da odluite koja e biti poruka, koji
naslov elite i koja ikona i dugmad su odgovarajui. Da bismo prikazali okvir
dijaloga za potvrivanje u kodu, koristimo metod showConfirmDialog.
Metod showConfirmDialog je preoptereen (overloaded) sa nekoliko naina za
implementiranje okvira za dijalog. Evo nekoliko uobiajenih naina:
JOptionPane.showConfirmDialog(null, message);
JOptionPane.showConfirmDialog(null, message, title,
buttons);
JOptionPane.showConfirmDialog(null, message, title, buttons,
icon);
U ovoj implementaciji, ako je icon izostavljeno, prikazuje se znak pitanja. Ako je
buttons izostavljeno, prikazuju se dugmad Yes, No, Cancel. Ako je title
izostavljeno, prikazuje se naslov Select an Option. Prvi argument (null) mora
postojati on ukazuje da je okvir dijaloga za potvrivanje pridruen tekuem okviru.

Kao to je malopre reeno, vi odluujete ta elite kao poruku (message) i naslov


(title ) (podaci tipa string) u dijalogu za potvrdu. Obratite panju da nema
ogranienja koliko poruka moe da bude dugaka. Ako imate dugu poruku, koristite
znak za novi red (\n) da biste poruku razdelili u vie redova.
Drugi argumenti su definisani preko Java JOptionPane unapred definisanih
konstanti. Konstante za buttons su definisane sa:
Member
DEFAULT_OPTION
OK_CANCEL_OPTION
YES_NO_CANCEL_OPTION
YES_NO_OPTION

Description
Prikazuje dugme OK
Prikazuje dugmad OK i Cancel
Prikazuje dugmad Yes, No i Cancel
Prikazuje dugmad Yes i No

Sintaksa za specificiranje izbora dugmadi je uobiajena notacija sa takoma:


JOptionPane.Member
Dakle, da bi prikazali dugmad OK i Cancel, konstanta je:
JOptionPane.OK_CANCEL_OPTION
Prikazana ikona se postavlja preko drugog skupa konstanti:
Member
Description
PLAIN_MESSAGE
Bez prikazivanja ikone
INFORMATION_MESSAGE Prikazuje ikonu informacije
ERROR_MESSAGE
Prikazuje ikonu error
WARNING_MESSAGE
Prikazuje ikonu usklinik
QUESTION_MESSAGE
Prikazuje ikonu upitnik
Za specificiranje ikone sintaksa je:
JOptionPane.Member
Da bi prikazali ikonu greke (error) koristi se:
JOptionPane.ERROR_MESSAGE
Kada uvedete metod showOptionDialog, on vraa konstantu (tipa int) klase
JoptionPane, koja pokazuje korisnikov odziv. Na raspolaganju su lanovi:
Member
CLOSED_OPTION
OK_OPTION
YES_OPTION
NO_OPTION
CANCEL_OPTION

Description
Prozor se zatvara bez pritiskanja dugmeta
Dugme OK selektovano
Dugme Yes selektovano
Dugme No selektovano
Dugme Cancel selektovano

Primer dijaloga za potvrivanje:


Ovo pare koda (drugi red je vrlo dug):
int response;
response = JOptionPane.showConfirmDialog(null, "This is an
example of an confirm dialog box.", "Example",
JOptionPane.YES_NO_OPTION, JOptionPane.INFORMATION_MESSAGE);
if (response == JOptionPane.YES_OPTION)
{
// Pressed Yes
}
else if (response == JOptionPane.NO_OPTION)
{
// Pressed No
}
else
{
// Closed window without pressing button
}
prikazuje okvir za dijalog sa porukom:

Naravno, potrebno je da se doda kd za razliite zadatke u zavisnosti od toga na


koje dugme (Yes i No) je korisnik kliknuo (ili je prozor jednostavno zatvoren).
Drugi primer:
Vie puta vama je potrebno samo da prikaete korisniku kratku poruku bez potrebe
za povratnom informacijom (upravo dugme OK). Ovaj kd obavlja taj posao:
JOptionPane.showConfirmDialog(null, "Quick message for
you.", "Hey you!!", JOptionPane.DEFAULT_OPTION,
JOptionPane.PLAIN_MESSAGE);
Kao rezulatat dobijamo dijalog sa porukom:

Uoite da ikona i dugme OK nisu prikazani. Takoe, uoite u kodu da nema


potrebe da itamo vraenu vrednost mi znamo ta je ona! Moete nai mnotvo
primera ovog prostog okvira sa porukom.

Skoro da smo spremni da ponemo prouavanje Java Swing kontrola,


posmatranjem vanih svojstava, metoda i dogaaja za veinu kontrola. Ali, pre
nego to ponemo, razmotrimo dva koncepta koji e nam pomoi da obuemo
nae GUI aplikacije Font i Color objekte.

Objekt Font

U svim GUI aplikacijama koje smo do sada pravili, koristili smo podrazumevani
font pridruen Swing kontrolama (dugmadima, labelama i tekst poljima).
Korienje podrazumevanog fonta je ograniavajue i boring. Sada emo
pokazati kako se menja font koji koristi kontrola za prikaz informacija.

Da bi promenili podrazumevani font dodeljen kontroli, uvodimo ideju novog


objekta Font. Objekt Font je struktura koju koristi Java da definie sve
karakteristike konkretnog fonta (naziv, stil, veliina). Da bi promenili font dodeljen
kontroli myControl, koristimo metodu setFont:
myControl.setFont(new Font(fontName, fontStyle, fontSize));
U ovom redu koda, fontName je promenljiva tipa string koja definie naziv fonta a
fontSize je celobrojna vrednost koja definie veliinu fonta u pointima.

fontStyle argument je Font konstanta koja definie stil fonta. Ona moe da ima tri
vrednosti:
Vrednost
PLAIN
BOLD
ITALIC

Opis
Regular text
Bold text
Italic text

Osnovni (bez efekata) font se definie kao Font.PLAIN. Da bi dodali bilo koji
efekt, koristi se odgovarajua konstanta. Ako font ima vie od jednog efekta,
kombinujemo ih pomou znaka plus (+). Na primer, ako elimo kurzivni
(italicized), masni (bold) font, argument fontStyle u Font konstruktoru treba da
ima oblik:
Font.ITALIC + Font.BOLD

Pogledajmo sada nekoliko primera. Da bi promenili font kontrole dugme


(myButton) u Arial, Bold, Size 24, koristimo:
myButton.setFont(new Font(Arial, Font.BOLD, 24));
ili, da bi promenili font u tekst polju (myTextField) u Courier New, Italic, Bold,
Size 12, koristimo:
myTextField.setFont(new Font(Courier New, Font.ITALIC +
FontStyle.BOLD, 12));

Takoe, moete da definiete promenljivu da bude tipa Font. Deklariimo


promenljivu saglasno uobiajenim razmatranjima vezanim za oblast vaenja:
Font myFont;
Zatim, dodelimo font promenljivoj za korienje u drugim kontrolama:
myFont = new Font(Courier New, Font.PLAIN, 12);
thisControl.setFont(myFont);
thatControl.setFont(myFont);
Prethodno moe biti skraeno istovremenim deklarisanje i definisanjem fonta:
Font myFont = new Font(Courier New, Font.PLAIN, 12);

Objekt Color

Boje ine veliki deo Java GUI aplikacija. Boja pozadine okvira i drugih kontrola
moe se postaviti da bude neka odreena boja. Boja teksta u ovim kontrolama se
postavlja kao boja prednjeg plana (foreground color). kasnije, kada se budemo
bavili grafikom, videete kako se linije, elipse i pravougaonici mogu crtati i
popunjavati razliitim bojama. Te boje moraju da se definiu u Java kodu. Kako
se to radi? Postoje dva pristupa: (1) korienje ugraenih boja i (2) kreiranje boje.

Boje ugraene u Javu su specificirane objektom Color. Takva boja se specificira


naredbom:
Color.colorName
Gde je colorName rezervisano ime boje. Postoji trinaest standardnih naziva boja:
Tamnije

Svetlije:

BLACK

DARK_GRAY

WHITE

GREEN

BLUE

GRAY

CYAN

ORANGE

LIGHT_GRAY

YELLOW

RED

MAGENTA

PINK

Ako iz nekih razloga izbor koji nudi objekt Color ne zadovoljava vae potrebe,
moete kreirati sopstvenu boju koristei neku od preko 16 miliona razliitih
kombinacija. Kd za kreiranje RGB boje pod nazivom myColor je:
Color myColor = new Color(redValue, greenValue, blueValue);
gde su redValue, greenValue blueValue celobrojne mere intenziteta
odgovarajuih primarnih boja. Ove mere su u opsegu od 0 (najmanji intenzitet) do
255 (najvei intenzitet). Na primer, new Color(255, 255, 0) e dati uto.

Korienjem objekta Color lako je specificirati boju. Svaki put kada vam je
potrebna boja, koristite neku od ugraenih boja ili kreirajte sopstvenu pomou
razliitih vrednosti crvene, zelene i plave boje. Ove tehnike moete koristiti bilo
gde kada Javi zahteva boju. Na primer, da biste promenili boju pozadine okvira
(myFrame), koristimo:
myFrame.getContentPane().setBackground(Color.colorName);
Mi bojimo sadraj okna (content pane) poto su kontrole postavljene u okno.
Dakle, utu pozadinu dobijate sa:
myFrame.getContentPane().setBackground(Color.YELLOW);
Ili znajui kombinaciju crvene, zelene i plave:
myFrame.getContentPane().setBackground(new Color(redValue,
greenValue, blueValue));

Takoe, moete promeniti boje prednjeg plana i pozadine kontrola. Da biste dobili
beli ispis na plavom dugmetu (kontrola myButton), treba da koristite:
myButton.setBackground(Color.BLUE);
myButton.setForeground(Color.WHITE);
Inicijalno neke kontrole su transparentne, to znai da bilo koja dodeljena boja
pozadine nee se pojaviti. Da biste to promenili, treba da postavite svojstvo
opaque kontrole na vrednost true. Na primer, da biste postavili boju pozadine
labele myLabel u belu boju, potrebna su vam dva reda koda:
myLabel.setOpaque(true);
myLabel.setBackground(Color.WHITE);
Poeemo da koristimo boje u naim primerima da bi pokazali dalje korienje
boja.

Takoe, moete da definiete promenljive koje uzimaju vrednosti boja. Recimo


elite da definiete promenljivu pod nazivom myRed da predstavlja crvenu boju.
Prvo, deklariite svoju promenljivu da bude tipa Color:
Color myRed;
Zatim, definiete svoju boju u kodu koristei naredbu:
myRed = Color.RED;
Sa te take gledita, moete koristiti myRed svuda gde se crvena boja zahteva.
Po elji, u istom redu koda moete deklarisati i definisati boje. Za prethodni
primer, treba da napiete:
Color myRed = Color.RED;

Pripremio Dragan Markovi

Programiranje GUI-ja u Javi


Objekt JFrame

Okvir je objekt u kome korisnik gradi interfejs. Svaka aplikacija koju gradimo
proiruje (extends) objekt JFrame, to znai da e naa aplikacija ****acquire
sve karakteristike okvira. To je centralna stvar u razvoju Java GUI aplikacija.
Okvir je objekt kontejner (container), poto on dri druge kontrole. Jedno od
svojstava objekta kontejner je svojstvo vidlivosti (visible property) koje ako se
postavi na vrednost false, znai da e sve kontrole postati nevidljive.

Ovde emo objasniti neka ire koriena svojstva (Properties), metode


(Methods) i dogaaje (Events) okvira (frame). Da vas podsetim, svojstva
opisuju izgled i vrednost kontrole, metode su akcije koje moete ****impose na
kontrolama a dogaaji se pojavlju kada se neto uradi sa kontrolom (obino od
strane korisnika). Ovo nije ****exhaustive list potraite u literaturi iscrpnije
informacije. Moda sada ne prepoznajete sve pomenute termine, ali kako vae
uenje bude napredovalo bie vam sve jasnije.

Svojstva okvira (Frame Properties):


title
font
background
foreground
x
y
width
height
resizable
visible

Naslov prozora okvira.


Naziv, stil, veliina fonta.
Boja pozadine okvira.
Boja teksta ili grafike.
Rastojanje od leve ivice ekrana do leve ivice okvira, u
pikselima.
Rastojanje od gornje ivice ekrana do gornje ivice okvira, u
pikselima.
irina okvira u pikselima.
Visina okvira u pikselima.
Logika (Boolean) vrednost koja pokazuje da li je okvir
fiksne ili podesive veliine.
Ako je false, tada je okvir sakriven (i sve njegove
kontrole).

Metode okvira (Frame Methods):


setTitle
setFont
setBackground
setForeground

Postavlja naslov prozora okvira.


Postavlja naziv, stil, veliinu fonta.
Postavlja boju pozadine okvira.
Postavlja boju teksta ili grafike.

getX
getY
getWidth
getHeight
setBounds
setResizable
setVisible

Dogaaji okvira (Frame Event):


windowClosing

Daje rastojanje od leve ivice ekrana do leve ivice okvira, u


pikselima.
Daje rastojanje od gornje ivice ekrana do gornje ivice
okvira, u pikselima.
Daje irinu okvira u pikselima.
Daje visinu okvira u pikselima.
Koristi se da pozicionira okvir na ekranu.
Postavlja logiku (boolean) vrednost koja pokazuje da li je
okvir fiksne ili podesive veliine.
Postavlja logiku (boolean) vrednost koja pokazuje da li
je okvir vidljiv ili ne.

Pojavljuje se (WindowEvent) kada se forma zatvara.


Dodaje se sa WindowListener pomou
WindowAdaptera.

Slualac (listener) za dogaaj windowClosing dodaje se u metodi konstruktora


okvira pomou:
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
exitForm(e);
}
});
A uobiajena metoda exitForm je:
private void exitForm(WindowEvent e)
{
System.exit(0);
}

Tipina radnje vezane za upotrebu objekta okvira:


Kreiranje objekta okvir, korienjem uobiajene metode konstruktora.
Postavljanje svojstva title.
Centriranje okvira u sredini ekrana (bie kasnije objanjeno kako se to radi).
Postavljanje svojstva resizable na false. Moete da imate forme podesive
veliine u Java GUI aplikacijama, ali toga nee biti na ovom kursu.
Dodavanje sluaoca za dogaaj windowClosing.
Attach menadera GridBagLayout. Postavljanje kontrola u menader
rasporeda mree i izvravanje metode pack.

Opte okruenje Java koda za obavljanje ovih koraka za okvir sa nazivom


MyFrame (fajl mora da bude snimljen kao MyFrame.java) je:

/*
* MyFrame.java
*/
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class MyFrame extends JFrame
{
public static void main(String args[])
{
//construct frame
new MyFrame().show();
}
public MyFrame()
{
// code to build the form
setTitle("My Frame");
setResizable(false);
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
exitForm(e);
}
});
getContentPane().setLayout(new GridBagLayout());
// code to position controls follows
.
.
.
pack();
}
private void exitForm(WindowEvent e)
{
System.exit(0);
}
}

Araniranje i centriranje okvira

Da li ste primetili da je u svim aplikacijama koje smo do sada gradili okvir poinjao
u gornjem levom uglu ekrana? Meutim, bilo bi lepo kada bi okvir bio centriran
kada se aplikacija pokrene. Sada e biti pokazano kako to moe da se uradi.
Prvo, pogledajmo kako veliinu okvira postavlja menader GridBagLayout.

Koristimo menader GridBagLayout da postavimo na GUI aplikacije (naravno,


moete koristite i druge menadere rasporeda). Da vas podsetim, kod ovog
menadera koristi se mrea (grid) za razmetanje kontrola:

gridx = 0

gridx = 1

gridx = 2

gridx = 3

gridx = 4

gridy = 0
gridy = 1
gridy = 2
gridy = 3
gridy = 4
gridy = 5

Objekt GridBagConstraints se koristi za smetaj i pozicioniranje kontrole unutar


razliitih elemenata mree. Kontrole se smetaju u ovu mreu navoenjem
(referenciranjem) konkretne kolone (lokacija gridx) i reda (lokacija gridy). Videli
smo da se mrea (i okvir) automatski ire kako se dodaju kontrole. irina kolone
se postavlja na najiru kontrolu u toj koloni. A visina reda se postavlja na
najviu kontrolu u tom redu.

There are other variables associated with GridBagConstraints that can be used
to adjust control size and, hence, associated column, row, and frame size. A
control can occupy more than one column or row. The number of columns
spanned by a control is set with the gridwidth variable; the number of rows
spanned is set with the gridheight variable. By default, a control fills one row and
one column. If we have a GridBagConstraints object named gridConstraints, a
control will occupy two rows and three columns, starting in the second column
(gridx = 1) and fourth row (gridy = 3), with this code:
gridConstraints.gridx = 1;
gridConstraints.gridy = 3;
gridConstraints.gridheight = 2;
gridConstraints.gridwidth = 3;
In our example grid, this control would be placed like this:
gridx = 0

gridx = 1

gridx = 2

gridx = 3

gridx = 4

gridy = 0
gridy = 1
gridy = 2
gridy = 3

Control goes here

gridy = 4
gridy = 5

A particular control may completely fill its region or may not. If the control is
smaller than its allocated region, its dimensions may be adjusted to fill the region
use the fill variable. There are four values:

GridBagConstraints.NONE
GridBagConstraints.HORIZONTAL
GridBagConstraints.VERTICAL
GridBagConstraints.BOTH

Control is not resized (default value)


Control width fills display area.
Control height fills display area.
Control fills entire display area.

With our example gridConstraints object, a control will grow to fill the region
width using:
gridConstraints.fill = GridBagConstraints.HORIZONTAL;
This control would look like this in its grid region:

Control

Smaller changes in control size can be made using the ipadx and ipady
variables. These determine how much a control size is to be increased beyond
its minimum size (in each direction). To add five pixels to the width and height of
a control using our gridConstraints example:
gridConstraints.ipadx = 5;
gridConstraints.ipady = 5;

If you choose not to expand a control to fill its area, its position within its allocated
area is set with the anchor variable. There are nine possible values:
GridBagConstraints.NORTH
GridBagConstraints.NORTHEAST
GridBagConstraints.EAST
GridBagConstraints.SOUTHEAST
GridBagConstraints.SOUTH
GridBagConstraints.SOUTHWEST
GridBagConstraints.WEST
GridBagConstraints.NORTHWEST
GridBagConstraints.CENTER

Control is centered at top


Control is in upper right corner
Control is at right, centered vertically
Control is in lower right corner
Control is centered at bottom
Control is in lower left corner
Control is at left, centered vertically
Control is in upper left corner
Control is centered horizontally and
vertically

To center a control (in both directions) in its display area, use:


gridConstraints.anchor = GridBagConstraints.CENTER;
This control would look like this in its grid region:

Control

If a control completely fills its allocated display area, a border region (free space)
can be established around the control using the Insets object. Four values are
used to define the top, left, bottom and right side margins from the side of the
display area. The default is Insets(0, 0, 0, 0). With our example, if we want 10
pixels of space at the top and bottom, 20 on the left and 30 on the right, we would
use:
gridConstraints.insets = new Insets(10, 20, 10, 30);
This control would look something like this in its grid region:

Control

Once the gridConstraints are established for a control, it is added to the frames
content pane using the add method. If the control is myControl, the code syntax
is:
getContentPane().add(myControl, gridConstraints);

I think you are starting to see the flexibility available with the GridBagLayout
manager. Remember to establish all grid constraint values before adding a
control to the grid. We will start using some of these new concepts in building our
example applications. You, too, are encouraged to learn these ideas and use
them to beautify your GUI interfaces.

Building an interface is an art, not a science. You will see the process involves
lots of trial and error and adjustments. And sometimes, you get results you would
never expect components may not appear as you wish or may not appear at all!
The bottom line is once all adjustments are made, your final frame size is
established and we can finally learn how to do the task we started out with
centering the frame in the screen.

First, to place a frame (width by height in size) at a horizontal position left and
vertical position top, we use the setBounds method:
setBounds(left, top, width, height);
All the dimensions are int types and measured in pixels. To center a frame in the
computer screen, we need to know find left and top.

To find the centering position, we need two things: the dimensions of the frame
(use getWidth and getHeight methods) and the dimensions of the screen. The
dimensions of the screen are held in the frames toolkit. A Dimension object
holds the information we need. To retrieve this object, use:
Dimension screenSize =
Toolkit.getDefaultToolkit().getScreenSize();

With this, screenSize.width holds the screen width and screenSize.height holds
the screen height. So, the code to center the frame using setBounds is:
setBounds((int) (0.5 * (screenSize.width - getWidth())),
(int) (0.5 * (screenSize.height - getHeight())), getWidth(),
getHeight());
This code needs to be after the pack method in the code establishing the frame,
so that proper frame size is used. Well use this centering code in every
application built in the remainder of this course.
Pripremio Dragan arkovi

Java GUI - SWING komponente (nastavak)


Kontrola JButton

Ve smo se upoznali sa kontrolom dugme (button). To je verovatno najvie koriena Java GUI kontrola. Ona
se koristi za otpoinjanje, prekid ili zavretak konkretnog procesa. Stoga emo ovde navesti neka najvie
koriena svojstva, metode i dogaaje za kontrolu dugme.

Svojstva dugmeta (Button Properties):


- text
- font
- background
- foreground
- icon
- enabled
- visible

String koji se prikazuje na dugmetu.


Naziv, stil i veliina fonta.
Boja pozadine dugmeta.
Boja teksta.
Slika prikazana na dugmetu
Ako je false, dugme je vidljivo, ali ne moe da prihvati klik mia.
Ako je false, sakriva dugme.

Metodi dugmeta (Button Methods):


- setText
- setFont
- setBackground
- setForeground
- setEnabled
ne.
- setVisible
- doClick

Postavlja tekst dugmeta.


Postavlja naziv, stil i veliinu fonta.
Postavlja boju pozadine dugmeta.
Postavlja boju teksta.
Postavlja logiku (boolean) vrednost da pokae da li dugme reaguje na klik ili
Postavlja logiku (boolean) vrednost da pokae da li je dugme vidljivo ili ne.
Generie dogaaj klika za dugme.

Dogaaj dugmeta (Button Event):


actionPerformed
Dogaaj (ActionEvent) koji se aktivira (triggered) kada se
dugme selektuje bilo klikom na njega ili pritiskanjem razmaknice. Dodaje se sa ActionListener.
Da bi dodali sluaoca za actionPerformed dogaaj za kontrolu dugme nazvanu myButton,
koristite:
myButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
myButtonActionPerformed(e);
}
});

Kontrola JButton

A odgovarajui kd dogaaja treba da bude smeten u metod myButtonActionPerformed :


private void myButtonActionPerformed(ActionEvent e)
{
[kd metoda]
}

Tipine radnje kod korienja kontrole dugme:


Deklarisanje i kreiranje dugmeta, dodeljivanje raspoznavajueg naziva. Za myButton, naredba
je:
JButton myButton = new JButton();

Postavljanje svojstva text.


Stavljanje kontrole unutar menadera rasporeda.
Dodavanje sluaoca i pisanje koda dogaaja actionPerformed dugmeta.

Takoe, moete promeniti svojstva font, background i foreground.

Kontrola JLabel

Kontrola labela se koristi da prikae tekst koji korisnik ne moe direktno da prepravlja. Tekst
kontrole labela moe da se promeni kao rezultat odziva na dogaaje.

Svojstva labele (Label Properties):


- text
- font
- background
- foreground
- opaque
- horizontalAlignment
- verticalAlignment
- border

String prikazan u labeli.


Naziv, stil i veliina fonta.
Boja pozadine labele.
Boja teksta.
Odreuje da li je kontrola neprozirna ili prozirna.
Horizontalna pozicija teksta
Vertikalna pozicija teksta
Tip koriene ivice (bordure ako je ima)

Metodi labele (Label Methods):


setText
setFont
setBackground
setForeground
setOpaque
setHorizontalAlignment
setVerticalAlignment
setBorder
BorderFactory)

Postavlja tekst labele.


Postavlja naziv, stil i veliinu fonta.
Postavlja boju pozadine labele.
Postavlja boju teksta.
Ako je true, boje pozadine se mogu primeniti.
Postavlja horizontalnu poziciju teksta
Postavlja vertikalnu poziciju teksta
Koristi se da uspostavi borduru (ako je ima) oko labele (vidi klasu

Dogaaj labele (Label Event):


mouseClicked
Dogaaj (MouseEvent) se aktivira kada se na labelu klikne miem (pogodno
za selektovanje izmeu izbora labela). Dodaje se sa MouseListener(om) pomou
MouseAdapter(a).

Kd za dodavanje dogaaja mouseClicked labeli pod nazivom myLabel je:


myLabel.addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent e)
{
myLabelMouseClicked(e);
}
});

A metod myLabelMouseClicked je:

private void myLabelMouseClicked(MouseEvent e)


{
[Kd metoda]
}
Postoje tri mogue vrednosti za poravnavanje teksta labele po horizontali (horizontalAlignment):
SwingConstants.LEFT
Tekst levo poravnat
SwingConstants.CENTER
Tekst centriran
SwingConstants.RIGHT
Tekst desno poravnat
i tri vrednosti za vertikalno poravnavanje (verticalAlignment):
SwingConstants.TOP
Tekst je poravnat prema vrhu
SwingConstants.CENTER
Tekst je centriran prema vertikali
SwingConstants.BOTTOM
Tekst je poravnat prema dnu
Prema tome, vidite i sami da postoji devet moguih argumenata.

Bordura se ponekad dodaje kontroli labela da bi podraavala izgled trodimenzionalnog


(beveled) tekst polja. Da bi dodali takvu borduru labeli sa nazivom myLabel, koristite:
myLabel.setBorder(BorderFactory.createLoweredBevelBorder());
Postoji vie vrsta bordura. Ukoliko vas to zanima, potraite u literaturi reference za
BorderFactory.

Tipine radnje koje se preduzimaju kod rada sa kontrolom labela za statiki nepromenljivi prikaz
su:
Deklarisanje i kreiranje labele, dodeljivanje prepoznatljivog naziva. Za myLabel, naredba je:
JLabel myLabel = new JLabel();
Postavljanje svojstva text kada je okvir kreiran.
Smetanje kontrole sa menaderom rasporeda.
Takoe, po elji moete promeniti svojstva font, background i foreground.

Tipine radnje koje se preduzimaju kod rada sa kontrolom labela za promenljiv prikaz:
Deklarisanje i kreiranje labele dodeljivanjem prepoznatljivog naziva. Za myLabel, naredba je:
JLabel myLabel = new JLabel();

Inicijalizacija svojstva text na eljeni string.


Postavljanje svojstva text (tip String) u kodu gde je potrebno.
Smetanje kontrole sa menaderom rasporeda.
Takoe, po elji moete promeniti svojstva font, background i foreground.

Kontrola JTextField

Kontrola tekst polje (text field) se koristi za prikazivanje jednog reda informacije inicijalizovane
kada je okvir kreiran, upisane od strane korisnika tokom izvravanja ili dodeljene pomou koda.
Prikazani tekst moe da se ureuje.

Svojstva tekst polja:


- text
- font
- background
- foreground
- columns
- horizontalAlignment
- editable

String prikazan u tekst polju.


Naziv, stil i veliina fonta.
Boja pozadine tekst polja.
Boja teksta.
irina prikaza tekst polja.
Horizontalna pozicija teksta
Pokazuje da li je tekst u tekst polju samo za itanje (read-only).

Metodi tekst polja:


setText
getText
setFont
setBackground
setForeground
setColumns
setHorizontalAlignment
setEditable

Postavlja tekst tekst polja.


Pretrauje tekst tekst polja.
Postavlja naziv, stil i veliinu fonta.
Postavlja boju pozadine tekst polja.
Postavlja boju teksta.
Postavlja broj kolona.
Postavlja horizontalno poravnavanje.
Ako je false, tekst polje ne moe da se ureuje.

Postoje tri mogue vrednosti za poravnavanje po horizontali (horizontalAlignment):


SwingConstants.LEFT Tekst levo poravnat
SwingConstants.CENTER
Tekst centriran
SwingConstants.RIGHT
Tekst desno poravnat

Dogaaj (Event) tekst polja:


actionPerformed Pojavljuje se (ActionEvent) kada korisnik pritisne <Enter>. Dodaje se
ActionListener(om).
Da bi dodali sluaoca za dogaaj actionPerformed kontrole tekst polje pod nazivom myTextField,
koristite:
myTextField.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
myTextFieldActionPerformed(e);
}
});

A odgovarajui kd dogaaja treba da bude smeten u metodu myTextFieldActionPerformed :


private void myTextFieldActionPerformed(ActionEvent e)
{
[kd metoda]
}

Tipine radnje kod korienja kontrole tekst polje kao kontrole prikaza:
Deklarisanje i kreiranje tekst polja, dodeljivanje prepoznatljivog naziva. Dodeljivanje vrednosti
svojstvu columns. Za myTextField, naredba je:
JTextField myTextField = new JTextField();

Inicijalizacija svojstva text na eljeni string.


Postavljanje svojstva editable na false.
Postavljanje svojstva text u kodu gde je potrebno.
Smetanje kontrole sa menaderom rasporeda.
Takoe, po elji moete promeniti svojstva font, background i foreground.

Tipine radnje kod korienja kontrole tekst polje kao ulaznog ureaja:
Deklarisanje i kreiranje tekst polja, dodeljivanje prepoznatljivog naziva. Dodelivanje vrednosti
svojstvu columns. Za myTextField, naredba je:
JTextField myTextField = new JTextField();
Inicijalizacija svojstva text na eljeni string.
Smetanje kontrole sa menaderom rasporeda.
Dodavanje sluaoca za dogaaj actionPerformed.
U kodu, davanje focus(a) (korienje metoda requestFocus) kontroli kada je potrebno. itanje
svojstva text kada se javi dogaaj actionPerformed.
Takoe, po elji moete promeniti svojstva font, background i foreground.

Korienje kontrole tekst polje (i svake druge kontrole kod koje korisnik neto kuca) treba svesti na
minimum ukoliko je mogue. Kadgod korisniku date opciju da neto upisuje, oteavate sebi kao
programeru posao. Treba da proverite valjanost upisane informacije kako bi bili sigurni da e ona
raditi sa vaim kodom. Postoji u Javi vie kontrola koje su tipa pokai i klikni (point and click), tj.
korisnik moe da napravi izbor prosto klikom mia. Te kontrole emo kasnije obraditi. Kadgod je
mogue koristite te kontrole umesto tekst polja!

Kontrola JTextArea

Kontrola tekst polje (JTextField) moe da prikae samo jedan red informacije. Slina kontrola koja
omoguava prikazivanje vie redova teksta (u jednom fontu) je kontrola tekst oblast (text area).
Kao i tekst polje, ova kontrola moe da se koristi za prikazivanje informacije inicijalizovane kada je
okvir kreiran, upisane od strane korisnika tokom izvravanja aplikacije ili dodeljene unutar koda.
Prikazani tekst moe da se ureuje.

Svojstva tekst oblasti:


- text
- font
- background
- foreground
- columns
- rows
- lineCount
- lineWrap
- wrapStyleWord
- editable

Metodi tekst oblasti:


setText
getText
setFont
setBackground
setForeground
setColumns
setRows
setLineWrap
setWrapStyleWord
setEditable

String prikazan u tekst oblasti.


Naziv, stil i veliina fonta.
Boja pozadine tekst oblasti.
Boja teksta.
irina prikaza tekst oblasti.
Visina prikaza tekst oblasti.
Broj redova teksta.
Logika (Boolean) promenljiva koja pokazuje da li tekst moe da se prelama
(word wrapped) podrazumeva se vrednost false.
Ako je true (i lineWrap je true), rei se prelamaju na granicama rei.
Pokazuje da li je tekst tekst oblasti samo za itanje (read-only).

Postavlja tekst tekst oblasti.


Pretrauje tekst tekst oblasti.
Postavlja naziv, stil i veliinu fonta.
Postavlja boju pozadine tekst oblasti.
Postavlja boju teksta.
Postavlja broj kolona.
Postavlja broj redova.
Ukljuuje/iskljuuje prelom reda.
Ukljuuje/iskljuuje prelom rei.
Ako je postavljeno na false, tekst oblast ne moe da se ureuje.

Tipine radnje kod korienja kontrole tekst oblast kao kontrole prikaza:
Deklarisanje i kreiranje tekst oblasti, dodeljivanje prepoznatljivog naziva. Dodeljivanje vrednosti svojstvima
columns i rows. Za myTextArea, naredba je:

JTextArea myTextArea = new JTextArea();

Postavljanje lineWrap i wrapStyleWord na true.


Inicijalizovanje svojstva text na eljeni string.
Postavljanje svojstva editable na false.
Postavljanje svojstva text u kodu gde je potrebno.
Smetanje kontrole sa menaderom rasporeda.
Takoe, po elji moete promeniti svojstva font, background i foreground.

Tipine radnje kod korienja kontrole tekst oblast kao ulaznog ureaja:
Deklarisanje i kreiranje tekst oblasti, dodeljivanje prepoznatljivog naziva. Dodeljivanje vrednosti
svojstvima columns i rows. Za myTextArea, naredba je:
JTextArea myTextArea = new JTextArea();
Postavljanje lineWrap i wrapStyleWord na true.
Inicijalizovanje svojstva text na eljeni string.
Smetanje kontrole sa menaderom rasporeda.
U kodu, davanje focus(a) (koristiti metod requestFocus) kontroli kada je potrebno. itanje
svojstva text kada se javi dogaaja actionPerformed.
Takoe, po elji moete promeniti svojstva font, background i foreground.

Kada budete poeli da koristite kontrolu tekst oblast, uoiete da nema tzv. skrolovanja, tj. da ne

moe da se pomera prikaz sadraja oblasti. Sreom, kontrola JTextArea moe lako da se ugradi u
drugu Swing komponentu, JScrollPane (bie obraena kasnije) da bi se implementirale trake za
horizontalno i vertikalno pomeranje sadraja (scroll bars).

Pripremio Dragan Markovi

Java GUI - SWING komponente (nastavak) (8)


Kontrola JComboBox

Kontrola lista ekvivalentna je grupi polja za potvrdu (koja omoguava viestruku selekciju u dugoj listi
stavki). Ekvivalentna kontrola za dugu listu radio dugmadi je kontrola kombinovano polje (combo box).
Kombo polje omoguava selekciju jedne stavke u padajuoj listi. A, ako eli, korisnik moe da upie
alternativni odziv. Kombo polje koristi sopstveni model liste koji omoguava direktno dodavanje i
uklanjanje stavki u padajuoj listi. Takoe, obezbeuje sopstveni mehanizam skrolovanja ne treba mu
skrolujue okno.

Svojstva kombo polja:


model
Uspostavlja stavke u padajuoj listi.
itemCount
Broj stavki u kombo polju.
font
Naziv, stil i veliina fonta.
background
Boja pozadine kombo polja.
foreground
Boja teksta.
editable
Specificira ako selekciju moe da upie
korisnik (podrazumevano je is false).
maximumRowCount
Broj redova za prikaz u padajuoj listi (trake za pomeranje sadraja e se
automatski pojaviti ako ima vie stavki nego prostora).
selectedIndex
Indeks (zero-based) tekue selektovane stavke u kombo polju.
selectedItem
Tekue selektovana stavka u kombo polju.

Metodi kombo polja:

setEditable
getItemCount
setMaximumRowCount
setFont
setBackground
setForeground
getSelectedItem
setSelectedIndex

Dogaaj kombo polja:


actionPerformed

Uspostavlja da li selektovana stavka moe da se ureuje.


Daje broj stavki u kombo polju.
Postavlja broj stavki za prikaz u padajuoj listi.
Postavlja naziv, stil i veliinu fonta.
Postavlja boju pozadine kombo polja.
Postavlja boju teksta.
Pretrauje selektovanu stavku.
Selektuje specificiranu stavku u kombo polju.

Dogaaj koji se aktivira kada korisnik obavi selekciju ili pritisne <Enter>.
Dodaje se sa ActionListener.

Da bi dodali sluaoca za dogaaj actionPerformed kontrole kombo polje pod nazivom myComboBox,
koristite:
myComboBox.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
myComboBoxActionPerformed(e);
}
});

A odgovarajui kd dogaaja treba da bude smeten u metod myComboBoxActionPerformed :


private void myComboBoxActionPerformed(ActionEvent e)
{
[kd metoda]
}

Kombo polje ima sopstveni model liste za dodavanje i uklanjanje stavki iz svoje padajue liste, to
olakava upravljanje listom u odnosu na upravljanje kod kontrole lista. Stavke se dodaju kombo polju
(myComboBox) pomou metoda addItem ili insertItemAt :
Dodavanje stavke:
myComboBox.addItem(itemToAdd);
myComboBox.insertItemAt(itemToAdd, index);

Sa addItem, stavka e biti dodata na kraj liste. Sa insertItemAt stavka e biti dodata na datu index
vrednost.

Kao i kontrole lista, ne postoji mogunost sortiranih listi da biste imali takve liste morate
programiranjem da dodate tu mogunost.

Za uklanjanje stavki iz kombo polja, postoje tri metoda: removeItem, removeItemAt ili
removeAllItems. Za na primer kombo polja, respektivne naredbe se:
Brisanje stavke:
myComboBox.removeItem(itemToRemove);
myComboBox.removeItemAt(index);
Brisanje liste:
myComboBox.removeAllItems();

Uoite da kada uklanjate stavke, da indeksi sledeih stavki u listi prate uklanjanje.

Da biste uputili na individualni element u kombo polju, koristite metod getItemAt:


myComboBox.getItemAt(index)
a broj stavki kombo polja se dobija metodom getItemCount:
myComboBox.getItemCount();

Da biste videli poslednju stavku treba da koristite:


myComboBox.getItemAt(myComboBox.getItemCount() 1)

Tipine radnje kod korienja kontrole kombo polje:


Deklarisanje i kreiranje kontrole kombo polje, dodeljivanje prepoznatljivog naziva. Za
myComboBox, kd je:
JComboBox myComboBox = new JComboBox();

Postavljanje svojstva editable i dodavanje stavki kombo polju (obino u metodu main).
Smetanje kontrole unutar menadera rasporeda.
Praenje dogaaja actionPerformed za selekcije.
itanje svojstva selectedItem da bi se identifikovao izbor.

Kontrola JSpinner

Kontrola spinner je dodata u Javi 1.4. Posmatrajte je kao kombo polje koje nema padajuu listu. Koristi
se za izbor stavki iz relativno kratkih listi. Korienjem razliitih modela, mogu se vrteti razliite
informacije. Posmatraemo dva sluaja. Prvo emo posmatrati number spinner, koji koristi model broja,
a zatim list spinner, koji koristi model liste.

number spinner izgleda kao tekst polje sa dve male strelice. Klikom na strelicu menja se prikazana
vrednost, koja je u opsegu od specificiranog minimuma do specificiranog maksimuma. Korisnik ak
moe da upie vrednost, ako eli. Takve kontrole su zgodne za obezbeivanje datuma u mesecu ili se
koriste kao kontrole za jainu u nekim multimedijalnim aplikacijama.

list spinner je po izgledu slian sa number spinnerom. Razlikuju se po tome to list spinner prikazuje
listu string stavki (a ne brojeve) kao potencijalne kandidate za izbor. Kontrola se obino koristi za
relativno male liste. Primeri korienja su selektovanja drava ili gradova u adresarima, selektovanje
meseca u kalendaru ili selektovanje naziva iz kratke liste.

Svojstva Spinnera:

Model korien za obezbeivanje informacije za spinner.


Tekua vrednost prikazana u kontroli spinner.
Naziv, stil i veliina fonta.
Boja pozadine spinnera.
Boja teksta.

Metodi Spinnera:

model
value
font
background
foreground

getValue
setModel
setFont
setBackground
setForeground

Odreuje tekuu vrednost spinnera.


Uspostavlja model koji se koristi u kontroli
Postavlja naziv, stil i veliinu fonta.
Postavlja boju pozadine spinnera.
Postavlja boju teksta.

spinner.

Dogaaj Spinnera:
stateChanged Dogaaj (ChangeEvent) se aktivira kada se promeni vrednost spinnerarrial.
Dodaje se sa ChangeEventListener (zahteva uvoenje fajlova javax.swing.event.arrial ).
Dogaaj stateChanged je za nas nov. Da bi dodali sluaoca za takav dogaaj kontrole spinner pod
nazivom mySpinner, koristite:
mySpinner.addChangeListener(new ChangeListener()
{
public void stateChanged(ChangeEvent e)
{
mySpinnerStateChanged(e);
}
});

A odgovarajui kd dogaaja treba da bude smeten u metodu mySpinnerStateChanged :


private void mySpinnerStateChanged(ChangeEvent e)
{
[kd metoda]

Specijalni konstruktori se koriste za dodeljivanje modela kontroli spinner. Za number spinner, model se
dobija iz klase SpinnerNumberModel. Sintaksa za dodeljivanje modela broja kontroli (mySpinner) je:
mySpinner.setModel(new SpinnerNumberModel(value, minimum, maximum,
stepSize));
gde je:
value
Inicijalni broj za prikaz
minimum
Minimalna vrednost za prikaz
maximum
Maksimalna vrednost za prikaz
stepSize
Veliina inkrementa ili dekrementa prikazane vrednosti kada se klikne na
odgovarajuu strelicu.

U naem sluaju sve vrednosti e biti tipa int. Takoe, model omoguava double tipove za vrednosti, minimum,
maksimum i veliinukoraka (stepSize). Vrednost number spinnera moe se promeniti klikom mia na jednu od
strelica ili, opciono, upisivanjem vrednosti. Ako se koriste strelice, vrednost e uvek biti izmeu minimuma i
maksimuma. Ako korisnik upisuje vrednost, vi nemate kontrolu nad vrednou koja se upisuje. Meutim, ne mogu
se napraviti podeavanja number spinnera sve dok je prikazana vrednost izvan prihvatljivog opsega (izmeu
minimuma i maksimuma).
Da bi povratili numeriku vrednost spinnera (za matematike operacije) potrebno je malo vetine u kodiranju.
Vrednost koju vraa metod getValue je objekt koji ne moe da se konvertuje u celobrojni (integer) tip. Prema tome,
moramo da preduzmemo dvostepeni proces, prvo konvertujemo objekt u string, zatim konvertujemo string u int tip.
Ako je rekonstruisana vrednost myValue, kd koji sve to radi u naem primeru spinnera (mySpinner) je:

myValue = Integer.valueOf(mySpinner.getValue().toString()).intValue();

Kod list spinnera, informacija koja se prikazuje je smetena u niz tipa String. Niz se zatim dodeljuje
spinneru pomou klase SpinnerListModel. Sintaksa za dodeljivanje niza (myArray) spinneru
(mySpinner) je:
mySpinner.setModel(new SpinnerListModel(myArray));

Kao i kod number spinnera, svojstvo value (ovde tipa String) moe se promeniti klikom mia na bilo
koju strelicu ili, opciono, upisivanjme vrednosti. Ako korisnik upisuje vrednost, vi nemate kontrolu nad
upisanom vrednou. Ako se upie neispravna vrednost, ne registruje se dogaaj stateChanged sve
dok upisana vrednost se ne poklopi sa nekom od vrednosti iz spinnerove liste.

Moda ste primetili da, poredei sa drugim kontrolama, kontrola spinner nema svojstva font,
background, foreground, ili alignment. Spinner je nova Swing kontrola i metodi za direktno menjanje
ovih svojstava jo nisu implementirani. Da li to znai da ste osueni na podrazumevane vrednosti? Ne,
to samo znai da treba da krenete drugim putem da bi promenili ta svojstva. Element prikaza kontrole
spinner je tekst polje kojim upravlja editor kontrole. Da bi promenili neko od specificiranih svojstava,
direktno pristupamo tekst polju preko ovog editora. Za na primer spinner (mySpinner), da bi promenili
font u myFont, koristite:
((JSpinner.DefaultEditor) mySpinner.getEditor()).getTextField().setFont(myFont);

Da bi promenili boju pozadine u myColor, koristite:


((JSpinner.DefaultEditor)
mySpinner.getEditor()).getTextField().setBackground(myColor);

Da bi promenili boju prednjeg plana u myColor, koristite:


((JSpinner.DefaultEditor)

mySpinner.getEditor()).getTextField().setForeground(myColor);

A da bi promenili poravnavanje u myAlignment, koristite:


((JSpinner.DefaultEditor)
mySpinner.getEditor()).getTextField().setHorizontalAlignment(myAlignment);

Ove promene se mogu uraditi poto je model spinnera uspostvaljen. Budue promene u Javi e
verovatno ukljuiti direktne metode za menjanje ovih svojstava.

Tipine radnje kod korienja kontrole spinner:


Deklarisanje i kreiranje kontrole spinner, dodeljivanje prepoznatljivog naziva. Za mySpinner, kd
je:
JSpinner mySpinner = new JSpinner();
Odluivanje da li koristite number ili list spinner. Za number spinner, izaberite vrednosti za value,
minimum, maximum i stepSize. Dodelite number model kontroli spinner:
mySpinner.setModel(new SpinnerNumberModel(value, minimum, maximum,
stepSize);
Za list spinner, kreirajte niz stavki za prikaz u list spinneru. Dodelite taj niz (myArray) kontroli
spinner:
mySpinner.setModel(new SpinnerListModel(myArray));
Smetanje kontrole u menader rasporeda.
Dodavanje sluaoca i praenje dogaaja stateChanged za promene vrednosti.
Korienje metoda getValue za utvrivanje tekue vrednosti.

Kontrola JScrollBar

Kontrola number spinner je pogodna za relativno male opsege numerikog ulaza. Meutim, ona nee
dobro raditi za velike numerike opsege troiete mnogo vremena na kliktanje miem na njene
strelice. Za velike opsege brojeva koristimo kontrole scroll bar (skrolujua traka; traka sa
klizaem). Ove kontrole se mnogo koriste u GUI aplikacijama. One obezbeuju intuitivan nain za
kretanje kroz listu informacija i predstavjaju sjajne ulazne ureaje. Ovde se koriste za dobijanje celog
broja (podatak tipa int).

Trake sa klizaem su sastavljene od tri oblasti na koje moe da se klikne, ili povlai miem, da bi
promenili vrednost. Te oblasti su:

Klikom mia na granine strelice (end arrow) inkrementira se skrolujui okvir (scroll box) za mali
iznos, klikom mia na oblast trake (bar area) inkrementira se skrolujui okvir za veliki iznos, a
povlaenjem klizaa (dugme trake) obezbeuje se kontinualna promena (pomeranje). Pomou
svojstava ove kontrole moemo potpuno da specificiramo kako ona radi. Pozicija skrolujueg okvira je
jedina izlazna informacija od skrolujue trake.

Svojstva skrolujue trake:


preferredSize
Specificirana veliina (width, height) skrolujue trake.
value
Tekua pozicija skrolujueg okvira (dugme) unutar skrolujue trake. Ako ovo
postavljate kodiranjem, Java pomera skrolujui okvir na odgovarajuu poziciju.
minimum
Minimalna mogua vrednost skrolujue trake.
maximum
Maksimalna mogua vrednost skrolujue trake.
unitIncrement Inkrement koji se dodaje ili oduzima od vrednosti value skrolujue trake kada se
klikne na neku od graninih strelica.
blockIncrement Inkrement koji se dodaje ili oduzima od vrednosti value kada se klikne na oblast
trake.
extent
irina (Width) skrolujueg okvira.
orientation
Odreuje da li skrolujua traka lei horizontalno ili vertikalno.

Metodi skrolujue trake:


setPreferredSize
Uspostavlja veliinu skrolujue strake.
setValue
Postavlja tekuu vrednost.
getValue
Odreuje tekuu vrednost.
setMinimum
Uspostavlja minimalnu vrednost.
setMaximum
Uspostavlja maksimalnu vrednost.
setUnitIncrement
Uspostvalja svojstvo unitIncrement.
setBlockIncrement
Uspostvalja svojstvo blockIncrement.
setVisibleAmount
Postavlja irinu (veliinu) skrolujueg
okvira.
getVisibleAmount
Odreuje irinu (veliinu) skrolujueg
okvira.
setOrientation
Postavlja orijentaciju skrolujue trake
(JScrollBar.HORIZONTAL za horizontalnu, JScrollBar.VERTICAL za vertikalnu traku).

Dogaaj skrolujue trake:


adjustmentValueChanged

Dogaaj (AdjustmentEvent) koji se aktivira kada se vrednost


(value) skrolujue trake promeni. Dodaje se sa
AdjustmentEventListener (zahteva uvoenje fajlova
javax.swing.event.* ).
Lokacija svojstava za horizontalnu skrolujuu traku:

Lokacija svojstava za vertikalnu skrolujuu traku:

Nekoliko vanih napomena vezanih za svojstva skrolujue trake:


Uoite da vertikalna skrolujua traka ima svoj minimum na vrhu a svoj maksimum na dnu. Ovo
moe biti suprotno od oekivanog u nekim aplikacijama, tj. korisnici moda oekuju da se stvari
rastu kako se ide navie. Ovako ponaanje moete postii definisanjem druge promenljive koja se
ponaa suprotno od svojstva value skrolujue trake.
Ako ikada promenite kodiranjem svojstva value, minimum, ili maximum, proverite da li je value
svaki put izmeu minimum i maximum ili e se program zaustaviti sa porukom o greci.

Da biste dodali sluaoca za dogaaj adjustmentValueChanged kontrole skrolujua traka sa nazivom

myScrollBar, koristite:
myScrollBar.addAdjustmentListener(new AdjustmentListener()
{
public void adjustmentValueChanged(AdjustmentEvent e)
{
myScrollBarAdjustmentValueChanged(e);
}
});

A odgovarajui kd dogaaja treba da bude smeten u metod myScrollBarAdjustmentValueChanged:


private void myScrollBarAdjustmentValueChanged (AdjustmentEvent e)
{
[kd metoda]
}

Tipine radnje kod korienja kontrole scroll bar:


Deklarisanje i kreiranje kontrole skrolujua traka, dodeljivanje prepoznatljivog naziva. Za
myScrollBar, kd je:
JScrollBar myScrollBar = new JScrollBar();
Postavljanje svojstava minimum, maximum, unitIncrement, blockIncrement i orientation.
Inicijalizacija svojstva value.
Smetanje kontrole u raspored mree.
Dodavanje sluaoca i praenje dogaaja adjustmentValueChanged za promenu vrednosti.

Napomena za svojstvo maximum:


Zbog irine skrolujueg okvira (extent - veliine), vrednost maximum ne moe se postii klikom
mia na granine strelice, oblast trake ili povlaenjem dugmeta. Maksimalna dostina vrednost
preko operacija sa miem je data preko relacije:
dostini maksimum = maximum extent

gde je extent irina skorlujueg okvira. ta to znai? Da bi dostigli dostini maksimum, treba da
postavite svojstvo maximum skrolujue trake pomou sledee jednaine:
maximum = dostini maksimum + extent

Da biste dobili extent (ili irinu skrolujueg okvira), koristite metod getVisibleAmount. Na primer, ako
elite da skrolujua traka (myScrollBar) dostigne 100, postavite maximum pomou:
myScrollBar.setMaximum(100 + myScrollBar.getVisibleAmount());

Pripremio Dragan Markovi

Java GUI - SWING komponente (nastavak) (7)


Kontrola JCheckBox

Kao to je pomenuto ranije, Javu karakterie mnoto point and click kontrola koje omoguavaju
korisniku da napravi izbor jednostavnim klikom sa miem. Ove kontrole su atraktivne, pogodne i
minimizuju mogunost greaka u vaim aplikacijama. Upoznaemo nekoliko takvih kontrola na
ovom kursu. Prvo emo se upoznati sa kontrolom polje za potvrdu (check box).
Ova kontrola obezbeuje nain da se napravi izbor sa liste potencijalnih kandidata. Neke, sve ili
nijedna stavka iz grupe moe se odabrati. Polja za potvrdu se koriste u skoro svim GUI
aplikacijama. Primeri njihovog korienja su ukljuivanje i iskljuivanje opcija u aplikacijama ili
selektovanje na listi kupovanja.
Svojstva polja za potvrdu:
- text
- font
- background
- foreground
- selected

Metodi polja za potvrdu:


setText
setFont
setBackground
setForeground
setOpaque
setSelected
isSelected
doClick

String prikazan pored polja za potvrdu.


Naziv, stil i veliina fonta.
Boja pozadine polja za potvrdu.
Boja teksta.
Pokazuje da li je polje selektovano ili ne.

Postavlja tekst polja za potvrdu.


Postavlja naziv, stil i veliinu fonta.
Postavlja boju pozadine polja za potvrdu.
Postavlja boju teksta.
Ako je true, boje pozadine se mogu primeniti.
Postavlja da li je polje selektovano ili ne.
Ako je true, polje za potvrdu je selektovano.
Generie dogaaj klika za polje za potvrdu.

Dogaaj polja za potvrdu:


actionPerformed Pojavljuje se (ActionEvent) kada se klikne na polje za potvrdu. Dodaje se sa
ActionListener.

Da bi dodali sluaoca za dogaaj actionPerformed kontrole polje za potvrdu pod nazivom myCheckBox,
koristite:
myCheckBox.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
myCheckBoxActionPerformed(e);
}
});

A odgovarajui kd dogaaja treba da bude smeten u metod myCheckBoxActionPerformed :


private void myCheckBoxActionPerformed(ActionEvent e)
{
[kd metoda]
}

Kada se klikne na polje za potvrdu dok nema trikle u polju (isSelected = false), Java e staviti
triklu i promeniti svojstvo selected na true. Ako se klikne dok postoji trikla u polju (isSelected
= true), tada e trikla nestati i svojstvo selected e biti promenjeno u false.

Tipine radnje kod korienja kontrole polje za potvrdu:


Deklarisanje i kreiranje polja, dodeljivanje prepoznatljivog naziva. Za kontrolu myCheckBox,
naredba je:
JCheckBox myCheckBox = new JCheckBox();
Postavljanje svojstva text. Inicijalizacija svojstva selected na eljenu vrednost.
Smetanje kontrole unutar menadera rasporeda.
Dodavanje sluaoca za praenje dogaaja actionPerformed da bi se utvrdilo da li je kliknuto na
polje. U bilo kom trenutku itanje svojstva selected (koristiti metod isSelected) da bi se utvrdilo
stanje polja za potvrdu.
Takoe, moete da promenite svojstva font, background i foreground.

Kontrola JRadioButton

Kontrole radio dugme (Radio button) obezbeuju mogunost ekskluzivnog izbora u okviru grupe
potencijalnih kandidata. Ovo prosto znai da radio dugmad rade kao grupa u okviru koje samo
jedno dugme se moe izabrati. Radio dugmad se sreu u mnogim GUI aplikacijama. Nazivaju se
radio dugmad zato to rade kao dugmad automobilskog radio prijemnika moete sluati samo
jednu stanicu! Primeri grupa radio dugmadi su dvanaest dugmadi za izbor meseca u godini, grupa
dugmadi za izbor boje ili dugmad za izbor nivoa u igrici.

Svojstva radio dugmeta:


- text
- font
- background
- foreground
- selected

Metodi radio dugmeta:


setText
setFont
setBackground
setForeground
setOpaque
setSelected
isSelected
doClick

String prikazan pored radio dugmeta.


Naziv, stil i veliina fonta.
Boja pozadine radio dugmeta.
Boja teksta.
Pokazuje da li je dugme selektovano ili ne.

Postavlja tekst radio dugmeta.


Postavlja naziv, stil i veliinu fonta.
Postavlja boju pozadine dugmeta.
Postavlja boju teksta.
Ako je true, boje pozadine se mogu primeniti.
Postavlja da li je dugme selektovano ili ne.
Ako je true, radio dugme je selektovano.
Generie dogaaj klika za radio dugme.

Dogaaj radio dugmeta:


actionPerformed Pojavljuje se (ActionEvent) kada se klikne na radio dugme. Dodaje se sa
ActionListener.

Da bi dodali sluaoca za dogaaj actionPerformed kontrole radio dugme nazvane


myRadioButton, koristite:
myRadioButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{

myRadioButtonActionPerformed(e);
}
});

A odgovarajui kd dogaaja treba da bude stavljen u metod myRadioButtonActionPerformed :


private void myRadioButtonActionPerformed(ActionEvent e)
{
[kd metoda]
}

Uoite da radio dugmad uvek rade kao grupa, koja garantuje da jednovremeno ne moe da bude
izabrano vie od jednog dugmeta. Kako da definiete grupu radio dugmadi? Grupe radio dugmadi
se definiu pomou klase ButtonGroup. Grupa se kreira a dugmad se dodaju grupi pomou
ButtonGroup add metoda. Kao primer, recimo da imamo tri radio dugmeta: firstRadioButton,
secondRadioButton, thirdRadioButton i elimo da budu deo myGroup. Kd koji to uspostavlja
ima sledei oblik:

ButtonGroup myGroup = new ButtonGroup();


myGroup.add(firstRadioButton);
myGroup.add(secondRadioButton);
myGroup.add(thirdRadioButton);

Kada se klikne na radio dugme, njegovo svojstvo selected automatski se postavlja na true, uz
istovremeno popunjavanje kruia pored selektovanog dugmeta. A sva preostala dugmad iz grupe
e tada imati svojstvo selected postavljeno na false.

Tipine radnje kod korienja kontrola radio dugmad:


Deklarisanje i kreiranje grupe radio dugmadi. Za myGroup, naredba je:
ButtonGroup myGroup = new ButtonGroup();
Za svako dugme u grupi, deklarisanje i kreiranje dugmeta, dodeljivanje prepoznatljivog naziva
(dajte svakom dugmetu slian naziv da biste ga identifikovali sa grupom). Za myRadioButton,
naredba je:
JRadioButton myRadioButton = new JRadioButton();
Postavljanje svojstva text. Takoe, moete da promenite svojstva font, background i
foreground.
Inicijalizovanje svojstva selected dugmeta na vrednost true.
Dodavanje kontrole menaderu rasporeda.
Dodavanje sluaoca za praenje dogaaja actionPerformed za svako dugme da bi utvrdili
kada je na dugme kliknuto. Zadnje kliknuto dugme u grupi e uvek imati svojstvo selected
postavljeno na true.

Kontrola JPanel

Videli smo da radio dugmad (a esto i polja za potvrdu) rade kao grupa. esto u GUI aplikacijama,
postoje logika grupisanja kontrola. Na primer, moete da imate ureaj za tzv. skrolovanje koji
postavlja vrednost prikazanog broja. Kontrola panel obezbeuje pogodan nain grupisanja
povezanih kontrola u Java GUI aplikaciji.

Svojstva Panela:
- enabled
- visible

Metodi Panela:

Pokazuje da li je panel omoguen. Ako je false, sve kontrole u panelu su


onemoguene.
Ako je false, sakriva panel (i sve njegove kontrole).

setBorder
setOpaque
setEnabled
setVisible

Uspostavlja borduru panela (ako je ima).


Ako je true, boje pozadine se mogu primeniti.
Postavlja da li je panel omoguen.
Postavlja da li je panel vidljiv.

Kontrola panel je kontejner (container) kao i kontrola okvir (frame). Dakle, proces smetanja
kontrola u kontrolu panel je identian sa procesom koji se koristi za smetanje kontrola u okvir.
Svaka kontrola panel ima svog menadera rasporeda (mi emo i dalje koristiti GridBagLayout).
Prema tome, kontrole se smetaju u panel pomou menadera rasporeda. Paneli se smetaju u
okvir pomou menadera rasporeda okvira. Pogledajmo prost primer smetanja jedne kontrole
(myControl) u panel (myPanel) koji je u okviru myFrame. Smatraemo da su myControl i
myFrame deklarisani i kreirani. Prema tome, treba da deklariemo i kreiramo panel:
JPanel myPanel = new JPanel();

Zatim, dodelimo menadera rasporeda (ovde GridBagLayout):


myPanel.setLayout(new GridBagLayout());

Stavimo kontrolu u panel (poto postavimo eljeno gridConstraints):


myPanel.add(myControl, gridConstraints);

Dodajmo bilo koje druge kontrole panelu, zatim dodajmo panel okviru koristei okvirov skup
ogranienja:
getContentPane().add(myPanel, gridConstraints);

Bordura sa naslovom esto se dodaje kontroli panel. Kd za dodavanje takve bordure sa naslovom
My Panel za na primer panela je:
myPanel.setBorder(BorderFactory.createTitledBorder("My Panel"));

Panel sa naslovom e izgledati slino datoj slici:

Druge (preoptereene) verzije metoda TitledBorder za kreiranje naslova omoguavaju vam da


postavite font i boju naslova.

Tipine radnje kod korienja kontrole panel:


Deklarisanje i kreiranje panela, dodeljivanje prepoznatljivog naziva. Za myPanel, kd je:
JPanel myPanel = new JPanel();

Dodavanje bordure po elji.


Smetanje eljenih kontrola u panel. Praenje dogaaja kontrola u panelu pomou uobiajenih
tehnika.
Dodavanje panela okviru sa menaderom rasporeda.

Kontrola JList

Polja za potvrdu su pogodne kontrole za selektovanje stavki sa spiska (liste). Meutim, ta ako
vaa lista ima 100 stavki? Da li elite 100 polja za potvrdu? Ne, ali sreom, postoji alat koji reava
taj problem. Kontrola lista prikazuje listu stavki (sa onoliko stavki koliko je potrebno) sa koje korisnik
moe da selektuje jednu ili vie stavki. Podrani su i izbor jedne i izbor vie stavki.

Svojstva liste:
- model
Uspostavlja stavke u listi.
- font
Naziv, stil i veliina fonta.
- background
Boja pozadine liste.
- foreground
Boja teksta.
- visibleRowCount
Broj redova za prikaz.
- selectedIndex
Indeks (poinje od nule) tekue
selektovane stavke u listi.
- selectedIndices
Niz (indeksiranje od nule) indeksa svih tekue selektovanih stavki u listi.
- selectedItem
Tekue selektovana stavka u listi.
- selectedItems
Niz selektovanih stavki u listi.
- selectionMode
Daje ili postavlja metod kojim se stavke selektuju u listi (dozvoljava jednu ili
vie selekcija).
- selectionEmpty
Logika (Boolean) promenljiva koja pokazuje ako je bilo koja stavka
selektovana.

Metodi liste:

setFont
Postavlja naziv, stil i veliinu fonta.
setBackground
Postavlja boju pozadine liste.
setForeground
Postavlja boju teksta.
setVisibleRowCount Postavlja broj redova za prikaz.
clearSelection
Ponitava specificiranu selekciju u listi.
getSelectedIndex
Vraa vrednost koja pokazuje da li je
specificirana stavka selektovana.
getSelectedIndices
Vraa integer niz indeksa selektovanih stavki.
setSelectedIndex
Selektuje specificiranu stavku u listi.
setSelectionMode
Uspostavlja reim selekcije.
isSelectionEmpty
Proverava da vidi ako je bilo koja stavka
selektovana

Dogaaj liste:
valueChanged

Dogaaj (ListSelectionEvent) koji se aktivira kada se bilo koja selekcija u listi


promeni. Dodaje se sa ListSelectionListener (zahteva uvoenje fajlova
javax.swing.event.* ).
Dogaaj valueChanged je za nas nov. Da bi dodali sluaoca za takav dogaaj u kontroli lista sa
nazivom myList, koristite:
myList.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e)
{
myListValueChanged(e);
}
});

A odgovarajui kd dogaaja treba da bude smeten u metod myListValueChanged :


private void myListValueChanged(ListSelectionEvent e)
{
[kd metoda]
}

Stavke navedene u kontroli lista se definiu pomou objekta DefaultListModel. Ovaj model
upravlja podesivim (resizable) nizom informacija, takvim kao to je ovaj korien u kontroli lista.

Takav model (myListModel) se kreira pomou:


DefaultListModel myListModel = new DefaultListModel();

Kada je kreirana, stavke se dodaju listi pomou metoda addElement ili insertElementAt:
Dodavanje stavke:
myListModel.addElement(itemToAdd);
myListModel.insertElementAt(itemToAdd, index);

Sa addElement, stavka se dodaje na kraj liste. Sa insertElementAt stavka e biti dodata na mesto
date index vrednosti.
Kontrole lista normalno listaju string tipove podataka, mada su i drugi tipovi mogui. esto, elite
da stavke u kontroli lista budu sortirane, ili alfabetski poreane. Ne postoji automatizam u okviru
kontrole lista da odrava sortirane liste. Ako elite takvu mogunost, morate sami da to kodirate
koristei svoje Java programersko znanje.
Za uklanjanje stavki iz liste postoje tri metoda: removeElement, removeElementAt ili
removeAllElements. Za na primer okvira liste, respektivne komande su:
Brisanje stavke:
myListModel.removeElement(itemToRemove);
myListModel.removeElementAt(index);

Brisanje liste:

myListModel.removeAllElements();
Uoite, kada uklonite stavke, da indeksi sledeih stavki u listi prate uklanjanje.
Da biste uputili na individualni element u modelu, koristite metod getElementAt:
myListModel.getElementAt(index)

a broj elemenata u listi daje metod getSize:


myListModel.getSize();

Da biste videli poslednju stavku u ovoj listi (zero-based), treba da koristite:


myListModel.getElementAt(myListModel.getSize() 1)

Kada je model liste uspostavljen, on se dodeljuje kontroli lista (myList) pomou metoda setModel:
myList.setModel(myListModel);

Uvek vodite rauna o tome kada radite sa kontrolom lista a kada sa modelom liste. Primarna stvar
o kojoj treba da vodite rauna je da se stavke dodaju i briu iz modela liste pomou indeksa koje
obezbeuje kontrola lista.

Svojstvo selectionMode specificira da li elite selekciju jedne ili vie stavki. Izbor se obavlja klasom
ListSelectionModel i postoje tri mogue vrednosti:
MULTIPLE_INTERVAL_SELECTION
Omoguava istovremeno selekciju nekoliko opsega.
SINGLE_INTERVAL_SELECTION
Omoguava selekciju jednog opsega.
SINGLE_SELECTION
Omoguava selekciju jedne stavke.

Podrazumevana vrednost omoguava selekciju vie opsega. Da biste promenili selekciju u selekciju
jedne stavke u kontroli myList, koristite:
myList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

Tipine radnje kod korienja kontrole lista:


Deklarisanje i kreiranje kontrole lista, dodeljivanje prepoznatljivog naziva. Za myList, kd je:
JList myList = new JList();

Postavljanje svojstva selectionMode i popunjavanje liste pomou objekta modela liste (obino u
main metodu).
Dodavanje kontrole sa menaderom rasporeda.
Praenje dogaaja valueChanged za individualne selekcije.
Korienje svojstava selectedIndex i selectIndices da bi se utvrdilo koje stavke su
selektovane.

Uoite da jednu stvar nismo diskutovali kod kontrole lista a to je ta se deava kada postoji vie
stavki u listi nego to kontrola lista moe da prikae? Odgovor je nita neete videti stavke koje su
van liste. Kontrola JList nema mogunost tzv. skrolovanja, tj. pomeranja prikaza sadraja. Da bi
dodali tu mogunost, koristimo drugu Swing komponentu, JScrollPane da implementiramo i
horizontalnu i vertikalnu traku za pomeranje prikaza sadraja kontrole. Pogledajmo sada tu
kontrolu.

Kontrola JScrollPane

Veoma pogodna kontejner kontrola je tzv. skrolujue okno (scroll pane). Ova kontrola je slina
kontroli panel uz dodatnu mogunost pomeranja (skrolovanja) bilo koje komponente smetene u
okno. Dakle, velika komponenta moe da se smesti u mali plac u GUI okviru. Nekoliko Swing
kontrola se oslanja na skrolujue okno da bi obezbedile mogunost skrolovanja, ukljuujui
kontrolu JTextArea koju smo ranije opisali i komponentu JList koju upravo prouavamo. I
horizontalno i vertikalno skrolovanje kontrole je mogue.

Svojstva skrolujueg okna:


- enabled

Pokazuje da li je skrolujue okno omogueno. Ako je false, komponenta u oknu je


onemoguena.
- preferredSize
Specificirana veliina (irina, visina) skrolujueg okna.
- horizontalScrollBarPolicy
Odreuje kako se horizontalna traka prikazuje.
- verticalScrollBarPolicy Odreuje kako se vertikalna traka prikazuje.

Metodi skrolujueg okna:


setEnabled
setPreferredSize
setViewportView
setHorizontalScrollBarPolicy
setVerticalScrollBarPolicy

Postavlja da li je panel omoguen.


Uspostavlja veliinu skrolujueg okna.
Uspostavlja komponentu koju opsluuje (ugoava) skrolujue
okno.
Uspostavlja kako se horizontalna traka (ako je ima) prikazuje.
Uspostavlja kako se vertikalna traka (ako je ima) prikazuje.

Korienje skrolujueg okna je relativno lako. Poto je cilj da okno dri komponentu veu nego to je ono
samo, potrebno je da uspostavite koliko veliko okno elite da bude. To se radi pomou metoda
setPreferredSize, koji koristi objekt Dimension. Da biste postavili veliinu skrolujueg okna, myPane,
koristite:
JScrollPane myPane = new JScrollPane();
myPane.setPreferredSize(new Dimension(width, height));

gde su width i height eljene dimenzije u pikselima. Kada je okno uspostavljeno i dimenzionisano, moete da

mu dodajete komponente. Skrolujue okno ima menadera rasporeda kao i druge kontrole, ali se obino oknu
dodaje samo jedna kontrola (ta kontrola moe biti kontrola panel sa vie kontrola). Komponenta
(myControl) se dodaje skrolujuem oknu pomou metoda setViewportView:
myPane.setViewportView(myControl);

Od ovog trenutka dodata kontrola moe da se skroluje u skrolujuem oknu to je ba lako! Naravno,
potrebno je da dodate skrolujue okno okviru (sa pridruenim gridConstraints) da biste omoguili da se sve
to desi:
getContentPane().add(myPane, new gridConstraints());

Ovo je prvi put da smo postavili eljene dimenzije komponente. Sve do sada, preputali smo menaderu
rasporeda mree da odredi dimenzije komponente i izgledalo je da sve radi sasvim fino. Kada ponete da
postavljate dimenzije komponenti, pojavie se neobina ponaanja. Ponekad, kontrole se nee pojaviti onako
kako vi oekujete. esto, ako postavite eljenu dimenziju za kontrolu u jednoj lokaciji mree, bie potrebno
da postavite dimenzije i svih ostalih komponenti u mrei. Poeete da razvijate sopstvene naine za reavanje
ovih neobinih ponaanja. Ako se neto ne pojavi onako kako bi trebalo, metod za postavljanje eljene
dimenzije je mesto odakle treba poeti istragu.

Trake za pomeranje sadraja se mogu ali ne moraju pojaviti u skrolujuem oknu, u zavisnosti od postavki
politike trake za pomeranje (scroll bar policy). Da bi uspostavili politiku horizontalne trake za pomeranje
koristite setHorizontalScrollBarPolicy sa jednom od tri konstante iz ScrollPaneConstants:
HORIZONTAL_SCROLLBAR_AS_NEEDED Traka za pomeranje se pojavljuje kada je komponenta koja
gostuje ira od rezervisanog prostora (podrazumevano).
HORIZONTAL_SCROLLBAR_ALWAYS
Traka za pomeranje sadraja se uvek pojavljuje.
HORIZONTAL_SCROLLBAR_NEVER
Traka za pomeranje sadraja se nikad ne pojavljuje.

Da bi uspostavili politiku vertikalne trake za pomeranje sadraja koristite setVerticalScrollBarPolicy sa


jednom od tri konstante iz ScrollPaneConstants:
VERTICAL_SCROLLBAR_AS_NEEDED
Traka za pomeranje sadraja se pojavljuje kada
je komponenta koja gostuje dua od rezervisanog
prostora (podrazumevano).
VERTICAL_SCROLLBAR_ALWAYS
Traka za pomeranje sadraja se uvek pojavljuje.
VERTICAL_SCROLLBAR_NEVER
Traka za pomeranje sadraja se nikad ne pojavljuje.

Vi ne morate da kodirate nita da bi trake za pomeranje sadraja funkcionisale ta mogunost je prirodno


svojstvo skrolujueg okna.

Tipine radnje kod korienja kontrole skrolujue okno:


Deklarisanje i kreiranje skrolujueg okna, dodeljivanje prepoznatljivog naziva. Za myScrollPane, kd
je:
JScrollPane myScrollPane = new JScrollPane();

Postavljanje eljene veliine skrolujueg okna i, po elji, politike traka za pomeranje sadraja.
Uspostavljanje komponente koju e ugoavati skrolujue okno.
Dodavanje skrolujueg okna odgovarajuem menaderu rasporeda.
Praenje dogaaja ugoene(ih) kontrole(a) u oknu uobiajenim tehnikama.

Pripremio Dragan Markovi

Kontrola JSlider

Kontrola kliza (slider) je slina sa skrolujuom trakom samo ima drugaiji interfejs. Koristi se za
uspostvljanje numerikog ulaza (obino sasvim mali opseg). Moe biti orijentisan horizontalno ili
vertikalno. Klikom mia na slider, povlaenjem pokazivaa ili pritiskom na tastere <PgUp> ili <PgDn>
menja se vrednost ove kontrole. Inkrement promene postavlja kontrola slider i ne moe se promeniti.
Najmanji inkrement je jedan. Najvei inkrement je desetina opsega kontrole (ovaj inkrement se
dodaje/oduzima od vrednosti pritiskom na <PgUp> ili <PgDn>).

Svojstva JSlidera:
preferredSize
Specificirana veliina (width, height) slidera.
value
Tekui poloaj pokazivaa unutar slidera. Ako ovo postavljate kodiranjem, Java pomera
pokaziva na odgovarajui poloaj.
minimum
Minimalna mogua vrednost slidera.
maximum
Maksimalna mogua vrednost slidera.
paintTicks
Koristi se za uspostavljanje glavnih i pomonih markera skale ako su nacrtani.
majorTickSpacing Interval ponavljanja glavnog markera skale.
minorTickSpacing Interval ponavljanja pomonog markera skale.
paintLabels
Koristi se da doda labele vrednostima slidera.
inverted
Logika (Boolean) vrednost koja pokazuje pravac pomeranja pokazivaa. Ako je false,
pokaziva se inkrementira sa leva na desno ili od dna ka vrhu; ako je true, pokaziva se inkremenira sa desna
u levo ili od vrha ka dnu.
orientation
Odreuje da li slider lei horizontalno ili vertikalno.

Metodi JSlidera:

setPreferredSize
Uspostavlja veliinu slidera.
setValue
Postavlja tekuu vrednost.
getValue
Odreuje tekuu vrednost.
setMinimum
Uspostavlja minimalnu vrednost.
setMaximum
Uspostavlja maksimalnu vrednost.
setPaintTicks
Ako je true, markeri se crtaju.
setMajorTickSpacing
Postavlja interval ponavljanja glavnih markera (koristite nulu da ne bude glavnih
markra).
setMinorTickSpacing
Postavlja interval ponavljanja pomonih markera (koristite nulu da ne bude
pomonih markra).
setPaintLabels
Ako je true, labele se dodaju slideru.
setinverted
Logika (Boolean) vrednost koja pokazuje pravac pomeranja pokazivaa. Ako je false,
pokaziva se inkrementira sa leva na desno ili od dna ka vrhu.
setOrientation
Postavlja orijentaciju slidera (JSlider.HORIZONTAL za horizontalni slider,
JScrollBar.VERTICAL za vertikalni slider).

Dogaaj JSlidera:
stateChanged Dogaaj (ChangeEvent) se aktivira kada se vrednost slidera promeni. Dodaje se
sa ChangeListener (zahteva fajlove javax.swing.event.* ).

Da biste dodali sluaoca za dogaaj stateChanged kontrole slider pod nazivom mySlider, koristite:
mySlider.addChangeListener(new ChangeListener()
{
public void stateChanged(ChangeEvent e)
{
mySliderStateChanged(e);
}
});

A odgovarajui kd dogaaja treba da bude smeten u metodu mySliderStateChanged:

private void mySliderStateChanged (ChangeEvent e)


{
[kd metoda]
}

Par napomena vezanih za svojstva kontrole slider:


Uoite da kontrola slider moe da ima maksimum ili minimum na krajevima. Ovo je drugaije nego
kod kontrole skrolujua traka.
Ako ikada promenite kodiranjem svojstva value, minimum, ili maximum, proverite da li je value
svaki put izmeu minimum i maximum ili e se program zaustaviti sa porukom o greci.
Maksimalna vrednost se moe dostii kodiranjem ili operacijama mia. Za nju ne vae ogranienja
kao kod kontrole skrolujua traka (to znai da su dostini maksimum i svojstvo maximum iste
vrednosti).

Tipine radnje kod korienja kontole slider:


Deklarisanje i kreiranje kontrole slider, dodeljivanje prepoznatljivog naziva. Za mySlider, kd je:
JSlider mySlider = new JSlider ();
Postavljanje svojstava minimum, maximum i orientation. Inicijalizacija svojstva value. Ako elite,
izaberite markere skale i labele.
Smetanje kontrole u mreu rasporeda.
Dodavanje sluaoca i praenje dogaaja stateChanged za promenu vrednosti.

Kontrola JLabel (revizija)

Java ima mone karakteristike vezane za grafiku. Kao ilustraciju, razmotriemo jednu sposobnost
kontrole labela koju nismo pomenuli na prethodnom asu njenu sposobnost da prikae grafike
fajlove.

Svojstvo icon kontrole labela specificira grafiki fajl za prikaz. Tri tipa grafikih fajlova mogu da se vide
u kontroli labela:
Tip fajla Opis
JPEG
JPEG (Joint Photographic Experts Group) je komprimovani bitmapirani format koji
podrava 8- i 24-bitne boje. On je popularan na Internetu i uobiajeni je fomat kod digitalnih fotoaparata. JPEG naziv fajla ima tzv. ekstenziju .jpg.
GIF
GIF (Graphic Interchange Format) je komprimovani bitmapirani format koji je izvorno
razvio CompuServe. Podrava do 256 boja i takoe je popularan na Internetu. GIF naziv fajla ima
tzv. ekstenziju .gif.
PNG
PNG (Portable Network Graphics) format je popularan format za prenos grafikih fajlova

izmeu razliitih platformi. PNG naziv fajla ima tzv. ekstenziju .png.

Prikazane slike su ImageIcon. Da biste kreirali sliku pod nazivom myImage od fajla pod nazivom
myFile, koristite:
ImageIcon myImage = new ImageIcon(myFile);

Argument (vrednost tipa String) u metodu ImageIcon mora biti vaea putanja do postojeeg grafikog
fajla.
Kada pristupate fajlovima u Javi, njene reference su relativne u odnosu na direktorijum projekta. Stoga,
ako je dat samo naziv, podrazumeva se da je fajl lociran u direktorijumu projekta. Na primer, neka
imamo grafiki fajl hamburgera (burger.gif) smeten u direktorijum projekta. Da bi uitali tu grafiku u
myImage, treba da koristite:
ImageIcon myImage = new ImageIcon(burger.gif);

Ako imate svu grafiku smetenu u projektov poddirektorijum myGraphics, fajl se uitava pomou
naredbe:
ImageIcon myImage = new ImageIcon(myGraphics/burger.gif);

Ili, moete uvek obezbediti kompletnu putanju do fajla:


ImageIcon myImage = new ImageIcon(c:/myProject/myGraphics/burger.gi

Znate i sami, ako vaa grafika moe da se uita ona e se pojaviti!. Ako se ne pojavi, proverite da li je
navedena tana putanja i da li je fajl na toj lokaciji. Jo jednu stvar treba uoiti, Java koristi znak kose
crte - slash) (/) da razdvoji nazive direktorijuma i nazive fajlova. Ovo je suprotno od Windows
standarda korienja kose crte - backslash (\). Ako budete koristili backslash, dobiete poruku o
greci illegal escape character.

Kada je kreirana slika, esto vam je potrebno da znate njenu irinu i visinu. Ova svojstva se dobijaju
pomou metoda getIconWidth i getIconHeight. Za na primer:
width = myImage.getIconWidth();
height = myImage.getIconHeight();

Da biste dodelili ImageIcon kontroli labela, koristite metod setIcon. Za labelu nazvanu myLabel,
odgovarajui kd je:
myLabel.setIcon(myImage);

Da biste obrisali sliku iz labele, jednostavno postavite svojstvo icon na vrednost null. Time se
razdruuje svojstvo icon od poslednje uitane slike. Za na primer, kd je:
myLabel.setIcon(null);

ta odreuje kako se slika prikazuje u kontroli labela? Ako nije specificirana eljena veliina za kontrolu
labela, koristie se veliina izvornog grafikog fajla. Na primer, grafiki fajl hamburgera (burger.gif, 150
x 117 piksela), prikazan u kontroli labela u okviru:

Ako je eljena veliina dodeljena kontroli labela, vertikalno i horizontalno poravnavanje specificiraju
lokaciju grafike u labeli. Ako je labela manja od grafike, grafika e biti odseena (kropovana).

Kontrola JLabel (revizija)

Na primer, ovde je grafika hamburgera u manjoj labeli (sa levim i gornjim poravnavanjem):

A ako je labela vea od grafike, tada e postojati belina. Ovde je hamburger centriran (vertikalno i
horizontalno) u veoj labeli:

Kontrola labela e prikazati grafiku samo u njenoj originalnoj rezoluciji, tj. veliini. Ako elite da
prikaete veu grafiku u manjoj labeli, jedan mogui pristup je da u nekom softverskom paketu za
obradu slika podesite veliinu slike prema labeli tako to ete podesiti rezoluciju slike.
Uobiajena upotreba slika labele je da neto predstave: fajl, izbor u igrici ili lokaciju. A uobiajeni
zadatak je da se klikne miem na tu grafiku za selekciju. Dakle, dogaaj mouseClicked se prati da bi
se videlo da li je grafika (labela) selektovana. Kd za dodavanje dogaaja mouseClicked labeli pod
nazivom myLabel je:

myLabel.addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent e)
{
myLabelMouseClicked(e);
}
});

A odgovarajui metod myLabelMouseClicked je:


private void myLabelMouseClicked(MouseEvent e)
{
[kd metoda]
}

U ovom metodu moete da odredite naziv komponente na koju se klike (kontrola) pomou metoda
getComponent:

Component clickedComponent = e.getComponent();

Tipine radnje kod korienja kontrole labela za prikaz grafike:


Deklarisanje i kreiranje labele, dodeljivanje prepoznatljivog naziva. Za myLabel, naredba je:
JLabel myLabel = new JLabel();
Smetanje kontrole unutar menadera raspoerda.
Dodeljivanje objekta ImageIcon pomou metoda setIcon.
Dodavanje sluaoca i praenje dogaaja mouseClicked za selekciju labele.

Kontrola JFileChooser (otvaranje fajlova)


Uoite da biste postavili svojstvo icon kontrole labela, potreban vam je naziv grafikog fajla. ta ako
korisnik eli da izabere taj fajl sa svog raunara? Korisnik treba da obezbedi putanju i naziv tog grafikog
fajla. Kako moete prihvatiti tu informaciju od korisnika? Jedna mogunost je da koristite kontrolu tekst
polje, traei od korisnika da upie eljenu informaciju. Ovime pravite sebi nevolju. ak i najprostiju
putanju je problematino upisatati, treba navesti naziv drajva, naziv odgovarajueg direktorijuma, naziv
fajla i ekstenziju i voditi rauna gde sve dolaze kose crte (slashes). A zatim, vi kao programer, morate da
verifikujete da upisana informacija sadri valjanu putanju i naziv fajla.

Mislim da se i vi slaete da je traenje od korisnika da upie putanju i naziv fajla loa ideja. Mi elimo
da interfejsom tipa pokai i klikni dobijemo naziv fajla. Svaka GUI aplikacija obezbeuje takav interfejs
za otvaranje fajlova. Ovde je prikazano kako to izgleda u integrisanom razvojnom okruenju JCreator :

Java nam omoguava da koristimo isti interfejs u naim aplikacijama preko kontrole JFileChooser.
Ova kontrola je jedna iz skupa tzv. dijalokih kontrola koje moemo da dodamo naim aplikacijama.
Takoe, postoje dijalog kontrole za snimanje fajlova (opcija od JFileChooser), promenu fontova,
promenu boja i obavljanje operacija tampanja.

Ono to emo nauiti ovde nije ogranieno samo na otvaranje grafikih fajlova za kontrolu labela. esto

se u aplikacijama od korisnika trai naziv fajla. Aplikacije esto zahtevaju fajlove sa podacima,
inicijalizacione fajlove, konfiguracione fajlove, zvune fajlove i drugu grafiku. Kontrola JFileChooser e
biti korisna u svim ovim sluajevima.

Svojstva kontrole biraa fajla (JfileChooser):


approveButtonText
Tekst koji se pojavljuje na dugmetu odobrenja podrazumevana
vrednost je Open.
currentDirectory
Selektovani direktorijum.
dialogTitle
Naslov koji se pojavljuje u naslovnoj liniji dijaloga.
dialogType
Podrazumevano, dijalog Open (JFileChooser.OPEN_DIALOG), moe
se postaviti JFileChooser.SAVE_DIALOG za dijalog snimanja.
fileFilter
Koristi se da ogranii prikaz tipova fajlova.
selectedFile
Tekue selektovani fajl.

Metodi biraa fajla:


showOpenDialog

Prikazuje dijalog za otvaranje fajlova. Vraena vrednost pokazuje na koje


dugme je korisnik kliknuo (Open ili Cancel).
setApproveButtonText Postavlja tekst koji se pojavljuje na dugmetu approve (odobrenja).
getCurrentDirectory
Pretrauje selektovani direktorijum.
setDialogTitle
Postavlja naslov dijaloga.
setDialogType
Postavlja tip dijaloga.
setFileFilter
Postavlja filtar da ogranii prikaz tipova fajlova.
addChoosableFileFilter Dodaje filtar fajlova birau fajlova.
getSelectedFile
Pretrauje tekue selektovani fajl.
listFiles
Koristi se za dobijanje liste fajlova (objekt File) iz tekueg direktorijuma.

Dogaaji biraa fajla:


actionPerformed
Dogaaj (ActionEvent) koji se aktivira kada se selektuje dugme
odobrenja ili dugme cancel. Dodaje se sa ActionListener. Obino se prati kada je bira fajla
ugraen u aplikaciju.
propertyChange
Poziva se kadgod se svojstvo biraa fajla promeni. Obino se koristi da
detektuje promenu u selektovanju fajla.

Kontrola bira fajla moe se dodati aplikaciji kao bilo koja druga kontrola, ugraena u okvir. Ili, moe se
prikazati kada je to potrebno, kao okvir za dijalog. Obino se samo prate dogaaji kada je bira fajla
ugraen u aplikaciju.

Da biste dodali sluaoca za dogaaj actionPerformed biraa fajla pod nazivom myChooser, koristite:
myChooser.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
myChooserActionPerformed(e);
}
});

A odgovarajui kd dogaaja treba da bude smeten u metodu myChooserActionPerformed:


private void myChooserActionPerformed(ActionEvent e)
{
[kd metoda]
}

Kod ovog dogaaja, obino se proverava da li je kliknuto na dugme odobrenja (Open). Segment koda
koji to radi je:
if (e.getActionCommand().equals(JFileChooser.APPROVE_SELECTION))
{
[kd procesiranja]
}

Dogaaj propertyChange se dodaje pomou PropertyChangeListener. Za myChooser, koristite:


myChooser.addPropertyChangeListener(new PropertyChangeListener()
{
public void propertyChange(PropertyChangeEvent e)
{
myChooserPropertyChange(e);
}
});

Odgovarajui kd dogaaja treba da bude smeten u metod myChooserPropertyChange:

private void myChooserPropertyChange(PropertyChangeEvent e)


{
[kd metoda]
}

U ovom metodu, obino elimo da proverimo da je promenjeno svojstvo selektovani fajl. Da odredimo
promenu svojstva koje poziva ovaj dogaaj, koristite:

String pName = e.getPropertyName();

Ako je pName jednako JFileChooser.SELECTED_FILE_CHANGED_PROPERTY, imamo promenu


svojstva za koju smo zainteresovani.

Da bi prikazali bira fajla u dijalogu otvaranja, koristite metod showOpenDialog. Ako bira ima naziv
myChooser, format je:
myChooser.showOpenDialog(this);
gde je this kljuna re koja upuuje na tekui okvir. Prikazani okvir za dijalog je:

Korisnik selektuje fajl pomou dijalog kontrole (ili upisuje naziv u polje File Name). Tip fajla se selektuje

u polju Files of Type (ovde se vrednosti postavljaju svojstvom Filter). Kada se selektuje, klikne se na
dugme Open. Moe da se klikne na Cancel da se opozove operacija otvaranja. Metod
showOpenDialog vraa koje dugme je kliknuto. Ovaj metod e vratiti jednu od ove dve vrednosti:
JFileChooser.APPROVE_OPTION Kliknuto na dugme
odobrenja (Open)
JFileChooser.CANCEL_OPTION Kliknuto na dugme Cancel

Ako je korisnik selektovao dugme Open , moemo da odredimo selektovani fajl. Tu vrednost daje:
myChooser.getSelectedFile()

Vie kontrola zahteva da taj naziv bude tipa String (objekt ImageIcon, na primer). Ova konverzija se
radi pomou:
myChooser.getSelectedFile().toString()

Zgodna stvar kod ove kontrole je to ona moe da proveri valjanost naziva fajla pre nego to ga vrati
aplikaciji.
Kada se Java instalira, instalira se i skup demo programa. Ako je Java SDK instaliran u direktorijum
SDK, izvorni kd demo primera je u:
\SDK\demo\jfc

Tada se fajl, ExampleFileFilter.java, koji elimo da naliziramo nalazi u folderu


\FileChooserDemo\src.

Da bi koristili klasu ExampleFileFilter u projektu, prvo treba da dodamo klasu folderu sa naim
projektom.

Postoji vie konstruktora unutar klase ExampleFileFilter. Mi emo koristiti jedan. Poslaemo
konstruktoru niz prihvatljivih ekstenzija (tipa String) i opis ekstenzija. Kada je konstruisan, filtar se
dodeljuje birau pomou metoda addChoosableFileFilter.

Primer filtra za fajlove:


Uradimo primer za dva tipa grafikih fajlova (gif, jpg) da bi ilustrovali rad sa kontrolom.

Kd za dodavanje takvog filtra birau fajla pod nazivom myChooser je:


String[] ext = new String[] {gif, jpg};
myChooser.addChoosableFileFilter(new ExampleFileFilter(ext, Graphics Files));

Sa takvim kodom, bira e imati sledei izgled:

Tipine radnje kod korienja kontrole biraa fajla (ugraenog) za otvaranje fajlova:
Deklarisanje i kreiranje kontrole bira fajla, dodeljivanje prepoznatljivog naziva. Za myChooser,
kd je:
JChooser myChooser = new JChooser();

Postavljanje svojstva dialogTitle.


Dodavanje filtra fajla.
Smetanje kontrole u menader rasporeda.
Dodavanje sluaoca i praenje dogaaja actionPerformed za dogaaj klika na dugme ili korienje
dogaaja propertyChange za detektovanje promena selektovanog fajla.
Korienje metoda getSelectedFile za odreivanje fajla.

Tipine radnje kod korienja kontrole biraa fajla (okvir za dijalog) za otvaranje fajlova:
Deklarisanje i kreiranje kontrole biraa fajla, dodeljivanje prepoznatljivog naziva. Za myChooser,
kd je:
JChooser myChooser = new JChooser();

Postavljanje svojstva dialogTitle.


Dodavanje filtra fajla.
Korienje metoda showOpenDialog za prikaz okvira za dijalog.
Korienje metoda getSelectedFile za odreivanje fajla.

Pripremio Dragan Markovi

Java GUI (10)


Projekt Image Viewer
Pokrenite novi projekt. Dodelite mu naziv ImageProject. Dodajte prazan Java fajl sa
nazivom ImageViewer. Dodajte projektu fajl ExampleFileFilter.java iz Sunovog demo
foldera. U ovoj aplikaciji pretraivaemo po strukturi fajlova raunara grafike fajlove i
prikazati rezultat pretraivanja u kontroli za sliku. Koristiemo ugraeni bira fajla.
Konani oblik okvira e izgledati:

Aplikaciji su potrebne samo dve kontrole: bira fajla i labela.


GridBagLayout raspored je:

Svojstva za ove kontrole:


ImageViewer Frame:
title
Image Viewer
resizable
false
imageChooser:
gridx
0
gridy
0
imageLabel:
preferredSize
(270, 300)
border
RED line
opaque
true

background
WHITE
horizontalAlignment CENTER
verticalAlignment CENTER
gridx
1
gridy
0
insets
(10, 10, 10, 10);

Kao i obino, gradimo okruenje tako to emo poeti sa:


/*
* ImageViewer.java
*/
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class ImageViewer extends JFrame
{
public static void main(String args[])
{
//construct frame
new ImageViewer().show();
}

public ImageViewer()
{
// create frame
setTitle("Image Viewer");
setResizable(false);
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
exitForm(e);
}
});
getContentPane().setLayout(new GridBagLayout());
pack();
Dimension screenSize =
Toolkit.getDefaultToolkit().getScreenSize();
setBounds((int) (0.5 * (screenSize.width - getWidth())),
(int) (0.5 * (screenSize.height - getHeight())), getWidth(),
getHeight());
}
private void exitForm(WindowEvent e)
{
System.exit(0);
}
}

Kompajlirajte i izvrite da biste videli okvir centriran na ekranu.

Kreirajte kontrole sa deklaracijama na nivou klase:


static JFileChooser imageChooser = new JFileChooser();
static JLabel imageLabel = new JLabel();
Pozicionirajte kontrole i dodajte sluaoca dogaaja za bira fajla:

GridBagConstraints gridConstraints = new


GridBagConstraints();
String[] ext = new String[] {"gif", "jpg"};
imageChooser.addChoosableFileFilter(new
ExampleFileFilter(ext, "Graphics
Files"));gridConstraints.gridx = 0;
gridConstraints.gridy = 0;
getContentPane().add(imageChooser, gridConstraints);
imageChooser.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
imageChooserActionPerformed(e);
}
});
imageLabel.setPreferredSize(new Dimension(270, 300));
imageLabel.setBorder(BorderFactory.createLineBorder(Color.RED));
imageLabel.setOpaque(true);
imageLabel.setBackground(Color.white);
imageLabel.setHorizontalAlignment(SwingConstants.CENTER);
imageLabel.setVerticalAlignment(SwingConstants.CENTER);
gridConstraints.gridx = 1;
gridConstraints.gridy = 0;
gridConstraints.insets = new Insets(10, 10, 10, 10);
getContentPane().add(imageLabel, gridConstraints);

Sada emo dodati kd dogaaja imageChooserActionPerformed:


private void imageChooserActionPerformed(ActionEvent e)
{
// create and display graphic if open selected
if

(e.getActionCommand().equals(JFileChooser.APPROVE_SELECTION)
)
{
ImageIcon myImage = new
ImageIcon(imageChooser.getSelectedFile().toString());
imageLabel.setIcon(myImage);
}
}
U ovom kodu, ako korisnik klikne na dugme Open, selektovani fajl se koristi za
uspostavljanje objekta ImageIcon za prikaz u kontroli imageLabel.

Kompajlirajte i izvrite aplikaciju. Pronaite gif i JPEG fajlove. Ovde je

prikazano kako forma izgleda kada prikazuje JPEG fajl (fotka iz Meksika):

Pripremio Dragan Markovi

Java GUI radionica


Primer 1
Cilj: kreirati prozor sa naslovom i nekim tekstom unutar njega.
Fajl: Example1.java
Paket

Klasa

Metod

javax.swing

JFrame

Constructor: JFrame(String
title)

Konstruie okvir (= prozor sa


ivicom) sa naslovom

getContentPane()

Vraa komponentu u koju sadraj


moe da se smesti

pack()

Prilagoava veliinu okvira na


preporuenu veliinu svih njegovih
komponenti

show()

Prikazuje okvir na ekranu i izvlai


ga u prednji plan

Constructor: JLabel(String
text)

Konstruie labelu sa inicijalnim


tekstom u njoj

JLabel

Pored toga, on koristi metod add(Component) objekta Container (zato to getContentPane() vraa
objekat Component).
Primer moete kompajlirati i izvriti u MS-DOS promptu zadavanje sledeih naredbi:
Kompajliranje: javac Example1.java
Izvravanje: java Example1
Iz programa moete izai pritiskom na tastere CTRL+C u komandnom promptu.

Primer 2a
Cilj: kreirati prozor sa dugmetom u njemu i brojati koliko puta je korisnik kliknuo na dugme.
Fajl: ClickPanel.java
Paket

Klasa

Metod

javax.swing

JPanel

setLayout(LayoutManager)

Postavlja raspored za
komponentu. U ovom
primeru koristi se
BorderLayout.

add(Component, int location)

Ovaj metod moe da


se koristi ako

komponenta ima
BorderLayout. location
specificira lokaciju:
east, west, north, south
ili center.
JButton

Constructor: JButton(String)

Kreira dugme sa
inicijalnim tekstom u
njemu

addActionListener(ActionListener)

Specificira klasu koja


slua dogaaje koje
generiu klikovi na ovo
dugme

JLabel

setText(String text)

Menja tekst labele.

JFrame

setDefaultCloseOperation(int)

Specificira ta se
deava ako se pritisne
dugme X (close)
okvira. Mogue
operacije zatvaranja
su:
EXIT_ON_CLOSE
HIDE_ON_CLOSE
DISPOSE_ON_CLOSE

java.awt

BorderLayout

Constructor: BorderLayout()

Menader rasporeda
koji deli panel u 5
podoblasti: east, west,
north, south i center.

java.awt.event

ActionListener

actionPerformed(ActionEvent)

Ovaj metod poziva


komponenta koja
generie dogaaje (u
ovom sluaju:
clickButton).

ActionEvent

getSource()

Vraa komponentu
koja generie dogaaje
(u ovom sluaju:
clickButton)

ClickPanel proiruje JPanel i implementira ActionListener. Poto on proiruje JPanel, on je Panel gde
moete dodati sve vrste komponenti, kao to su dugmad, labele itd.. Poto on implementira
ActionListener, treba da ima void actionPerformed(ActionEvent) i oslukuje ActionEvents. Naredba
clickButton.addActionListener(this)
obezbeuje da ClickPanel slua sve ActionEvents koje generie clickButton. Svaki put kada se pritisne
clickButton, ovaj metod e biti pozvan.

Metod JFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) obezbeuje da se program


zaustavi ako se okvir zatvori. Nije vie potrebno da se pritisnu tasteri CTRL-C.

Primer 2b
Cilj: radi isto to i Primer 2a, ali sada sa eksternim ActionListenerom koji oslukuje dugme.
Fajlovi: ClickPanel2.java, ClickListener.java
Ovaj primer ne koristi nijedan novi metod. Razlika je samo u tome to ClickPanel nije vie ActionListener
za clickButton. Umesto toga, kreirana je nova klasa ClickListener, koja implementira ActionListener i
prima ActionEvent(e) od clickButton.
Ovo nije preporueni nain rada, ali je ovde korien samo da bi pokazao kako Listener(i) rade.
Kreira se klasa ClickListener. Kadgod se ActionEvent primi od clickButton, ona aurira tekst od
CountLabel. Meutim, CountLabel je privatno svojstvo od ClickPanel2 i moramo zato da kreiramo
konstruktora
ClickListener(JLabel countLabel)
Tako da e CountLabel postati privatno svojstvo i od ClickListenera (naredbom: this.countLabel =
countLabel). Vodite rauna da je broja n sada privatno svojstvo ClickListenera a nije vie od
ClickPanel2.

Primer 3a
Cilj: kreirati prozor sa tekst poljem iji sadraj moe da se ureuje, dugmetom i labelom na dugmetu.
Kadgod se dugme pritisne, tekst iz tekstualnog polja se kopira u labelu.
Fajl: TextExample1.java
Paket

Klasa

Metod

javax.swing

JTextField

Constructor:
JTextField(int width)

Konstruie tekst polje iji


sadraj moe da se ureuje
a koje moe da sadri
odreen broj znakova

String getText()

Vraa String koji sadri tekst


tekstualnog polja

setText(String text)

Zamenjuje tekst tekstualnog


polja sa novim Stringom

JFrame

setSize(Dimension)

Postavlja veliinu okvira u


pikselima

Dimension

Constructor:
Dimension(int width, int
height)

Kreira objekt Dimension


odreene irine i visine u
pikselima.

java.awt

java.awt.event

ActionListener
ActionEvent

Uoite da dugme nema unapred preporuenu svoju veliinu. Poto se postavlja u centralni deo
BorderLayouta, njegova veliina e biti **stretched da popuni sav centralni deo njegovog roditelja. Kod
BorderLayouta, komponente koje se smetaju u severni i juni deo imae unapred preporuene svoje
visine ali ne i irine. Komponente na istoku i zapadu e imati unapred preporuene svoje irine, ali ne i
visine. Kao to vidite, komponente u centru nee imati unapred preporuenu visinu niti irinu.

Primer 3b
Cilj: ovaj primer radi isto to i prethodni. Meutim, ako korisnik upie tekst i pritisne dugme Enter, tekst e
biti takoe kopiran u labelu. Da bi se ovo realizovalo dodat je jedan ActionLlistener za tekst polje.
ActionEvent e biti automatski generisan kadgod korisnik pritisne dugme Enter.
Fajl: TextExample2.java
Paket

Klasa

Metod

javax.swing

JTextField

addActionListener(ActionListener)

Dodaje ActionListener
koji e primati
ActionEvents od ovog
TextField. ActionEventi
se generiu kadgod
korisnik pritisne dugme
Enter .

Uoite da clickButton sada ima svoju unapred preporuenu veliinu. Da bi ovo realizovali stavili smo ga u
***dummy panel. Ovaj panel e **will be stretched da popuni celu centralnu oblast roditeljskog
BorderLayouta. Meutim ovaj panel ima svoj podrazumevani raspored FlowLayout. Ovaj raspored stavlja
komponente jednu do druge ne dirajui njihovu unapred preporuenu veliinu.

Primer 3c
Cilj: ovaj primer radi isto to i prethodni. Ali ako korisnik upie tekst, generisae se KeyEvent. Ovo nam
omoguava da kopiramo tekst iz tekst polja u labelu kao da smo ga upisali u labelu.
Fajl: TextExample3.java
Paket

Klasa

Metod

javax.swing

JTextField

addKeyListener(KeyListener)

Dodaje KeyListener koji


e primati KeyEvente od
ovog TextField. KeyEventi
se generiu kadgod
korisnik pritisne taster.

java.awt.event

KeyListener

keyPressed(KeyEvent)

Ovaj metod se poziva


kadgod se taster pritisne.

keyReleased(KeyEvent)

Ovaj metod se poziva


kadgod se taster otpusti
(naravno poto je
prethodno bio pritisnut)

keyTyped(KeyEvent)

Ovaj metod se poziva


kadgod se taster pritisne i
otpusti.

Sada doputamo panelu da implementira KeyListener. To znai da se moraju implementirati sledea tri
metoda: keyPressed, keyReleased i keyTyped. Za vie informacija proitajte Java API dokumentaciju o
KeyListeneru. Ovde je izabrano da se implementira metod KeyReleased, ali je mogue implementirati i
druga dva metoda. Efekt moe biti neznatno drugaiji. Uoite da sva tri metoda moraju da se
implementiraju, ak i ako izaberete da koristite samo jedan od njih.

Primer 4a
Cilj: Ovaj primer kreira okvir sa menijem. U okvir se smeta panel koji ima dva tekst polja i labelu.
Korisnik moe da stavi brojeve u tekst polje. Ako pritisne jednu od stavki menija okvira, okvir e traiti od
panela da obavi eljeno izraunavanje.
Fajlovi: CalculateFrame.java, CalculatePanel.java
Paket

Klasa

Metod

javax.swing

JMenuBar

Constructor: JMenuBar()

Kreira traku menija.

add(Menu)

Dodaje meni traci


menija.

int getMenuCount()

Vraa celobrojnu
vrednost koja je broj
menija trake menija.

Menu getMenu(int n)

Vraa n-ti meni trake


menija

Constructor: JMenu(String title)

Kreira meni sa
odreenim naslovom.

add(MenuItem)

Dodaje stavku menija u


meni.

addSeparator()

Dodaje graninik u meni

int getItemCount()

Vraa celobrojnu
vrednost koja je broj
stavki menija u meniju
(graninik je takoe
stavka menija).

MenuItem getItem(int n)

Vraa n-tu stavku


menija.

JMenu

JMenuItem

java.lang

java.awt

Constructor: JMenuItem(String
title)

Kreira stavku menija sa


odreenim naslovom.

addActionListener(ActionListener)

Dodaje ActionListener
koji slua ActionEvente
koje generie stavka
menija.

JFrame

setJMenuBar(JMenuBar)

Postavlja MenuBar za
JFrame

System

exit(int status)

Izlaz iz programa.

Integer

static void parseInt(String n)

Pokuava da ralani
string vrednost (n) u
celobrojnu vrednost.
Generie
NumberFormatException
ako String ne moe da
se ralani.

GridLayout

Constructor: GridLayout(int rows,


int columns)

Kreira GridLayout sa
specificiranim brojem
redova i kolona.

CalculateFrame je klasa koja sadri traku menija i CalculatePanel. CalculatePanel sadri tekst polja sa
brojevima i metodima koji obavljaju matematiku operaciju.
CalculatePanel je JPanel sa menaderom rasporeda GridLayout. Vie informacija moete proitati u Java
API dokumentaciji. To je neka vrsta matrice ije elije su jednake veliine.
Uoite sledee **cast to a double u metodu divide() CalculatePanela:
double solution = (double) number1 / number2;
Bez ovog **cast, operator / ima dve celobrojne vrednosti kao argumente. To znai da operator / obavlja
operaciju deljenja umesto operatora division. Ako je prvi argument operatora / double, tada e biti
obavljena operacija division.

Primer 4b
Cilj: ovaj primer radi isto to i prethodni samo to jo ima i obradu izuzetka.
Fajlovi: CalculateFrame2.java, CalculatePanel2.java
Paket

Klasa

Metod

java.lang

NumberFormatException

none

Ovaj izuzetak
se generie
kadgod
pokuate da
konvertujete
String u

celobrojnu
vrednost, ali
string sadri
necelobrojne
znakove
javax.swing

JOptionPane

static void
showMessageDialog(Component
parent, Object message, String
title, int messageType)

Kreira dijalog
sa porukom.

U ovom primeru dijalog sa porukom o greci e se pojaviti kada korisnik ne upie vaee brojeve u bilo
koje od tekst polja. Metod Integer.parseInt(String) e generisati NumberFormatException. U ovom
primeru mi hvatamo **catch Exception i obraujemo ga tako to prikazujemo dijalog sa porukom o greci.
JOptionPane je javax.swing klasa koja omoguava kreiranje modalnih dijaloga.Najee korieni metod
je static void
showMessageDialog(Component parent, Object message, String title, int messageType)
parent je roditelj Component (koristi se za modal svojstvo)
message je poruka dijaloga. Obino je ili String ili neki JPanel.
title je naslov dijaloga sa porukom
int messageType je jedno od sledeih: ERROR_MESSAGE, INFORMATION_MESSAGE,
WARNING_MESSAGE, QUESTION_MESSAGE, ili PLAIN_MESSAGE.
Te konstante se koriste da odrede ikonu dijaloga.
U Java API dokumentaciji moete proitati vie informacija o JOptionPane i kreiranju dijaloga.

Primer 4c
Cilj: ovaj primer radi isto to i prethodni primer, ali ima neto finiju obradu izuzetka.
Fajlovi: CalculateFrame3.java, CalculatePanel3.java, DivisionByZeroException.java
Ovaj primer ima neto inteligentniju implementaciju mehanizma obrade izuzekta. Poto su u prethodnom
primeru svi metodi (add(), subtract(), multiply() and divide()) radili istu stvar kadgod se uhvati
NumberFormatException, inteligentniji naina je da se generie NumberFormatException za jedan nivo
vie. Ovo se realizuje sa naredbom koja generie NumberFormatException.
Sada znamo da ovi metodi mogu da generiu taj izuzetak, tako da ga hvatamo u metodu
actionPerformed(ActionEvent) od CalculateFrame3. Stavljamo sve te metode u jedan veliki try-block i
hvatamo NumberFormatException i obraujemo ga.
Poto divide() moe da generie DivisionByZeroException, moramo takoe da ga hvatamo. U ovom
sluaju generiemo drugaiju poruku o greci.

Kd primera je dat u arhivi JGUIradionica.zip koju moete preuzeti sa sajta.

Pripremio Dragan Markovi

Você também pode gostar