Struktura Java GUI aplikacije Počinjemo 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 kôd 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 pišete sve složenije programe. Brzo ćete se uveriti da nije teško razumeti taj kôd. Pogledajmo strukturu Java GUI aplikacije. Na ovom kursu koristićemo termine aplikacija, program i projekt kao sinonime. GUI aplikacija se sastoji od okvira (frame), sa pridruženim kontrolama (controls) i kodom (code). Pretočimo to u sliku: Frame Control
Control
Control
Control
Control
Control {Code}
Aplikacija (projekt) je napravljena od: ¾ Okvir (Frame) – prozor koji kreirate za korisnički interfejs (takođe se naziva i kao forma) ¾ Kontrole (Controls) – Grafički elementi postavljeni u okvir da omoguće korisniku interakciju (polja za tekst (text boxes), labele (labels), trake za pomeranje sadržaja 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, veličinu, boju, položaj i sadržaj. Java primenjuje podrazumevana (default) svojstva. Možete prilikom projektovanja promeniti svojstva ili čak kada se aplikacija izvršava. ¾ Metodi (Methods) – Ugrađene procedure koje se mogu uvesti da preduzmu neke akcije ili da promene ili utvrde svojstvo konkretnog objekta. ¾ Metodi događaja (Event Methods) - Kôd koji se odnosi na neki objekt ili kontrolu. To je kôd koji se izvršava kada se određeni događaj desi. U našim aplikacijama, ovak kôd ćemo pisati u Java jeziku. ¾ Opšti metodi (General Methods) - Kôd koji se ne odnosi na objekte. Taj kôd mora biti uveden ili pozvan u aplikaciji. Aplikacija prikazana na prethodnoj slici ima samo jednu formu ili okvir. Kako budemo napredovali sa kursom, pravićemo aplikacije sa sve više formi. Kôd za svaku formu biće obično smešten u svoj fajl sa oznakom tipa (ekstenzijom) .java. Pridržavaćemo se sledećih koraka kod gradnje Java GUI aplikacije: 1. Kreiranje okvira. 2. Kreiranje korisnikovog interfejsa postavljanjem kontrola u okvir. 3. Pisanje koda za metode događaja kontrole (a možda i drugih metoda).
Ova procedura se primenjuje bez obzira da li pravite vrlo prostu aplikaciju ili neku koja obuhvata mnoštvo kontrola o ogroman broj redova programskog koda. Da vas podsetim, GUI aplikacije koje ćemo mi praviti koristiće Java Swing i AWT (Abstract Windows Toolkit) komponente. Svaki od ovih koraka zahteva od nas da pišemo Java kôd a ponekad i mnogo koda. Događajima upravljana (event-driven) priroda Java aplikacija dozvoljava nam da gradimo svoje aplikacije po fazama i da je testiramo posle svake faze. Možete napraviti jedan metod, ili deo metoda odjednom i onda ga prepravljati sve dok ne proradi kako želite. Ovo minimizuje greške i uliva vama kao programeru poverenje pošto vaša aplikacija polako poprima konačan oblik. Bez obzira na vaše napredovanje u programiranju uvek koristite ovaj sekvencijalni pristup u građenju Java aplikacije. Gradite po malo, testirajte to, malo prepravite i testirajte ponovo. Vrlo brzo ćete imati završenu aplikaciju.
Swing kontrole Kontrole koje ćemo koristiti u GUI aplikacijama biće Swing komponente. Ove komponente su definisane u paketu javax.swing i sve imaju nazive koji počinju 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). Koristićemo ih u našim primerima bez mnogo objašnjavanja kako se one koriste. Kasnije ćemo obraditi svojstva i događaje koji su pridruženi različitim kontrolama. •
Kontrola JFrame:
Kontrola okvir je osnovni „kontejner” za druge kontrole. To je okruženje za Java projekt. Svojstvo title postavlja informaciju o potpisu (caption). Svaka aplikacija koju ćemo graditi počeće građenjem klase koja proširuje kontrolu JFrame. •
Kontrola JButton:
Kontrola dugme se koristi za pokretanje neke akcije. Svojstvo text se koristi za postavljanje potpisa (caption). •
Kontrola JLabel:
Kontrola labela omogućava 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 više redova informacije koju upisuje korisnik (svojstvo text). •
Kontrola JCheckBox:
Kontrola polje za potvrdu se koristi za obezbeđivanje Da/Ne odgovora na pitanje. •
Kontrola JRadioButton:
Kontrola radio dugme se koristi za selektovanje isključivo 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 padajuće liste (sa spiska – gradovi, zemlje, artikli). •
Kontrola JList:
Kontrola lista je slična kontroli kombinovano polje, samo što je deo sa listom uvek vidljiv. Kod kontrole liste može se izabrati više stavki a ne samo jedna kao kod kombinovanog polja. •
Kontrola JScroll:
Kontrola za pomeranje prikazanog sadržaja 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, uključujući korišćenje 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 okruženje za ceo program. Kôd (Stopwatch.java) koji kreira okvir unutar ovog osnovnog okruženja 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); } } Kôd pišite red po red i pažljivo vodite računa da ste otkucali sve kako je pokazano. Kako kucate, uočićete da pošto ste otkucali levu vitičastu zagradu ({), JCreator editor dodaje odgovarajuću desnu vitičastu zagradu (}) i automatsku uvlači sledeći red. Editor primenjuje pravilo uvlačenja svakog bloka koda. Po definiciji, JCreator uvlači za 4 znaka svaki nivo. Da biste promenili ovu vrednost, izaberite stavku Configure u glavnom meniju a zatim stavku Options. Selektujte Java Editor i upišite novu vrednost za Tabs Size. Na ovom kursu mi ćemo koristiti uvlačenje od 2 znaka a ne 4 (stvar ličnog izbora). Kao kod vitičastih zagrada, kada otkucate desnu zagradu dodaje se odgovarajuća desna zagrada. Takođe, treba uočiti još jednu stvar a to je da editor koristi različite boje za različite stvari u kodu. Zeleni tekst pretstavlja komentare. Kôd se ispisuje crnom bojom a ključne reči plavom. Ova kolorna šema ponekad pomaže kod identifikovanja grešaka koje ste napravili prilikom kucanja.
Kada završite upisivanje koda, trebalo bi da vidite:
Ovaj kôd kreira okvir proširujući (extending) Swing JFrame objekt, što znači da on uzima sve karakteristike takvog okvira. Kôd ima konstruktora (constructor) za objekt Stopwatch. Trebalo bi da ste primetili da on koristi (izvršava) dva metoda: jedan za postavljanje naslova (setTitle) i drugi za postavljanje veličine (setSize). Konstruktora poziva metod main da kreira okvir. Mi ćemo koristiti istu osnovnu strukturu u svakom našem projektu na ovom kursu. Biće građen konstruktor za okvir i sve pridružene kontrole i događaje kontrole. Okvir će biti konstruisan u metodu main. Kompajlirajte projekt (pritisnite
ili izaberite u meniju Build, zatim Compile Project). Pokrenite izvršavanje projekta (pritisnite ili izaberite Build, zatim Execute Project). Videćete na ekranu svoj prvi okvir:
Kreiranje korisničkog interfejsa Pošto imamo kreiran okvir, sada ćemo kreirati korisnički interfejs „stavljanjem” kontrola u okvir. Ovo stavljanje podrazumeva pisanje nekoliko redova logičkog Java koda po željenoj kontroli.
Objekt pod nazivom menadžer rasporeda (layout manager) određuje kako su kontrole raspoređene unutar okvira. Navešćemo ovde nekoliko menadžera rasporeda i njihove karakteristike: FlowLayout BorderLayout CardLayout GridLayout GridBagLayout BoxLayout SpringLayout
Stavlja kontrole u sukcesivne redove, uklapajući kontrolu koliko je moguće u dati red. Stavlja kontrole naspram jedne od četiri ivice okvira. Stavlja kontrole jednu na drugu slično špilu karata. Stavlja kontrole unutar specificirane pravougaone mreže. Stavlja kontrole sa specificiranom vrlo fleksibilnom pravougaonom mrežom. Raspoređuje kontrole ili po redovima ili kolonama. Raspoređuje kontrole na položaje definisane „by sprints and struts”.
Ovog puta koristićemo GridBagLayout. Po mom mišljenju, on nudi interfejs najlepšeg izgleda. Kako budemo odmicali sa kursom, saznavaćete sve više i više o mogućnostima ovog menadžera. Ako želite možete proučavati mogućnosti i drugih menadžera rasporeda. Okvir je u stvari napravljen od nekoliko različitih okana (panes). Kontrole se stavljaju na okno sadržaja (content pane) okvira. GridBagLayout menadžer deli okno sadržaja u mrežu 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 povećava kako idemo niz mrežu. Leva kolona je Column 0 i numeracija kolona se povećava sa leva na desno duž mreže. Objekt GridBagConstraints se koristi za stavljanje kontrole i pozicioniranje unutar različitih elemenata mreže. Kontrole se stavljaju u ovu mrežu navođenjem određene kolone (gridx lokacija) i reda (gridy lokacija). Numeracija i kolona i redova počinje od nule (0). Mreža ne mora da bude (ali može) dimenzionisana. Ona automatski raste kako se kontrole dodaju. Videćemo kako je GridBagLayout menadžer veoma fleksibilan. Kontrole mogu da zahvate više od jedne kolone/reda i mogu da se smeste (koristeći insets) bilo gde unutar elementa mreže. Jednim redom koda u našem konstruktoru okvira potrebno je specificirati da ćemo u oknu sadržaja okvira koristiti GridBagLayout: getContentPane().setLayout(new GridBagLayout());
Da bi stavili kontrolu u GridBagLayout mrežu, treba preduzeti sledeće korake: ¾ ¾ ¾ ¾
Deklarisati kontrolu. Kreirati kontrolu. Uspostaviti svojstva željene kontrole. Dodati kontrolu rasporedu okna sadržaja na željenu poziciju.
U projektima koje gradimo, sve kontrole biće deklarisane na nivou klase (class level scope), što znači da će kontrole i pridružena svojstva i metodi biti na raspolaganju svakoj metodi u klasi. Prema tome, sve kontrole biće deklarisane odmah posle leve zagrade za otvaranje klase, pre prvog metoda. Pošto kontrole treba da budu na raspolaganju u okviru klase, njihova deklaracija će imati kao prefiks službenu reč static. Takođe, kontrolama ćemo dodeljivati raspoznavajuće nazive (meaningful names). Uobičajena je praksa da se kontrolama dodeljuju nazivi koji počinju sa nekim opisom njihove namene, zatim se nadovezuje tip kontrole na kraju naziva. Takva konvencija dodeljivanja naziva olakšava čitanje i pisanje Java koda. Primeri naziva za kontrole dugme, labela i polje za tekst (kontrole koje ćemo koristiti u našem primeru štoperice): startButton stopButton elapsedLabel startTextField Da biste deklarisali kontrolu, upišite naredbu: static ControlType controlName; U Swing biblioteci, kontrola dugme je tipa JButton. Prema tome, da bi deklarisali naše dugme startButton, koristimo: static JButton startButton; Da bi kreirali prethodno deklarisanu kontrolu, koristimo naredbu: controlName = new ControlType(); Za naše dugme za početak merenja vremena, Java kôd je: startButton = new JButton(); Proces deklarisanja i kreiranja kontrole može se objediniti u jedan red koda. Mi ćemo uvek tako raditi. Za naš primer, deklaracija kontrole treba da bude: static JButton startButton = new JButton(); Sledeći korak je da podesimo svojstva željene kontrole. Format tog koda je:
controlName.setPropertyName(PropertyValue); Ovde je setPropertyName metod za podešavanje željenog svojstva. Kada budemo detaljno diskutovali kontrole, objasnićemo većinu ovih metoda. Za sada, samo ćemo ih koristiti bez objašnjavanja. Za primer, da biste podesili tekst koji se pojavljuje na dugmetu za start vremena “Start Timing,” treba da napišete sledeće: startButton.setText(“Start Timing”); Sledeći korak (da, znam da ima mnogo koraka) je da pozicioniramo kontrolu u GridBagLayout mreži. Prvo, treba da deklarišemo objekt tipa GridBagConstraints da bi omogućili pozicioniranje. Pretpostavimo da se ovaj objekt naziva gridConstraints, tada deklaracija ima sledeći oblik: GridBagConstraints gridConstraints = new GridBagConstraints(); Ova naredba se stavlja na vrh koda konstruktora okvira. Sada koristimo trostepeni proces da stavimo svaku kontrolu u mrežu. Odlučimo se za x lokaciju (desiredColumn) i y lokaciju (desiredRow). Zatim, koristimo sledeći kôd za primerak kontrole sa nazivom controlName): gridConstraints.gridx = desiredColumn; gridConstraints.gridy = desiredRow; getContentPane().add(controlName, gridConstraints); Stavićemo dugme za startovanje vremena u gornji levi ugao mreže, zato koristimo: gridConstraints.gridx = 0; gridConstraints.gridy = 0; getContentPane().add(startButton, gridConstraints); Da bi okončali stavljanje kontrola u okvir, pokrenimo metod pack: pack(); Ovime se „pakuje” mrežni raspored u okvir i kontrole postaju vidljive. Na kraju, odlučite 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 izvršite metod pack finalizujete stavljanje. U sledećem nastavku biće 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 napiše kôd aplikacije. Pisaćemo kôd za potreban odziv na svaki događaj. U ovoj aplikaciji imamo tri takva događaja: klik na svako dugme. 1. Ispod redova koji deklarišu kontrole okvira, deklarišemo 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 događaja windowClosing (svakom GUI projektu biće potreban taj kôd – stavimo ga posle reda kojim se definiše naslov okvira): addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { exitForm(e); } }); Sada dodajemo kôd odgovarajućeg metoda događaja: private void exitForm(WindowEvent e) { System.exit(0); } Ovaj metod se stavlja pre završne desne vitičaste zagrade klase Stopwatch (uobičajeno mesto za metode). Ovaj red koda kaže aplikaciji da se zaustavi. Kreirajmo sada događaj actionPerformed za startButton. Dodajmo slušaoca (ovde stavljamo posle koda koji stavlja kontrolu u okvir): startButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { startButtonActionPerformed(e); } });
Zatim, dodajmo metod događaja 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 tekuće vreme pomoću sistemske funkcije (u millisekundama) i stavlja ga u polje za tekst pomoću metoda setText. Takođe, brišemo druga polja za tekst. U prethodnom kodu (i svim kodovima na ovom kursu),svaki red koji počinje sa dve kose crte (//) je komentar. Na vama je da odlučite da li ćete te redove pisati ili ne. Komentari nisu neophodni za korektan rad aplikacije. 3. Sada dodajemo slušaoca za metod događaja actionPerformed za stopButton: stopButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { stopButtonActionPerformed(e); } }); Zatim dodajemo ovaj metod događaja 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, očitava se tekuće vreme (stopTime), izračunava proteklo vreme (u sekundama) i stavljaju obe vrednosti u njima pripadajuće kontrole tipa polja za tekst. 4. Na kraju, potreban nam je kôd u metodu actionPerformed za kontrolu exitButton. Dodajemo slušaoca: 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 kôd Stopwatch.java (novododati kôd je zasenčen): /* * 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); } } Proučite kôd da biste uočili kako su metodi stavljeni. Kompajlirajte (pritisnite ) i izvršite aplikaciju (pritisnite ). Isprobajte kako funkcioniše. Ako vaša aplikacija ne radi, proverite kôd još jednom. Snimite aplikaciju kao Primer 2 u svoj radni folder. Kod probanja aplikacije trebalo bi da dobijete prikaz sličan prethodnoj slici:
Pokušajte sami da napravite izmene u aplikaciji štoperice: A. Pokušajte da promenite boju pozadine okvira. B. Uočite da možete da pritisnete dugme ‘Stop Timing’ pre dugmeta ‘Start Timing’. To ne bi smelo da ostane tako. Promenite aplikaciju tako da to ne može da se desi. Takođe, dugme ‘Start Timing’ ne bi trebalo da može da se pritisne sve dok dugme ‘Stop Timing’ nije bilo pritisnuto. Savet: Pogledajte za kontrolu dugme svojstvo enabled. C. Da li ste razmišljali o kontinualnom prikazivanju ‘End Time’ i ‘Elapsed Time’? To zahteva dobro poznavanje prirode Jave, tj. upravljanje događajima. Pogledajte detaljno klasu Timer (istražujte malo Javu). Podešavanjem svojstva delay ove klase na vrednost 1000, ona generiše sopstvene događaje svake sekunde. Stavite kôd sličan tome u metod događaja za stopButton metoda actionPerformed klase Timer i posmatrajte šta se dešava.
Zadaci za vežbanje: Zadatak 1 - Beep Problem. Napravite aplikaciju sa jednim dugmetom. Kada se klikne na dugme, računar se oglasi (zapišti). (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 omogućava da se dugme koristi za više namena. Ako želite da vratite nazad natpis na dugmetu, kliknite na dugme još jednom (biće vam potrebna naredba if ). Zadatak 3 - Enabled Problem. Napravite aplikaciju sa dva dugmeta. Kada kliknete na jedno dugme, ono biva onemogućeno (enabled = false) a drugo omogućeno, tj, dostupno (enabled = true). Zadatak 4 - Date Problem. Napravite aplikaciju sa dugmetom. Kada se klikne na dugme, računar prikazuje tekući datum u kontroli tipa polje za tekst. Da biste ovo rešili potrebno je da proučite klasu Date.
Dijalog za potvrđivanje (JOptionPane) Često korišćeni okvir za dijalog u Java GUI aplikacijama je dijalog za potvrđivanje (confirm dialog, poznat i kao okvir sa porukom (message box)). Ovaj dijalog dopušta da prikažete korisniku poruke i primite povratnu informaciju za dalji rad. Može da se koristi za prikazivanje poruka o greškama, opisivanje potencijalnih problema ili za prikaz rezultata nekog izračunavanja. Dijalog za potvrđivanje se implementira korišćenjem Java Swing klase JOptionPane. Dijalog za potvrđivanje je univerzalan, ima mogućnost da prikaže poruku, opcionu ikonu i izabrani skup dugmadi. Korisnik odgovara klikom na dugme u okviru za dijalog. Sigurno ste imali prilike da vidite dijaloge za potvrđivanje ukoliko ste koristili neku Windows aplikaciju. Setite se svih primera koje ste videli. Na primer, dijalozi za potvrđivanje se koriste kod snimanja fajla pre nego što napustite aplikaciju da vas upozore ako disk jedinica nije spremna. Na primer, ako dok pišete tekst u Microsoft Wordu, pokušate da napustite, videćete dijalog za potvrđivanje: poruka naslov
Ikona
dugme
U ovom okviru za dijalog označeno je više delova koje možete da kontrolišete. Ubrzo ćete saznati kako možete da uobličite prema svojim potrebama dijalog za potvrđivanje. Da biste koristili metod confirm dialog, morate da odlučite koja će biti poruka, koji naslov želite i koja ikona i dugmad su odgovarajući. Da bismo prikazali okvir dijaloga za potvrđivanje u kodu, koristimo metod showConfirmDialog. Metod showConfirmDialog je preopterećen (overloaded) sa nekoliko načina za implementiranje okvira za dijalog. Evo nekoliko uobičajenih načina: 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 potvrđivanje pridružen tekućem okviru.
Kao što je malopre rečeno, vi odlučujete šta želite kao poruku (message) i naslov (title ) (podaci tipa string) u dijalogu za potvrdu. Obratite pažnju da nema ograničenja koliko poruka može da bude dugačka. Ako imate dugu poruku, koristite znak za novi red (\n) da biste poruku razdelili u više 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 uobičajena notacija sa tačkoma: 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 uskličnik QUESTION_MESSAGE Prikazuje ikonu upitnik Za specificiranje ikone sintaksa je: JOptionPane.Member Da bi prikazali ikonu greške (error) koristi se: JOptionPane.ERROR_MESSAGE Kada uvedete metod showOptionDialog, on vraća 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 potvrđivanje: Ovo parče 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 kôd za različite zadatke u zavisnosti od toga na koje dugme (Yes i No) je korisnik kliknuo (ili je prozor jednostavno zatvoren). Drugi primer: Više puta vama je potrebno samo da prikažete korisniku kratku poruku bez potrebe za povratnom informacijom (upravo dugme OK). Ovaj kôd obavlja taj posao: JOptionPane.showConfirmDialog(null, "Quick message for you.", "Hey you!!", JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE); Kao rezulatat dobijamo dijalog sa porukom:
Uočite da ikona i dugme OK nisu prikazani. Takođe, uočite u kodu da nema potrebe da čitamo vraćenu vrednost – mi znamo šta je ona! Možete naći mnoštvo primera ovog prostog okvira sa porukom. •
Skoro da smo spremni da počnemo proučavanje Java Swing kontrola, posmatranjem važnih svojstava, metoda i događaja za većinu kontrola. Ali, pre nego što počnemo, razmotrimo dva koncepta koji će nam pomoći da „obučemo” naše GUI aplikacije – Font i Color objekte.
Objekt Font •
U svim GUI aplikacijama koje smo do sada pravili, koristili smo podrazumevani font pridružen Swing kontrolama (dugmadima, labelama i tekst poljima). Korišćenje podrazumevanog fonta je ograničavajuće 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 definiše sve karakteristike konkretnog fonta (naziv, stil, veličina). 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 definiše naziv fonta a fontSize je celobrojna vrednost koja definiše veličinu fonta u pointima.
•
fontStyle argument je Font konstanta koja definiše stil fonta. Ona može da ima tri vrednosti: Vrednost PLAIN BOLD ITALIC
•
Opis Regular text Bold text Italic text
Osnovni (bez efekata) font se definiše kao Font.PLAIN. Da bi dodali bilo koji efekt, koristi se odgovarajuća konstanta. Ako font ima više od jednog efekta, kombinujemo ih pomoću 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));
•
Takođe, možete da definišete promenljivu da bude tipa Font. Deklarišimo promenljivu saglasno uobičajenim razmatranjima vezanim za oblast važenja: Font myFont; Zatim, dodelimo font promenljivoj za korišćenje u drugim kontrolama: myFont = new Font(“Courier New”, Font.PLAIN, 12); thisControl.setFont(myFont); thatControl.setFont(myFont); Prethodno može biti skraćeno 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 može se postaviti da bude neka određena boja. Boja teksta u ovim kontrolama se postavlja kao boja prednjeg plana (foreground color). kasnije, kada se budemo bavili grafikom, videćete kako se linije, elipse i pravougaonici mogu crtati i popunjavati različitim bojama. Te boje moraju da se definišu u Java kodu. Kako se to radi? Postoje dva pristupa: (1) korišćenje ugrađenih boja i (2) kreiranje boje.
•
Boje ugrađene 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 vaše potrebe, možete kreirati sopstvenu boju koristeći neku od preko 16 miliona različitih kombinacija. Kôd za kreiranje RGB boje pod nazivom myColor je: Color myColor = new Color(redValue, greenValue, blueValue); gde su redValue, greenValue blueValue celobrojne mere intenziteta odgovarajućih primarnih boja. Ove mere su u opsegu od 0 (najmanji intenzitet) do 255 (najveći intenzitet). Na primer, new Color(255, 255, 0) će dati žuto.
•
Korišćenjem objekta Color lako je specificirati boju. Svaki put kada vam je potrebna boja, koristite neku od ugrađenih boja ili kreirajte sopstvenu pomoću različitih vrednosti crvene, zelene i plave boje. Ove tehnike možete koristiti bilo gde kada Javi zahteva boju. Na primer, da biste promenili boju pozadine okvira (myFrame), koristimo: myFrame.getContentPane().setBackground(Color.colorName); Mi bojimo sadržaj okna (content pane) pošto su kontrole postavljene u okno. Dakle, žutu pozadinu dobijate sa: myFrame.getContentPane().setBackground(Color.YELLOW); Ili znajući kombinaciju crvene, zelene i plave: myFrame.getContentPane().setBackground(new Color(redValue, greenValue, blueValue));
•
Takođe, možete 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 znači da bilo koja dodeljena boja pozadine neće 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); Počećemo da koristimo boje u našim primerima da bi pokazali dalje korišćenje boja.
•
Takođe, možete da definišete promenljive koje uzimaju vrednosti boja. Recimo želite da definišete promenljivu pod nazivom myRed da predstavlja crvenu boju. Prvo, deklarišite svoju promenljivu da bude tipa Color: Color myRed; Zatim, definišete svoju boju u kodu koristeći naredbu: myRed = Color.RED; Sa te tačke gledišta, možete koristiti myRed svuda gde se crvena boja zahteva. Po želji, u istom redu koda možete deklarisati i definisati boje. Za prethodni primer, treba da napišete: 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 proširuje (extends) objekt JFrame, što znači da će naša aplikacija ****acquire sve karakteristike okvira. To je centralna stvar u razvoju Java GUI aplikacija. Okvir je objekt kontejner (container), pošto on „drži” druge kontrole. Jedno od svojstava objekta kontejner je svojstvo vidlivosti (visible property) koje ako se postavi na vrednost false, znači da će sve kontrole postati nevidljive.
•
Ovde ćemo objasniti neka šire korišćena svojstva (Properties), metode (Methods) i događaje (Events) okvira (frame). Da vas podsetim, svojstva opisuju izgled i vrednost kontrole, metode su akcije koje možete ****impose na kontrolama a događaji se pojavlju kada se nešto uradi sa kontrolom (obično od strane korisnika). Ovo nije ****exhaustive list – potražite u literaturi iscrpnije informacije. Možda sada ne prepoznajete sve pomenute termine, ali kako vaše učenje bude napredovalo biće vam sve jasnije.
•
Svojstva okvira (Frame Properties): title font background foreground x y width height resizable visible
•
Naslov prozora okvira. Naziv, stil, veličina 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. Logička (Boolean) vrednost koja pokazuje da li je okvir fiksne ili podesive veličine. 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, veličinu fonta. Postavlja boju pozadine okvira. Postavlja boju teksta ili grafike.
getX getY getWidth getHeight setBounds setResizable setVisible •
Događaji 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 logićku (boolean) vrednost koja pokazuje da li je okvir fiksne ili podesive veličine. Postavlja logičku (boolean) vrednost koja pokazuje da li je okvir vidljiv ili ne.
Pojavljuje se (WindowEvent) kada se forma zatvara. Dodaje se sa WindowListener pomoću WindowAdaptera.
Slušalac (listener) za događaj windowClosing dodaje se u metodi konstruktora okvira pomoću: addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { exitForm(e); } }); A uobičajena metoda exitForm je: private void exitForm(WindowEvent e) { System.exit(0); }
•
Tipična radnje vezane za upotrebu objekta okvira: Kreiranje objekta okvir, korišćenjem uobičajene metode konstruktora. Postavljanje svojstva title. Centriranje okvira u sredini ekrana (biće kasnije objašnjeno kako se to radi). Postavljanje svojstva resizable na false. Možete da imate forme podesive veličine u Java GUI aplikacijama, ali toga neće biti na ovom kursu. ¾ Dodavanje slušaoca za događaj windowClosing. ¾ Attach menadžera GridBagLayout. Postavljanje kontrola u menadžer rasporeda mreže i izvršavanje metode pack. ¾ ¾ ¾ ¾
•
Opšte okruženje 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); } }
Aranžiranje i centriranje okvira •
Da li ste primetili da je u svim aplikacijama koje smo do sada gradili okvir počinjao u gornjem levom uglu ekrana? Međutim, bilo bi lepo kada bi okvir bio centriran kada se aplikacija pokrene. Sada će biti pokazano kako to može da se uradi. Prvo, pogledajmo kako veličinu okvira postavlja menadžer GridBagLayout.
•
Koristimo menadžer GridBagLayout da postavimo naš GUI aplikacije (naravno, možete koristite i druge menadžere rasporeda). Da vas podsetim, kod ovog menaždera koristi se mreža (grid) za razmeštanje 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 smeštaj i pozicioniranje kontrole unutar različitih elemenata mreže. Kontrole se smeštaju u ovu mrežu navođenjem (referenciranjem) konkretne kolone (lokacija gridx) i reda (lokacija gridy). Videli smo da se mreža (i okvir) automatski šire kako se dodaju kontrole. Širina kolone se postavlja na „najširu” kontrolu u toj koloni. A visina reda se postavlja na „najvišu” 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 frame’s 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 frame’s ‘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. We’ll 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 najviše korišćena Java GUI kontrola. Ona se koristi za otpočinjanje, prekid ili završetak konkretnog procesa. Stoga ćemo ovde navesti neka najviše korišćena svojstva, metode i događaje za kontrolu dugme.
•
Svojstva dugmeta (Button Properties): - text - font - background - foreground - icon - enabled - visible
♦
String koji se prikazuje na dugmetu. Naziv, stil i veličina fonta. Boja pozadine dugmeta. Boja teksta. Slika prikazana na dugmetu Ako je false, dugme je vidljivo, ali ne može da prihvati klik miša. Ako je false, sakriva dugme.
Metodi dugmeta (Button Methods): - setText - setFont - setBackground - setForeground - setEnabled ne. - setVisible - doClick
•
Postavlja tekst dugmeta. Postavlja naziv, stil i veličinu fonta. Postavlja boju pozadine dugmeta. Postavlja boju teksta. Postavlja logičku (boolean) vrednost da pokaže da li dugme reaguje na klik ili Postavlja logičku (boolean) vrednost da pokaže da li je dugme vidljivo ili ne. Generiše događaj klika za dugme.
Događaj dugmeta (Button Event): actionPerformed Događaj (ActionEvent) koji se aktivira (triggered) kada se dugme selektuje bilo klikom na njega ili pritiskanjem razmaknice. Dodaje se sa ActionListener. Da bi dodali slušaoca za actionPerformed događaj za kontrolu dugme nazvanu myButton, koristite: myButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { myButtonActionPerformed(e); } });
Kontrola JButton ♦
A odgovarajući kôd događaja treba da bude smešten u metod myButtonActionPerformed : private void myButtonActionPerformed(ActionEvent e) { [kôd metoda] }
•
Tipične radnje kod korišćenja kontrole dugme: Deklarisanje i kreiranje dugmeta, dodeljivanje raspoznavajućeg naziva. Za myButton, naredba je: JButton myButton = new JButton();
Postavljanje svojstva text. Stavljanje kontrole unutar menadžera rasporeda. Dodavanje slušaoca i pisanje koda događaja actionPerformed dugmeta.
Takođe, možete promeniti svojstva font, background i foreground.
Kontrola JLabel
♦
Kontrola labela se koristi da prikaže tekst koji korisnik ne može direktno da prepravlja. Tekst kontrole labela može da se promeni kao rezultat odziva na događaje.
•
Svojstva labele (Label Properties): - text - font - background - foreground - opaque - horizontalAlignment - verticalAlignment - border
♦
String prikazan u labeli. Naziv, stil i veličina fonta. Boja pozadine labele. Boja teksta. Određuje da li je kontrola neprozirna ili prozirna. Horizontalna pozicija teksta Vertikalna pozicija teksta Tip korišćene 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 veličinu 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
♦
Događaj labele (Label Event): mouseClicked Događaj (MouseEvent) se aktivira kada se na labelu klikne mišem (pogodno za selektovanje između izbora labela). Dodaje se sa MouseListener(om) pomoću MouseAdapter(a).
♦
Kôd za dodavanje događaja 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) { [Kôd metoda] } ♦ Postoje tri moguće 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 mogućih argumenata.
Bordura se ponekad dodaje kontroli labela da bi podražavala izgled trodimenzionalnog (beveled) tekst polja. Da bi dodali takvu borduru labeli sa nazivom myLabel, koristite: myLabel.setBorder(BorderFactory.createLoweredBevelBorder()); Postoji više vrsta bordura. Ukoliko vas to zanima, potražite u literaturi reference za BorderFactory. •
Tipične radnje koje se preduzimaju kod rada sa kontrolom labela za statički 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. Smeštanje kontrole sa menadžerom rasporeda. Takođe, po želji možete promeniti svojstva font, background i foreground.
•
Tipične 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. Smeštanje kontrole sa menadžerom rasporeda. Takođe, po želji možete 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 izvršavanja ili dodeljene pomoću koda. Prikazani tekst može da se uređuje.
•
Svojstva tekst polja: - text - font - background - foreground - columns - horizontalAlignment - editable
•
String prikazan u tekst polju. Naziv, stil i veličina 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. Pretražuje tekst tekst polja. Postavlja naziv, stil i veličinu fonta. Postavlja boju pozadine tekst polja. Postavlja boju teksta. Postavlja broj kolona. Postavlja horizontalno poravnavanje. Ako je false, tekst polje ne može da se uređuje.
♦
Postoje tri moguće vrednosti za poravnavanje po horizontali (horizontalAlignment): SwingConstants.LEFT Tekst levo poravnat SwingConstants.CENTER Tekst centriran SwingConstants.RIGHT Tekst desno poravnat
♦
♦
Događaj (Event) tekst polja: actionPerformed Pojavljuje se (ActionEvent) kada korisnik pritisne . Dodaje se ActionListener(om). Da bi dodali slušaoca za događaj actionPerformed kontrole tekst polje pod nazivom myTextField, koristite: myTextField.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { myTextFieldActionPerformed(e); } });
♦
A odgovarajući kôd događaja treba da bude smešten u metodu myTextFieldActionPerformed : private void myTextFieldActionPerformed(ActionEvent e) { [kôd metoda] }
•
Tipične radnje kod korišćenja 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. Smeštanje kontrole sa menadžerom rasporeda. Takođe, po želji možete promeniti svojstva font, background i foreground.
Tipične radnje kod korišćenja kontrole tekst polje kao ulaznog uređaja: 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. Smeštanje kontrole sa menadžerom rasporeda. Dodavanje slušaoca za događaj actionPerformed. U kodu, davanje focus(a) (korišćenje metoda requestFocus) kontroli kada je potrebno. Čitanje svojstva text kada se javi događaj actionPerformed. Takođe, po želji možete promeniti svojstva font, background i foreground.
♦
Korišćenje kontrole tekst polje (i svake druge kontrole kod koje korisnik nešto kuca) treba svesti na minimum ukoliko je moguće. Kadgod korisniku date opciju da nešto upisuje, otežavate sebi kao programeru posao. Treba da proverite valjanost upisane informacije kako bi bili sigurni da će ona raditi sa vašim kodom. Postoji u Javi više kontrola koje su tipa „pokaži i klikni” (point and click), tj. korisnik može da napravi izbor prosto klikom miša. Te kontrole ćemo kasnije obraditi. Kadgod je moguće koristite te kontrole umesto tekst polja!
Kontrola JTextArea
♦
Kontrola tekst polje (JTextField) može da prikaže samo jedan red informacije. Slična kontrola koja omogućava prikazivanje više redova teksta (u jednom fontu) je kontrola tekst oblast (text area). Kao i tekst polje, ova kontrola može da se koristi za prikazivanje informacije inicijalizovane kada je okvir kreiran, upisane od strane korisnika tokom izvršavanja aplikacije ili dodeljene unutar koda. Prikazani tekst može da se uređuje.
•
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 veličina fonta. Boja pozadine tekst oblasti. Boja teksta. Širina prikaza tekst oblasti. Visina prikaza tekst oblasti. Broj redova teksta. Logička (Boolean) promenljiva koja pokazuje da li tekst može da se „prelama” (word wrapped) – podrazumeva se vrednost false. Ako je true (i lineWrap je true), reči se prelamaju na granicama reči. Pokazuje da li je tekst tekst oblasti samo za čitanje (read-only).
Postavlja tekst tekst oblasti. Pretražuje tekst tekst oblasti. Postavlja naziv, stil i veličinu fonta. Postavlja boju pozadine tekst oblasti. Postavlja boju teksta. Postavlja broj kolona. Postavlja broj redova. Uključuje/isključuje prelom reda. Uključuje/isključuje prelom reči. Ako je postavljeno na false, tekst oblast ne može da se uređuje.
Tipične radnje kod korišćenja 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. Smeštanje kontrole sa menadžerom rasporeda. Takođe, po želji možete promeniti svojstva font, background i foreground.
Tipične radnje kod korišćenja kontrole tekst oblast kao ulaznog uređaja: 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. Smeštanje kontrole sa menadžerom rasporeda. U kodu, davanje focus(a) (koristiti metod requestFocus) kontroli kada je potrebno. Čitanje svojstva text kada se javi događaja actionPerformed. Takođe, po želji možete promeniti svojstva font, background i foreground.
♦
Kada budete počeli da koristite kontrolu tekst oblast, uočićete da nema tzv. skrolovanja, tj. da ne
može da se pomera prikaz sadržaja oblasti. Srećom, kontrola JTextArea može lako da se ugradi u drugu Swing komponentu, JScrollPane (biće obrađena kasnije) da bi se implementirale trake za horizontalno i vertikalno pomeranje sadržaja (scroll bars).
Pripremio Dragan Marković
Java GUI - SWING komponente (nastavak) (8) Kontrola JComboBox
•
Kontrola lista ekvivalentna je grupi polja za potvrdu (koja omogućava višestruku selekciju u dugoj listi stavki). Ekvivalentna kontrola za dugu listu radio dugmadi je kontrola kombinovano polje (combo box). Kombo polje omogućava selekciju jedne stavke u padajućoj listi. A, ako želi, korisnik može da upiše alternativni odziv. Kombo polje koristi sopstveni „model liste” koji omogućava direktno dodavanje i uklanjanje stavki u padajućoj listi. Takođe, obezbeđuje sopstveni mehanizam skrolovanja – ne treba mu skrolujuće okno.
•
Svojstva kombo polja: model Uspostavlja stavke u padajućoj listi. itemCount Broj stavki u kombo polju. font Naziv, stil i veličina fonta. background Boja pozadine kombo polja. foreground Boja teksta. editable Specificira ako selekciju može da upiše korisnik (podrazumevano je is false). maximumRowCount Broj redova za prikaz u padajućoj listi (trake za pomeranje sadržaja će se automatski pojaviti ako ima više stavki nego prostora). selectedIndex Indeks (zero-based) tekuće selektovane stavke u kombo polju. selectedItem Tekuće selektovana stavka u kombo polju.
•
Metodi kombo polja:
•
♦
setEditable getItemCount setMaximumRowCount setFont setBackground setForeground getSelectedItem setSelectedIndex
Događaj kombo polja: actionPerformed
Uspostavlja da li selektovana stavka može da se uređuje. Daje broj stavki u kombo polju. Postavlja broj stavki za prikaz u padajućoj listi. Postavlja naziv, stil i veličinu fonta. Postavlja boju pozadine kombo polja. Postavlja boju teksta. Pretražuje selektovanu stavku. Selektuje specificiranu stavku u kombo polju.
Događaj koji se aktivira kada korisnik obavi selekciju ili pritisne . Dodaje se sa ActionListener.
Da bi dodali slušaoca za događaj actionPerformed kontrole kombo polje pod nazivom myComboBox, koristite: myComboBox.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { myComboBoxActionPerformed(e); } });
♦
A odgovarajući kôd događaja treba da bude smešten u metod myComboBoxActionPerformed : private void myComboBoxActionPerformed(ActionEvent e) { [kôd metoda] }
♦
Kombo polje ima sopstveni model liste za dodavanje i uklanjanje stavki iz svoje padajuće liste, što olakšava upravljanje listom u odnosu na upravljanje kod kontrole lista. Stavke se dodaju kombo polju (myComboBox) pomoću 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 mogućnost sortiranih listi – da biste imali takve liste morate programiranjem da dodate tu mogućnost.
♦
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();
♦
Uočite da kada uklanjate stavke, da indeksi sledećih 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)
•
Tipične radnje kod korišćenja kontrole kombo polje: Deklarisanje i kreiranje kontrole kombo polje, dodeljivanje prepoznatljivog naziva. Za myComboBox, kôd je: JComboBox myComboBox = new JComboBox();
Postavljanje svojstva editable i dodavanje stavki kombo polju (obično u metodu main). Smeštanje kontrole unutar menadžera rasporeda. Praćenje događaja 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 padajuću listu. Koristi se za izbor stavki iz relativno kratkih listi. Korišćenjem različitih modela, mogu se „vrteti” različite informacije. Posmatraćemo dva slučaja. 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 može da upiše vrednost, ako želi. Takve kontrole su zgodne za obezbeđivanje datuma u mesecu ili se koriste kao kontrole za jačinu u nekim multimedijalnim aplikacijama.
♦
list spinner je po izgledu sličan sa number spinnerom. Razlikuju se po tome što list spinner prikazuje listu string stavki (a ne brojeve) kao potencijalne kandidate za izbor. Kontrola se obično koristi za relativno male liste. Primeri korišćenja su selektovanja država ili gradova u adresarima, selektovanje meseca u kalendaru ili selektovanje naziva iz kratke liste.
•
Svojstva Spinnera:
♦
♦
Model korišćen za obezbeđivanje informacije za spinner. Tekuća vrednost prikazana u kontroli spinner. Naziv, stil i veličina fonta. Boja pozadine spinnera. Boja teksta.
Metodi Spinnera:
•
model value font background foreground
getValue setModel setFont setBackground setForeground
Određuje tekuću vrednost spinnera. Uspostavlja model koji se koristi u kontroli Postavlja naziv, stil i veličinu fonta. Postavlja boju pozadine spinnera. Postavlja boju teksta.
spinner.
Događaj Spinnera: stateChanged Događaj (ChangeEvent) se aktivira kada se promeni vrednost spinnerarrial. Dodaje se sa ChangeEventListener (zahteva uvoženje fajlova javax.swing.event.arrial ). Događaj stateChanged je za nas nov. Da bi dodali slušaoca za takav događaj kontrole spinner pod nazivom mySpinner, koristite: mySpinner.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { mySpinnerStateChanged(e); } });
♦
A odgovarajući kôd događaja treba da bude smešten u metodu mySpinnerStateChanged : private void mySpinnerStateChanged(ChangeEvent e) { [kôd 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 Veličina inkrementa ili dekrementa prikazane vrednosti kada se klikne na odgovarajuću strelicu.
•
♦
U našem slučaju sve vrednosti će biti tipa int. Takođe, model omogućava double tipove za vrednosti, minimum, maksimum i veličinukoraka (stepSize). Vrednost number spinnera može se promeniti klikom miša na jednu od strelica ili, opciono, upisivanjem vrednosti. Ako se koriste strelice, vrednost će uvek biti između minimuma i maksimuma. Ako korisnik upisuje vrednost, vi nemate kontrolu nad vrednošću koja se upisuje. Međutim, ne mogu se napraviti podešavanja number spinnera sve dok je prikazana vrednost izvan prihvatljivog opsega (između minimuma i maksimuma). Da bi povratili numeričku vrednost spinnera (za matematičke operacije) potrebno je malo veštine u kodiranju. Vrednost koju vraća metod getValue je objekt koji ne može 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, kôd koji sve to radi u našem primeru spinnera (mySpinner) je:
myValue = Integer.valueOf(mySpinner.getValue().toString()).intValue(); ♦
Kod list spinnera, informacija koja se prikazuje je smeštena u niz tipa String. Niz se zatim dodeljuje spinneru pomoću 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) može se promeniti klikom miša na bilo koju strelicu ili, opciono, upisivanjme vrednosti. Ako korisnik upisuje vrednost, vi nemate kontrolu nad upisanom vrednošću. Ako se upiše neispravna vrednost, ne registruje se događaj stateChanged sve dok upisana vrednost se ne poklopi sa nekom od vrednosti iz spinnerove liste.
♦
Možda ste primetili da, poredeći 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 znači da ste osuđeni na podrazumevane vrednosti? Ne, to samo znači 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 pošto je model spinnera uspostvaljen. Buduće promene u Javi će verovatno uključiti direktne metode za menjanje ovih svojstava.
•
Tipične radnje kod korišćenja kontrole spinner: Deklarisanje i kreiranje kontrole spinner, dodeljivanje prepoznatljivog naziva. Za mySpinner, kôd je: JSpinner mySpinner = new JSpinner(); Odlučivanje 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)); Smeštanje kontrole u menadžer rasporeda. Dodavanje slušaoca i praćenje događaja stateChanged za promene vrednosti. Korišćenje metoda getValue za utvrđivanje tekuće vrednosti.
Kontrola JScrollBar
•
Kontrola number spinner je pogodna za relativno male opsege numeričkog ulaza. Međutim, ona neće dobro raditi za velike numeričke opsege – trošićete mnogo vremena na „kliktanje” mišem na njene strelice. Za velike opsege brojeva koristimo kontrole scroll bar („skrolujuća traka”; traka sa klizačem). Ove kontrole se mnogo koriste u GUI aplikacijama. One obezbeđuju intuitivan način za kretanje kroz listu informacija i predstavjaju sjajne ulazne uređaje. Ovde se koriste za dobijanje celog broja (podatak tipa int).
♦
Trake sa klizačem su sastavljene od tri oblasti na koje može da se klikne, ili povlači mišem, da bi promenili vrednost. Te oblasti su:
♦
Klikom miša na granične strelice (end arrow) inkrementira se skrolujući okvir (scroll box) za mali iznos, klikom miša na oblast trake (bar area) inkrementira se skrolujući okvir za veliki iznos, a povlačenjem klizača (dugme trake) obezbeđuje se kontinualna promena (pomeranje). Pomoću svojstava ove kontrole možemo potpuno da specificiramo kako ona radi. Pozicija skrolujućeg okvira je jedina izlazna informacija od skrolujuće trake.
•
Svojstva skrolujuće trake: preferredSize Specificirana veličina (width, height) skrolujuće trake. value Tekuća pozicija skrolujućeg okvira (dugme) unutar skrolujuće trake. Ako ovo postavljate kodiranjem, Java pomera skrolujući okvir na odgovarajuću poziciju. minimum Minimalna moguća vrednost skrolujuće trake. maximum Maksimalna moguća vrednost skrolujuće trake. unitIncrement Inkrement koji se dodaje ili oduzima od vrednosti value skrolujuće trake kada se klikne na neku od graničnih strelica. blockIncrement Inkrement koji se dodaje ili oduzima od vrednosti value kada se klikne na oblast trake. extent Širina (Width) skrolujućeg okvira. orientation Određuje da li skrolujuća traka leži horizontalno ili vertikalno.
•
Metodi skrolujuće trake: setPreferredSize Uspostavlja veličinu skrolujuće strake. setValue Postavlja tekuću vrednost. getValue Određuje tekuću vrednost. setMinimum Uspostavlja minimalnu vrednost. setMaximum Uspostavlja maksimalnu vrednost. setUnitIncrement Uspostvalja svojstvo unitIncrement. setBlockIncrement Uspostvalja svojstvo blockIncrement. setVisibleAmount Postavlja širinu (veličinu) skrolujućeg okvira. getVisibleAmount Određuje širinu (veličinu) skrolujućeg okvira. setOrientation Postavlja orijentaciju skrolujuće trake (JScrollBar.HORIZONTAL za horizontalnu, JScrollBar.VERTICAL za vertikalnu traku).
•
Događaj skrolujuće trake: adjustmentValueChanged
♦
Događaj (AdjustmentEvent) koji se aktivira kada se vrednost (value) skrolujuće trake promeni. Dodaje se sa AdjustmentEventListener (zahteva uvoženje fajlova javax.swing.event.* ). Lokacija svojstava za horizontalnu skrolujuću traku:
♦
Lokacija svojstava za vertikalnu skrolujuću traku:
•
Nekoliko važnih napomena vezanih za svojstva skrolujuće trake: Uočite da vertikalna skrolujuća traka ima svoj minimum na vrhu a svoj maksimum na dnu. Ovo može biti suprotno od očekivanog u nekim aplikacijama, tj. korisnici možda očekuju da se stvari „rastu” kako se ide naviše. Ovako ponašanje možete postići definisanjem druge promenljive koja se ponaša suprotno od svojstva value skrolujuće trake. Ako ikada promenite kodiranjem svojstva value, minimum, ili maximum, proverite da li je value svaki put između minimum i maximum ili će se program zaustaviti sa porukom o grešci.
♦
Da biste dodali slušaoca za događaj adjustmentValueChanged kontrole skrolujuća traka sa nazivom
myScrollBar, koristite: myScrollBar.addAdjustmentListener(new AdjustmentListener() { public void adjustmentValueChanged(AdjustmentEvent e) { myScrollBarAdjustmentValueChanged(e); } }); ♦
A odgovarajući kôd događaja treba da bude smešten u metod myScrollBarAdjustmentValueChanged: private void myScrollBarAdjustmentValueChanged (AdjustmentEvent e) { [kôd metoda] }
•
Tipične radnje kod korišćenja kontrole scroll bar: Deklarisanje i kreiranje kontrole skrolujuća traka, dodeljivanje prepoznatljivog naziva. Za myScrollBar, kôd je: JScrollBar myScrollBar = new JScrollBar(); Postavljanje svojstava minimum, maximum, unitIncrement, blockIncrement i orientation. Inicijalizacija svojstva value. Smeštanje kontrole u raspored mreže. Dodavanje slušaoca i praćenje događaja adjustmentValueChanged za promenu vrednosti.
♦
Napomena za svojstvo maximum: Zbog širine skrolujućeg okvira (extent - veličine), vrednost maximum ne može se postići klikom miša na granične strelice, oblast trake ili povlačenjem dugmeta. Maksimalna dostižna vrednost preko operacija sa mišem je data preko relacije: “dostižni” maksimum = maximum – extent
gde je extent širina skorlujućeg okvira. Šta to znači? Da bi dostigli “dostižni” maksimum, treba da postavite svojstvo maximum skrolujuće trake pomoću sledeće jednačine: maximum = “dostižni” maksimum + extent ♦
Da biste dobili extent (ili širinu skrolujućeg okvira), koristite metod getVisibleAmount. Na primer, ako želite da skrolujuća traka (myScrollBar) dostigne 100, postavite maximum pomoću: myScrollBar.setMaximum(100 + myScrollBar.getVisibleAmount());
Pripremio Dragan Marković
Java GUI - SWING komponente (nastavak) (7) Kontrola JCheckBox
♦
•
•
Kao što je pomenuto ranije, Javu karakteriše mnošto „point and click” kontrola koje omogućavaju korisniku da napravi izbor jednostavnim klikom sa mišem. Ove kontrole su atraktivne, pogodne i minimizuju mogućnost grešaka u vašim aplikacijama. Upoznaćemo nekoliko takvih kontrola na ovom kursu. Prvo ćemo se upoznati sa kontrolom polje za potvrdu (check box). Ova kontrola obezbeđuje način da se napravi izbor sa liste potencijalnih kandidata. Neke, sve ili nijedna stavka iz grupe može se odabrati. Polja za potvrdu se koriste u skoro svim GUI aplikacijama. Primeri njihovog korišćenja su uključivanje i isključivanje 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 veličina 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 veličinu 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. Generiše događaj klika za polje za potvrdu.
Događaj polja za potvrdu: actionPerformed Pojavljuje se (ActionEvent) kada se klikne na polje za potvrdu. Dodaje se sa ActionListener.
♦
Da bi dodali slušaoca za događaj actionPerformed kontrole polje za potvrdu pod nazivom myCheckBox, koristite: myCheckBox.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { myCheckBoxActionPerformed(e); } });
♦
A odgovarajući kôd događaja treba da bude smešten u metod myCheckBoxActionPerformed : private void myCheckBoxActionPerformed(ActionEvent e) { [kôd 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.
•
Tipične radnje kod korišćenja 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. Smeštanje kontrole unutar menadžera rasporeda. Dodavanje slušaoca za praćenje događaja 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. Takođe, možete da promenite svojstva font, background i foreground.
Kontrola JRadioButton
•
Kontrole radio dugme (Radio button) obezbeđuju mogućnost „ekskluzivnog” izbora u okviru grupe potencijalnih kandidata. Ovo prosto znači da radio dugmad rade kao grupa u okviru koje samo jedno dugme se može izabrati. Radio dugmad se sreću u mnogim GUI aplikacijama. Nazivaju se radio dugmad zato što rade kao dugmad automobilskog radio prijemnika – možete slušati 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 veličina fonta. Boja pozadine radio dugmeta. Boja teksta. Pokazuje da li je dugme selektovano ili ne.
Postavlja tekst radio dugmeta. Postavlja naziv, stil i veličinu 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. Generiše događaj klika za radio dugme.
Događaj radio dugmeta: actionPerformed Pojavljuje se (ActionEvent) kada se klikne na radio dugme. Dodaje se sa ActionListener.
♦
Da bi dodali slušaoca za događaj actionPerformed kontrole radio dugme nazvane myRadioButton, koristite: myRadioButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {
myRadioButtonActionPerformed(e); } }); ♦
A odgovarajući kôd događaja treba da bude stavljen u metod myRadioButtonActionPerformed : private void myRadioButtonActionPerformed(ActionEvent e) { [kôd metoda] }
♦
Uočite da radio dugmad uvek rade kao grupa, koja garantuje da jednovremeno ne može da bude izabrano više od jednog dugmeta. Kako da definišete „grupu” radio dugmadi? Grupe radio dugmadi se definišu pomoću klase ButtonGroup. Grupa se kreira a dugmad se dodaju grupi pomoću ButtonGroup add metoda. Kao primer, recimo da imamo tri radio dugmeta: firstRadioButton, secondRadioButton, thirdRadioButton i želimo da budu deo myGroup. Kôd koji to uspostavlja ima sledeći 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 kružića pored selektovanog dugmeta. A sva preostala dugmad iz grupe će tada imati svojstvo selected postavljeno na false.
•
Tipične radnje kod korišćenja 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 sličan naziv da biste ga identifikovali sa grupom). Za myRadioButton, naredba je: JRadioButton myRadioButton = new JRadioButton(); Postavljanje svojstva text. Takođe, možete da promenite svojstva font, background i foreground. Inicijalizovanje svojstva selected dugmeta na vrednost true. Dodavanje kontrole menadžeru rasporeda. Dodavanje slušaoca za praćenje događaja 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 logička grupisanja kontrola. Na primer, možete da imate uređaj za tzv. skrolovanje koji postavlja vrednost prikazanog broja. Kontrola panel obezbeđuje pogodan način grupisanja povezanih kontrola u Java GUI aplikaciji.
•
Svojstva Panela: - enabled - visible
•
Metodi Panela:
Pokazuje da li je panel omogućen. Ako je false, sve kontrole u panelu su onemogućene. 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 omogućen. Postavlja da li je panel vidljiv.
Kontrola panel je kontejner (container) kao i kontrola okvir (frame). Dakle, proces smeštanja kontrola u kontrolu panel je identičan sa procesom koji se koristi za smeštanje kontrola u okvir. Svaka kontrola panel ima svog menadžera rasporeda (mi ćemo i dalje koristiti GridBagLayout). Prema tome, kontrole se smeštaju u panel pomoću menadžera rasporeda. Paneli se smeštaju u okvir pomoću menadžera rasporeda okvira. Pogledajmo prost primer smeštanja jedne kontrole (myControl) u panel (myPanel) koji je u okviru myFrame. Smatraćemo da su myControl i myFrame deklarisani i kreirani. Prema tome, treba da deklarišemo i kreiramo panel: JPanel myPanel = new JPanel();
♦
Zatim, dodelimo menadžera rasporeda (ovde GridBagLayout): myPanel.setLayout(new GridBagLayout());
♦
Stavimo kontrolu u panel (pošto postavimo željeno gridConstraints): myPanel.add(myControl, gridConstraints);
♦
Dodajmo bilo koje druge kontrole panelu, zatim dodajmo panel okviru koristeći okvirov skup ograničenja: getContentPane().add(myPanel, gridConstraints);
♦
Bordura sa naslovom često se dodaje kontroli panel. Kôd za dodavanje takve bordure sa naslovom „My Panel” za naš primer panela je: myPanel.setBorder(BorderFactory.createTitledBorder("My Panel"));
♦
Panel sa naslovom će izgledati slično datoj slici:
♦
Druge (preopterećene) verzije metoda TitledBorder za kreiranje naslova omogućavaju vam da postavite font i boju naslova.
•
Tipične radnje kod korišćenja kontrole panel: Deklarisanje i kreiranje panela, dodeljivanje prepoznatljivog naziva. Za myPanel, kôd je: JPanel myPanel = new JPanel();
Dodavanje bordure po želji. Smeštanje željenih kontrola u panel. Praćenje događaja kontrola u panelu pomoću uobičajenih tehnika. Dodavanje panela okviru sa menadžerom rasporeda.
Kontrola JList
•
Polja za potvrdu su pogodne kontrole za selektovanje stavki sa spiska (liste). Međutim, šta ako vaša lista ima 100 stavki? Da li želite 100 polja za potvrdu? Ne, ali srećom, postoji alat koji rešava taj problem. Kontrola lista prikazuje listu stavki (sa onoliko stavki koliko je potrebno) sa koje korisnik može da selektuje jednu ili više stavki. Podržani su i izbor jedne i izbor više stavki.
•
Svojstva liste: - model Uspostavlja stavke u listi. - font Naziv, stil i veličina fonta. - background Boja pozadine liste. - foreground Boja teksta. - visibleRowCount Broj redova za prikaz. - selectedIndex Indeks (počinje od nule) tekuće selektovane stavke u listi. - selectedIndices Niz (indeksiranje od nule) indeksa svih tekuće selektovanih stavki u listi. - selectedItem Tekuće selektovana stavka u listi. - selectedItems Niz selektovanih stavki u listi. - selectionMode Daje ili postavlja metod kojim se stavke selektuju u listi (dozvoljava jednu ili više selekcija). - selectionEmpty Logička (Boolean) promenljiva koja pokazuje ako je bilo koja stavka selektovana.
•
Metodi liste:
•
♦
setFont Postavlja naziv, stil i veličinu fonta. setBackground Postavlja boju pozadine liste. setForeground Postavlja boju teksta. setVisibleRowCount Postavlja broj redova za prikaz. clearSelection Poništava specificiranu selekciju u listi. getSelectedIndex Vraća vrednost koja pokazuje da li je specificirana stavka selektovana. getSelectedIndices Vraća integer niz indeksa selektovanih stavki. setSelectedIndex Selektuje specificiranu stavku u listi. setSelectionMode Uspostavlja režim selekcije. isSelectionEmpty Proverava da vidi ako je bilo koja stavka selektovana
Događaj liste: valueChanged
Događaj (ListSelectionEvent) koji se aktivira kada se bilo koja selekcija u listi promeni. Dodaje se sa ListSelectionListener (zahteva uvoženje fajlova javax.swing.event.* ). Događaj valueChanged je za nas nov. Da bi dodali slušaoca za takav događaj u kontroli lista sa nazivom myList, koristite: myList.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { myListValueChanged(e); } });
♦
A odgovarajući kôd događaja treba da bude smešten u metod myListValueChanged : private void myListValueChanged(ListSelectionEvent e) { [kôd metoda] }
♦
Stavke navedene u kontroli lista se definišu pomoću objekta DefaultListModel. Ovaj model upravlja podesivim (resizable) nizom informacija, takvim kao što je ovaj korišćen u kontroli lista.
Takav model (myListModel) se kreira pomoću: DefaultListModel myListModel = new DefaultListModel(); ♦
Kada je kreirana, stavke se dodaju listi pomoću 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 mogući. Često, želite da stavke u kontroli lista budu sortirane, ili alfabetski poređane. Ne postoji automatizam u okviru kontrole lista da održava sortirane liste. Ako želite takvu mogućnost, morate sami da to kodirate koristeći 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(); Uočite, kada uklonite stavke, da indeksi sledećih 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) pomoću metoda setModel: myList.setModel(myListModel);
Uvek vodite računa o tome kada radite sa kontrolom lista a kada sa modelom liste. Primarna stvar o kojoj treba da vodite računa je da se stavke dodaju i brišu iz modela liste pomoću indeksa koje obezbeđuje kontrola lista. ♦
Svojstvo selectionMode specificira da li želite selekciju jedne ili više stavki. Izbor se obavlja klasom ListSelectionModel i postoje tri moguće vrednosti: MULTIPLE_INTERVAL_SELECTION Omogućava istovremeno selekciju nekoliko opsega. SINGLE_INTERVAL_SELECTION Omogućava selekciju jednog opsega. SINGLE_SELECTION Omogućava selekciju jedne stavke.
♦
Podrazumevana vrednost omogućava selekciju više opsega. Da biste promenili selekciju u selekciju jedne stavke u kontroli myList, koristite: myList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
•
Tipične radnje kod korišćenja kontrole lista: Deklarisanje i kreiranje kontrole lista, dodeljivanje prepoznatljivog naziva. Za myList, kôd je: JList myList = new JList();
Postavljanje svojstva selectionMode i popunjavanje liste pomoću objekta modela liste (obično u main metodu). Dodavanje kontrole sa menadžerom rasporeda. Praćenje događaja valueChanged za individualne selekcije. Korišćenje svojstava selectedIndex i selectIndices da bi se utvrdilo koje stavke su selektovane.
♦
Uočite da jednu stvar nismo diskutovali kod kontrole lista a to je šta se dešava kada postoji više stavki u listi nego što kontrola lista može da prikaže? Odgovor je ništa – nećete videti stavke koje su „van liste”. Kontrola JList nema mogućnost tzv. skrolovanja, tj. pomeranja prikaza sadržaja. Da bi dodali tu mogućnost, koristimo drugu Swing komponentu, JScrollPane da implementiramo i horizontalnu i vertikalnu traku za pomeranje prikaza sadržaja kontrole. Pogledajmo sada tu kontrolu.
Kontrola JScrollPane
♦
Veoma pogodna kontejner kontrola je tzv. skrolujuće okno (scroll pane). Ova kontrola je slična kontroli panel uz dodatnu mogućnost pomeranja (skrolovanja) bilo koje komponente smeštene u okno. Dakle, velika komponenta može da se smesti u mali „plac” u GUI okviru. Nekoliko Swing kontrola se oslanja na skrolujuće okno da bi obezbedile mogućnost skrolovanja, uključujući kontrolu JTextArea koju smo ranije opisali i komponentu JList koju upravo proučavamo. I horizontalno i vertikalno skrolovanje kontrole je moguće.
♦
Svojstva skrolujućeg okna: - enabled
Pokazuje da li je skrolujuće okno omogućeno. Ako je false, komponenta u oknu je onemogućena. - preferredSize Specificirana veličina (širina, visina) skrolujućeg okna. - horizontalScrollBarPolicy Određuje kako se horizontalna traka prikazuje. - verticalScrollBarPolicy Određuje kako se vertikalna traka prikazuje.
♦
Metodi skrolujućeg okna: setEnabled setPreferredSize setViewportView setHorizontalScrollBarPolicy setVerticalScrollBarPolicy
♦
Postavlja da li je panel omogućen. Uspostavlja veličinu skrolujućeg okna. Uspostavlja komponentu koju „opslužuje (ugošćava)” skrolujuće okno. Uspostavlja kako se horizontalna traka (ako je ima) prikazuje. Uspostavlja kako se vertikalna traka (ako je ima) prikazuje.
Korišćenje skrolujućeg okna je relativno lako. Pošto je cilj da okno drži komponentu veću nego što je ono samo, potrebno je da uspostavite koliko veliko okno želite da bude. To se radi pomoću metoda setPreferredSize, koji koristi objekt Dimension. Da biste postavili veličinu skrolujućeg 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, možete da
mu dodajete komponente. Skrolujuće okno ima menadžera rasporeda kao i druge kontrole, ali se obično oknu dodaje samo jedna kontrola (ta kontrola može biti kontrola panel sa više kontrola). Komponenta (myControl) se dodaje skrolujućem oknu pomoću metoda setViewportView: myPane.setViewportView(myControl); ♦
Od ovog trenutka dodata kontrola može da se skroluje u skrolujućem oknu – to je baš lako! Naravno, potrebno je da dodate skrolujuće okno okviru (sa pridruženim gridConstraints) da biste omogućili da se sve to desi: getContentPane().add(myPane, new gridConstraints());
♦
Ovo je prvi put da smo postavili „željene dimenzije” komponente. Sve do sada, prepuštali smo menadžeru rasporeda mreže da odredi dimenzije komponente i izgledalo je da sve radi sasvim fino. Kada počnete da postavljate dimenzije komponenti, pojaviće se neobična ponašanja. Ponekad, kontrole se neće pojaviti onako kako vi očekujete. Često, ako postavite željenu dimenziju za kontrolu u jednoj lokaciji mreže, biće potrebno da postavite dimenzije i svih ostalih komponenti u mreži. Počećete da razvijate sopstvene načine za rešavanje ovih neobičnih ponašanja. Ako se nešto ne pojavi onako kako bi trebalo, metod za postavljanje željene dimenzije je mesto odakle treba početi istragu.
♦
Trake za pomeranje sadržaja se mogu ali ne moraju pojaviti u skrolujućem 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 sadržaja se uvek pojavljuje. HORIZONTAL_SCROLLBAR_NEVER Traka za pomeranje sadržaja se nikad ne pojavljuje.
♦
Da bi uspostavili politiku vertikalne trake za pomeranje sadržaja koristite setVerticalScrollBarPolicy sa jednom od tri konstante iz ScrollPaneConstants: VERTICAL_SCROLLBAR_AS_NEEDED Traka za pomeranje sadržaja se pojavljuje kada je komponenta koja gostuje duža od rezervisanog prostora (podrazumevano). VERTICAL_SCROLLBAR_ALWAYS Traka za pomeranje sadržaja se uvek pojavljuje. VERTICAL_SCROLLBAR_NEVER Traka za pomeranje sadržaja se nikad ne pojavljuje.
♦
Vi ne morate da kodirate ništa da bi trake za pomeranje sadržaja funkcionisale – ta mogućnost je prirodno svojstvo skrolujućeg okna.
♦
Tipične radnje kod korišćenja kontrole skrolujuće okno: Deklarisanje i kreiranje skrolujućeg okna, dodeljivanje prepoznatljivog naziva. Za myScrollPane, kôd je: JScrollPane myScrollPane = new JScrollPane();
Postavljanje željene veličine skrolujućeg okna i, po želji, politike traka za pomeranje sadržaja. Uspostavljanje komponente koju će „ugošćavati” skrolujuće okno. Dodavanje skrolujućeg okna odgovarajućem menadžeru rasporeda. Praćenje događaja ugošćene(ih) kontrole(a) u oknu uobičajenim tehnikama.
Pripremio Dragan Marković
Kontrola JSlider
Kontrola klizač (slider) je slična sa skrolujućom trakom samo ima drugačiji interfejs. Koristi se za uspostvljanje numeričkog ulaza (obično sasvim mali opseg). Može biti orijentisan horizontalno ili vertikalno. Klikom miša na slider, povlačenjem pokazivača ili pritiskom na tastere ili menja se vrednost ove kontrole. Inkrement promene postavlja kontrola slider i ne može se promeniti. Najmanji inkrement je jedan. Najveći inkrement je desetina opsega kontrole (ovaj inkrement se dodaje/oduzima od vrednosti pritiskom na ili ). •
Svojstva JSlidera: preferredSize Specificirana veličina (width, height) slidera. value Tekući položaj pokazivača unutar slidera. Ako ovo postavljate kodiranjem, Java pomera pokazivač na odgovarajući položaj. minimum Minimalna moguća vrednost slidera. maximum Maksimalna moguća vrednost slidera. paintTicks Koristi se za uspostavljanje glavnih i pomoćnih markera skale ako su nacrtani. majorTickSpacing Interval ponavljanja glavnog markera skale. minorTickSpacing Interval ponavljanja pomoćnog markera skale. paintLabels Koristi se da doda labele vrednostima slidera. inverted Logička (Boolean) vrednost koja pokazuje pravac pomeranja pokazivača. 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 Određuje da li slider leži horizontalno ili vertikalno.
•
Metodi JSlidera:
setPreferredSize Uspostavlja veličinu slidera. setValue Postavlja tekuću vrednost. getValue Određuje tekuću 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 pomoćnih markera (koristite nulu da ne bude pomoćnih markra). setPaintLabels Ako je true, labele se dodaju slideru. setinverted Logička (Boolean) vrednost koja pokazuje pravac pomeranja pokazivača. 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).
•
Događaj JSlidera: stateChanged Događaj (ChangeEvent) se aktivira kada se vrednost slidera promeni. Dodaje se sa ChangeListener (zahteva fajlove javax.swing.event.* ).
♦
Da biste dodali slušaoca za događaj stateChanged kontrole slider pod nazivom mySlider, koristite: mySlider.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { mySliderStateChanged(e); } });
♦
A odgovarajući kôd događaja treba da bude smešten u metodu mySliderStateChanged:
private void mySliderStateChanged (ChangeEvent e) { [kôd metoda] }
•
Par napomena vezanih za svojstva kontrole slider: Uočite da kontrola slider može da ima maksimum ili minimum na krajevima. Ovo je drugačije nego kod kontrole skrolujuća traka. Ako ikada promenite kodiranjem svojstva value, minimum, ili maximum, proverite da li je value svaki put između minimum i maximum ili će se program zaustaviti sa porukom o grešci. Maksimalna vrednost se može dostići kodiranjem ili operacijama miša. Za nju ne važe ograničenja kao kod kontrole skrolujuća traka (što znači da su dostižni maksimum i svojstvo maximum iste vrednosti).
•
Tipične radnje kod korišćenja kontole slider: Deklarisanje i kreiranje kontrole slider, dodeljivanje prepoznatljivog naziva. Za mySlider, kôd je: JSlider mySlider = new JSlider (); Postavljanje svojstava minimum, maximum i orientation. Inicijalizacija svojstva value. Ako želite, izaberite markere skale i labele. Smeštanje kontrole u mrežu rasporeda. Dodavanje slušaoca i praćenje događaja stateChanged za promenu vrednosti.
Kontrola JLabel (revizija)
•
Java ima moćne karakteristike vezane za grafiku. Kao ilustraciju, razmotrićemo jednu sposobnost kontrole labela koju nismo pomenuli na prethodnom času – njenu sposobnost da prikaže grafičke fajlove.
♦
Svojstvo icon kontrole labela specificira grafički fajl za prikaz. Tri tipa grafičkih fajlova mogu da se vide u kontroli labela: Tip fajla Opis JPEG JPEG (Joint Photographic Experts Group) je komprimovani bitmapirani format koji podržava 8- i 24-bitne boje. On je popularan na Internetu i uobičajeni 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. Podržava do 256 boja i takođe je popularan na Internetu. GIF naziv fajla ima tzv. ekstenziju .gif. PNG PNG (Portable Network Graphics) format je popularan format za prenos grafičkih fajlova
između različitih 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 važeća putanja do postojećeg grafičkog 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 grafički fajl hamburgera (burger.gif) smešten u direktorijum projekta. Da bi učitali tu grafiku u myImage, treba da koristite: ImageIcon myImage = new ImageIcon(“burger.gif”);
♦
Ako imate svu grafiku smeštenu u projektov poddirektorijum myGraphics, fajl se učitava pomoću naredbe: ImageIcon myImage = new ImageIcon(“myGraphics/burger.gif”);
♦
Ili, možete uvek obezbediti kompletnu putanju do fajla: ImageIcon myImage = new ImageIcon(“c:/myProject/myGraphics/burger.gi
♦
Znate i sami, ako vaša grafika može da se učita – ona će se pojaviti!. Ako se ne pojavi, proverite da li je navedena tačna putanja i da li je fajl na toj lokaciji. Još jednu stvar treba uočiti, Java koristi znak kose crte - slash) (/) da razdvoji nazive direktorijuma i nazive fajlova. Ovo je suprotno od Windows standarda korišćenja kose crte - backslash (\). Ako budete koristili backslash, dobićete poruku o grešci “illegal escape character”.
♦
Kada je kreirana slika, često vam je potrebno da znate njenu širinu i visinu. Ova svojstva se dobijaju pomoću 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, odgovarajući kôd je: myLabel.setIcon(myImage);
♦
Da biste obrisali sliku iz labele, jednostavno postavite svojstvo icon na vrednost null. Time se razdružuje svojstvo icon od poslednje učitane slike. Za naš primer, kôd je: myLabel.setIcon(null);
♦
Šta određuje kako se slika prikazuje u kontroli labela? Ako nije specificirana željena veličina za kontrolu labela, koristiće se veličina izvornog grafičkog fajla. Na primer, grafički fajl hamburgera (burger.gif, 150 x 117 piksela), prikazan u kontroli labela u okviru:
♦
Ako je željena veličina dodeljena kontroli labela, vertikalno i horizontalno poravnavanje specificiraju lokaciju grafike u labeli. Ako je labela manja od grafike, grafika će biti odsečena („kropovana”).
Kontrola JLabel (revizija) ♦
Na primer, ovde je grafika hamburgera u manjoj labeli (sa levim i gornjim poravnavanjem):
♦
A ako je labela veća od grafike, tada će postojati „belina”. Ovde je hamburger centriran (vertikalno i horizontalno) u većoj labeli:
♦
Kontrola labela će prikazati grafiku samo u njenoj originalnoj rezoluciji, tj. veličini. Ako želite da prikažete veću grafiku u manjoj labeli, jedan mogući pristup je da u nekom softverskom paketu za obradu slika podesite veličinu slike prema labeli tako što ćete podesiti rezoluciju slike. Uobičajena upotreba slika labele je da nešto predstave: fajl, izbor u igrici ili lokaciju. A uobičajeni zadatak je da se klikne mišem na tu grafiku za selekciju. Dakle, događaj mouseClicked se prati da bi se videlo da li je grafika (labela) selektovana. Kôd za dodavanje događaja mouseClicked labeli pod nazivom myLabel je:
♦
myLabel.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { myLabelMouseClicked(e); } });
♦
A odgovarajući metod myLabelMouseClicked je: private void myLabelMouseClicked(MouseEvent e) { [kôd metoda] }
♦
U ovom metodu možete da odredite naziv komponente na koju se klikće (kontrola) pomoću metoda getComponent:
Component clickedComponent = e.getComponent();
•
Tipične radnje kod korišćenja kontrole labela za prikaz grafike: Deklarisanje i kreiranje labele, dodeljivanje prepoznatljivog naziva. Za myLabel, naredba je: JLabel myLabel = new JLabel(); Smeštanje kontrole unutar menadžera raspoerda. Dodeljivanje objekta ImageIcon pomoću metoda setIcon. Dodavanje slušaoca i praćenje događaja mouseClicked za selekciju labele.
Kontrola JFileChooser (otvaranje fajlova) Uočite da biste postavili svojstvo icon kontrole labela, potreban vam je naziv grafičkog fajla. Šta ako korisnik želi da izabere taj fajl sa svog računara? Korisnik treba da obezbedi putanju i naziv tog grafičkog fajla. Kako možete prihvatiti tu informaciju od korisnika? Jedna mogućnost je da koristite kontrolu tekst polje, tražeći od korisnika da upiše željenu informaciju. Ovime pravite sebi nevolju. Čak i najprostiju putanju je problematično upisatati, treba navesti naziv drajva, naziv odgovarajućeg direktorijuma, naziv fajla i ekstenziju i voditi računa gde sve dolaze kose crte (slashes). A zatim, vi kao programer, morate da verifikujete da upisana informacija sadrži valjanu putanju i naziv fajla. ♦
Mislim da se i vi slažete da je traženje od korisnika da upiše putanju i naziv fajla loša ideja. Mi želimo da interfejsom tipa „pokaži i klikni” dobijemo naziv fajla. Svaka GUI aplikacija obezbeđuje takav interfejs za otvaranje fajlova. Ovde je prikazano kako to izgleda u integrisanom razvojnom okruženju JCreator :
♦
Java nam omogućava da koristimo isti interfejs u našim aplikacijama preko kontrole JFileChooser. Ova kontrola je jedna iz skupa tzv. dijaloških kontrola koje možemo da dodamo našim aplikacijama. Takođe, postoje dijalog kontrole za snimanje fajlova (opcija od JFileChooser), promenu fontova, promenu boja i obavljanje operacija štampanja.
♦
Ono što ćemo naučiti ovde nije ograničeno samo na otvaranje grafičkih fajlova za kontrolu labela. Često
se u aplikacijama od korisnika traži naziv fajla. Aplikacije često zahtevaju fajlove sa podacima, inicijalizacione fajlove, konfiguracione fajlove, zvučne fajlove i drugu grafiku. Kontrola JFileChooser će biti korisna u svim ovim slučajevima.
•
Svojstva kontrole birača 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), može se postaviti JFileChooser.SAVE_DIALOG za dijalog snimanja. fileFilter Koristi se da ograniči prikaz tipova fajlova. selectedFile Tekuće selektovani fajl.
♦
Metodi birača fajla: showOpenDialog
Prikazuje dijalog za otvaranje fajlova. Vraćena vrednost pokazuje na koje dugme je korisnik kliknuo (Open ili Cancel). setApproveButtonText Postavlja tekst koji se pojavljuje na dugmetu ‘approve’ (odobrenja). getCurrentDirectory Pretražuje selektovani direktorijum. setDialogTitle Postavlja naslov dijaloga. setDialogType Postavlja tip dijaloga. setFileFilter Postavlja filtar da ograniči prikaz tipova fajlova. addChoosableFileFilter Dodaje filtar fajlova biraču fajlova. getSelectedFile Pretražuje tekuće selektovani fajl. listFiles Koristi se za dobijanje liste fajlova (objekt File) iz tekućeg direktorijuma.
♦
Događaji birača fajla: actionPerformed Događaj (ActionEvent) koji se aktivira kada se selektuje dugme odobrenja ili dugme cancel. Dodaje se sa ActionListener. Obično se prati kada je birač fajla ugrađen u aplikaciju. propertyChange Poziva se kadgod se svojstvo birača fajla promeni. Obično se koristi da detektuje promenu u selektovanju fajla.
♦
Kontrola birač fajla može se dodati aplikaciji kao bilo koja druga kontrola, ugrađena u okvir. Ili, može se prikazati kada je to potrebno, kao okvir za dijalog. Obično se samo prate događaji kada je birač fajla ugrađen u aplikaciju.
♦
Da biste dodali slušaoca za događaj actionPerformed birača fajla pod nazivom myChooser, koristite: myChooser.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { myChooserActionPerformed(e); } });
♦
A odgovarajući kôd događaja treba da bude smešten u metodu myChooserActionPerformed: private void myChooserActionPerformed(ActionEvent e) { [kôd metoda] }
♦
Kod ovog događaja, obično se proverava da li je kliknuto na dugme odobrenja (Open). Segment koda koji to radi je: if (e.getActionCommand().equals(JFileChooser.APPROVE_SELECTION)) { [kôd procesiranja] }
♦
Događaj propertyChange se dodaje pomoću PropertyChangeListener. Za myChooser, koristite: myChooser.addPropertyChangeListener(new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent e) { myChooserPropertyChange(e); } });
♦
Odgovarajući kôd događaja treba da bude smešten u metod myChooserPropertyChange:
private void myChooserPropertyChange(PropertyChangeEvent e) { [kôd metoda] } ♦
U ovom metodu, obično želimo da proverimo da je promenjeno svojstvo selektovani fajl. Da odredimo promenu svojstva koje „poziva” ovaj događaj, 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 ključna reč koja upućuje na tekući okvir. Prikazani okvir za dijalog je:
♦
Korisnik selektuje fajl pomoću 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. Može da se klikne na Cancel da se opozove operacija otvaranja. Metod showOpenDialog vraća 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 , možemo da odredimo selektovani fajl. Tu vrednost daje: myChooser.getSelectedFile()
♦
Više kontrola zahteva da taj naziv bude tipa String (objekt ImageIcon, na primer). Ova konverzija se radi pomoću: myChooser.getSelectedFile().toString()
♦ ♦
Zgodna stvar kod ove kontrole je što ona može 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 kôd 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 našim projektom.
♦
Postoji više konstruktora unutar klase ExampleFileFilter. Mi ćemo koristiti jedan. Poslaćemo konstruktoru niz prihvatljivih ekstenzija (tipa String) i opis ekstenzija. Kada je konstruisan, filtar se dodeljuje biraču pomoću metoda addChoosableFileFilter.
♦
Primer filtra za fajlove: Uradimo primer za dva tipa grafičkih fajlova (gif, jpg) da bi ilustrovali rad sa kontrolom.
♦
Kôd za dodavanje takvog filtra biraču fajla pod nazivom myChooser je: String[] ext = new String[] {“gif”, “jpg”}; myChooser.addChoosableFileFilter(new ExampleFileFilter(ext, “Graphics Files”));
♦
Sa takvim kodom, birač će imati sledeći izgled:
♦
Tipične radnje kod korišćenja kontrole birača fajla (ugrađenog) za otvaranje fajlova: Deklarisanje i kreiranje kontrole birač fajla, dodeljivanje prepoznatljivog naziva. Za myChooser, kôd je: JChooser myChooser = new JChooser();
Postavljanje svojstva dialogTitle. Dodavanje filtra fajla. Smeštanje kontrole u menadžer rasporeda. Dodavanje slušaoca i praćenje događaja actionPerformed za događaj klika na dugme ili korišćenje događaja propertyChange za detektovanje promena selektovanog fajla. Korišćenje metoda getSelectedFile za određivanje fajla.
♦
Tipične radnje kod korišćenja kontrole birača fajla (okvir za dijalog) za otvaranje fajlova: Deklarisanje i kreiranje kontrole birača fajla, dodeljivanje prepoznatljivog naziva. Za myChooser, kôd je: JChooser myChooser = new JChooser();
Postavljanje svojstva dialogTitle. Dodavanje filtra fajla. Korišćenje metoda showOpenDialog za prikaz okvira za dijalog. Korišćenje metoda getSelectedFile za određivanje 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 pretraživaćemo po strukturi fajlova računara grafičke fajlove i prikazati rezultat pretraživanja u kontroli za sliku. Koristićemo ugrađeni birač fajla. Konačni 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 obično, gradimo okruženje tako što ćemo početi 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 izvršite 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 slušaoca događaja 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 kôd događaja 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 izvršite aplikaciju. Pronađite 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)
Konstruiše okvir (= prozor sa ivicom) sa naslovom
getContentPane()
Vraća komponentu u koju sadržaj može da se smesti
pack()
Prilagođava veličinu okvira na preporučenu veličinu svih njegovih komponenti
show()
Prikazuje okvir na ekranu i izvlači ga u prednji plan
Constructor: JLabel(String text)
Konstruiše labelu sa inicijalnim tekstom u njoj
JLabel
Pored toga, on koristi metod add(Component) objekta Container (zato što getContentPane() vraća objekat Component). Primer možete kompajlirati i izvršiti u MS-DOS promptu zadavanje sledećih naredbi: Kompajliranje: javac Example1.java Izvršavanje: java Example1 Iz programa možete izaći 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 može 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 sluša događaje koje generišu klikovi na ovo dugme
JLabel
setText(String text)
Menja tekst labele.
JFrame
setDefaultCloseOperation(int)
Specificira šta se dešava ako se pritisne dugme X (close) okvira. Moguće operacije zatvaranja su: EXIT_ON_CLOSE HIDE_ON_CLOSE DISPOSE_ON_CLOSE
java.awt
BorderLayout
Constructor: BorderLayout()
Menadžer rasporeda koji deli panel u 5 podoblasti: east, west, north, south i center.
java.awt.event
ActionListener
actionPerformed(ActionEvent)
Ovaj metod poziva komponenta koja generiše događaje (u ovom slučaju: clickButton).
ActionEvent
getSource()
Vraća komponentu koja generiše događaje (u ovom slučaju: clickButton)
ClickPanel proširuje JPanel i implementira ActionListener. Pošto on proširuje JPanel, on je Panel gde možete dodati sve vrste komponenti, kao što su dugmad, labele itd.. Pošto on implementira ActionListener, treba da ima void actionPerformed(ActionEvent) i osluškuje ActionEvents. Naredba clickButton.addActionListener(this) obezbeđuje da ClickPanel sluša sve ActionEvents koje generiše clickButton. Svaki put kada se pritisne clickButton, ovaj metod će biti pozvan.
Metod JFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) obezbeđuje da se program zaustavi ako se okvir zatvori. Nije više potrebno da se pritisnu tasteri CTRL-C.
Primer 2b Cilj: radi isto što i Primer 2a, ali sada sa eksternim ActionListenerom koji osluškuje dugme. Fajlovi: ClickPanel2.java, ClickListener.java Ovaj primer ne koristi nijedan novi metod. Razlika je samo u tome što ClickPanel nije više ActionListener za clickButton. Umesto toga, kreirana je nova klasa ClickListener, koja implementira ActionListener i prima ActionEvent(e) od clickButton. Ovo nije preporučeni način rada, ali je ovde korišćen samo da bi pokazao kako Listener(i) rade. Kreira se klasa ClickListener. Kadgod se ActionEvent primi od clickButton, ona ažurira tekst od CountLabel. Međutim, 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 računa da je brojač n sada privatno svojstvo ClickListenera a nije više od ClickPanel2.
Primer 3a Cilj: kreirati prozor sa tekst poljem čiji sadržaj može da se uređuje, 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)
Konstruiše tekst polje čiji sadržaj može da se uređuje a koje može da sadrži određen broj znakova
String getText()
Vraća String koji sadrži tekst tekstualnog polja
setText(String text)
Zamenjuje tekst tekstualnog polja sa novim Stringom
JFrame
setSize(Dimension)
Postavlja veličinu okvira u pikselima
Dimension
Constructor: Dimension(int width, int height)
Kreira objekt Dimension određene širine i visine u pikselima.
java.awt
java.awt.event
ActionListener ActionEvent
Uočite da dugme nema unapred preporučenu svoju veličinu. Pošto se postavlja u centralni deo BorderLayouta, njegova veličina će biti **stretched da popuni sav centralni deo njegovog roditelja. Kod BorderLayouta, komponente koje se smeštaju u severni i južni deo imaće unapred preporučene svoje visine ali ne i širine. Komponente na istoku i zapadu će imati unapred preporučene svoje širine, ali ne i visine. Kao što vidite, komponente u centru neće imati unapred preporučenu visinu niti širinu.
Primer 3b Cilj: ovaj primer radi isto što i prethodni. Međutim, ako korisnik upiše tekst i pritisne dugme Enter, tekst će biti takođe 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 generišu kadgod korisnik pritisne dugme Enter .
Uočite da clickButton sada ima svoju unapred preporučenu veličinu. Da bi ovo realizovali stavili smo ga u ***dummy panel. Ovaj panel će **will be stretched da popuni celu centralnu oblast roditeljskog BorderLayouta. Međutim ovaj panel ima svoj podrazumevani raspored FlowLayout. Ovaj raspored stavlja komponente jednu do druge ne dirajući njihovu unapred preporučenu veličinu.
Primer 3c Cilj: ovaj primer radi isto što i prethodni. Ali ako korisnik upiše tekst, generisaće se KeyEvent. Ovo nam omogućava 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 generišu 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 pošto je prethodno bio pritisnut)
keyTyped(KeyEvent)
Ovaj metod se poziva kadgod se taster pritisne i otpusti.
Sada dopuštamo panelu da implementira KeyListener. To znači da se moraju implementirati sledeća tri metoda: keyPressed, keyReleased i keyTyped. Za više informacija pročitajte Java API dokumentaciju o KeyListeneru. Ovde je izabrano da se implementira metod KeyReleased, ali je moguće implementirati i druga dva metoda. Efekt može biti neznatno drugačiji. Uočite 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 smešta panel koji ima dva tekst polja i labelu. Korisnik može da stavi brojeve u tekst polje. Ako pritisne jednu od stavki menija okvira, okvir će tražiti od panela da obavi željeno izračunavanje. Fajlovi: CalculateFrame.java, CalculatePanel.java Paket
Klasa
Metod
javax.swing
JMenuBar
Constructor: JMenuBar()
Kreira traku menija.
add(Menu)
Dodaje meni traci menija.
int getMenuCount()
Vraća celobrojnu vrednost koja je broj menija trake menija.
Menu getMenu(int n)
Vraća n-ti meni trake menija
Constructor: JMenu(String title)
Kreira meni sa određenim naslovom.
add(MenuItem)
Dodaje stavku menija u meni.
addSeparator()
Dodaje graničnik u meni
int getItemCount()
Vraća celobrojnu vrednost koja je broj stavki menija u meniju (graničnik je takođe stavka menija).
MenuItem getItem(int n)
Vraća n-tu stavku menija.
JMenu
JMenuItem
java.lang
java.awt
Constructor: JMenuItem(String title)
Kreira stavku menija sa određenim naslovom.
addActionListener(ActionListener)
Dodaje ActionListener koji sluša ActionEvente koje generiše stavka menija.
JFrame
setJMenuBar(JMenuBar)
Postavlja MenuBar za JFrame
System
exit(int status)
Izlaz iz programa.
Integer
static void parseInt(String n)
Pokušava da raščlani string vrednost (n) u celobrojnu vrednost. Generiše NumberFormatException ako String ne može da se raščlani.
GridLayout
Constructor: GridLayout(int rows, int columns)
Kreira GridLayout sa specificiranim brojem redova i kolona.
CalculateFrame je klasa koja sadrži traku menija i CalculatePanel. CalculatePanel sadrži tekst polja sa brojevima i metodima koji obavljaju matematičku operaciju. CalculatePanel je JPanel sa menadžerom rasporeda GridLayout. Više informacija možete pročitati u Java API dokumentaciji. To je neka vrsta matrice čije ćelije su jednake veličine. Uočite sledeće **cast to a double u metodu divide() CalculatePanela: double solution = (double) number1 / number2; Bez ovog **cast, operator / ima dve celobrojne vrednosti kao argumente. To znači 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 generiše kadgod pokušate da konvertujete String u
celobrojnu vrednost, ali string sadrži 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 grešci će se pojaviti kada korisnik ne upiše važeće brojeve u bilo koje od tekst polja. Metod Integer.parseInt(String) će generisati NumberFormatException. U ovom primeru mi hvatamo **catch Exception i obrađujemo ga tako što prikazujemo dijalog sa porukom o grešci. JOptionPane je javax.swing klasa koja omogućava kreiranje modalnih dijaloga.Najčešće korišćeni 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. Obično je ili String ili neki JPanel. title je naslov dijaloga sa porukom int messageType je jedno od sledećih: ERROR_MESSAGE, INFORMATION_MESSAGE, WARNING_MESSAGE, QUESTION_MESSAGE, ili PLAIN_MESSAGE. Te konstante se koriste da odrede ikonu dijaloga. U Java API dokumentaciji možete pročitati više informacija o JOptionPane i kreiranju dijaloga.
Primer 4c Cilj: ovaj primer radi isto što i prethodni primer, ali ima nešto finiju obradu izuzetka. Fajlovi: CalculateFrame3.java, CalculatePanel3.java, DivisionByZeroException.java Ovaj primer ima nešto inteligentniju implementaciju mehanizma obrade izuzekta. Pošto su u prethodnom primeru svi metodi (add(), subtract(), multiply() and divide()) radili istu stvar kadgod se „uhvati” NumberFormatException, inteligentniji načina je da se generiše NumberFormatException za jedan nivo više. Ovo se realizuje sa naredbom koja generiše NumberFormatException. Sada znamo da ovi metodi mogu da generišu 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 obrađujemo ga. Pošto divide() može da generiše DivisionByZeroException, moramo takođe da ga hvatamo. U ovom slučaju generišemo drugačiju poruku o grešci.
Kôd primera je dat u arhivi JGUIradionica.zip koju možete preuzeti sa sajta.
Pripremio Dragan Marković