Escolar Documentos
Profissional Documentos
Cultura Documentos
Control
Control
Control
Control
Control
{Code}
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 JButton:
Kontrola JLabel:
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 JRadioButton:
Kontrola JComboBox:
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:
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());
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);
}
});
}
});
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:
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() ).
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.
Description
Prikazuje dugme OK
Prikazuje dugmad OK i Cancel
Prikazuje dugmad Yes, No i Cancel
Prikazuje dugmad Yes i No
Description
Prozor se zatvara bez pritiskanja dugmeta
Dugme OK selektovano
Dugme Yes selektovano
Dugme No selektovano
Dugme Cancel selektovano
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.
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
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.
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.
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.
getX
getY
getWidth
getHeight
setBounds
setResizable
setVisible
/*
* 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);
}
}
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.
gridx = 0
gridx = 1
gridx = 2
gridx = 3
gridx = 4
gridy = 0
gridy = 1
gridy = 2
gridy = 3
gridy = 4
gridy = 5
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
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
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
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
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.
Kontrola JButton
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.
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();
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.
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();
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.
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:
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).
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.
setEditable
getItemCount
setMaximumRowCount
setFont
setBackground
setForeground
getSelectedItem
setSelectedIndex
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);
}
});
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.
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:
Metodi Spinnera:
model
value
font
background
foreground
getValue
setModel
setFont
setBackground
setForeground
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);
}
});
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);
mySpinner.getEditor()).getTextField().setForeground(myColor);
Ove promene se mogu uraditi poto je model spinnera uspostvaljen. Budue promene u Javi e
verovatno ukljuiti direktne metode za menjanje ovih svojstava.
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.
myScrollBar, koristite:
myScrollBar.addAdjustmentListener(new AdjustmentListener()
{
public void adjustmentValueChanged(AdjustmentEvent e)
{
myScrollBarAdjustmentValueChanged(e);
}
});
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());
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
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);
}
});
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.
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.
myRadioButtonActionPerformed(e);
}
});
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:
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.
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:
setBorder
setOpaque
setEnabled
setVisible
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();
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"));
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
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.
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)
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);
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.
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.
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.
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);
}
});
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);
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).
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);
}
});
U ovom metodu moete da odredite naziv komponente na koju se klike (kontrola) pomou metoda
getComponent:
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.
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);
}
});
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]
}
U ovom metodu, obino elimo da proverimo da je promenjeno svojstvo selektovani fajl. Da odredimo
promenu svojstva koje poziva ovaj dogaaj, koristite:
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
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.
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();
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();
background
WHITE
horizontalAlignment CENTER
verticalAlignment CENTER
gridx
1
gridy
0
insets
(10, 10, 10, 10);
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);
}
}
(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.
prikazano kako forma izgleda kada prikazuje JPEG fajl (fotka iz Meksika):
Klasa
Metod
javax.swing
JFrame
Constructor: JFrame(String
title)
getContentPane()
pack()
show()
Constructor: JLabel(String
text)
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.
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)
JLabel
setText(String text)
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)
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.
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)
String getText()
setText(String text)
JFrame
setSize(Dimension)
Dimension
Constructor:
Dimension(int width, int
height)
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)
java.awt.event
KeyListener
keyPressed(KeyEvent)
keyReleased(KeyEvent)
keyTyped(KeyEvent)
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()
add(Menu)
int getMenuCount()
Vraa celobrojnu
vrednost koja je broj
menija trake menija.
Menu getMenu(int n)
Kreira meni sa
odreenim naslovom.
add(MenuItem)
addSeparator()
int getItemCount()
Vraa celobrojnu
vrednost koja je broj
stavki menija u meniju
(graninik je takoe
stavka menija).
MenuItem getItem(int n)
JMenu
JMenuItem
java.lang
java.awt
Constructor: JMenuItem(String
title)
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
Pokuava da ralani
string vrednost (n) u
celobrojnu vrednost.
Generie
NumberFormatException
ako String ne moe da
se ralani.
GridLayout
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.