Aplikacije koje imaju samo tekstualni ulaz i izlaz nazivaju se konzolnim aplikacijama.
GUI (Graphical User Interface) je digitalni interfejs sa kojim korisnik interaguje preko grafičkih komponenti kao što su dugmići, meniji, polja za unos teksta, padajuće liste, …
Neki od paketa za GUI programiranje u Javi:
Ceo GUI se sastoji iz tzv. grafičkih komponenti. Grafičke komponente koje se pojavljuju na ekranu nazivaju se i kontrole ili “vidžiti“. Neke kontrole:
Svaki deo grafičkog interfejsa je implementiran kao klasa nekog GUI paketa.
U Javi možemo učitati sliku sa neke lokacije, smestiti je u neki objekat i posle je koristiti, tako što ćemo najčešće da je postavimo na neko dugme.
// otvaranje slike
ImageIcon icon = new ImageIcon("putanja/do/slike"); // ili new ImageIcon(getClass().getResource("putanja/do/slike"))
Potrebno je obratiti pažnju na putanju do slike, jer konstruktor može da baci RuntimeException.
ImageIcon zvanična dokumentacija
Uprošćen dijagram klasa osnovnih GUI klasa
Klasa Component je zajednička osnovna klasa za sve GUI kontrole i reprezentuje nešto što ima poziciju,veličinu,može se iscrtati na ekranu i prihvata ulazne događaje.
Neke metode, koje ćete koristiti na kolokvijumu:
public add
- pogledati Raspoređivanje komponentipublic Color getBackground()
- geter za pozadinu komponentepublic void setBackground(Color c)
- seter za pozadinu komponentepublic void setBounds(int x, int y, int width, int height)
- pocetak prozora ce biti u tacki (x
, y
) u odnosu na gornji levi ugao ekrana, sirina ce biti width
a visina height
public void setBounds(Rectangle r)
- svi gorenavedine parametri su “upakovani” u instancu klase Rectanglepublic void setVisible(boolean b)
- prikazuje ili sakriva komponentupublic void setSize(int width, int height)
- setuje veličinupublic void setPreferredSize(int width, int height)
- setuje željenu (najčešće minimalnu) veličinuKlasa Container je izvedena iz Component.
Objekti svih klasa izvedenih iz klase Container mogu da sadrže druge objekte iz bilo koje klase koja je izvedena iz klase Component.
Kako Container nasleđuje Component, sledi da kontejneri mogu da sadrže druge kontejnere.
Izuzetak je klasa Window i njene potklase, jer one ne mogu biti sadržane u drugom kontejneru.
Neke metode ove klase, koje čete koristiti na kolokvijumu, možete pogledati u sekciji Raspoređivanje komponenti.
Klasa Frame je izvedena iz Window. Koristi se za kreiranje glavnog prozora aplikacije. Objekat tipa Frame može da sadrži traku menija i da prikaže naslov. JFrame je swing verzija Frame klase. Samostalna GUI (swing) aplikacija, što se grafičkog dela tiče, najčešće sadrži jedan JFrame u koji se smeštaju kontrole. contentPane je Container koji zauzima centralni deo prozora i u njega se, najčešće, izuzimajući menije, smeštaju komponente (dugmići, padajuće liste itd.)
public void pack()
- Ova metoda prilagođava veličinu prozora (Window) tako da odgovara njegovom sadržaju. Na primer, ako imate prozor sa sadržajem koji se dinamički menja, pozivanjem pack() će automatski prilagoditi veličinu prozora kako bi se sve komponente sadržaja mogle videti bez potrebe za scroll trakama.Primer kreiranje custom JFrame klase
import java.awt.*;
import javax.swing.*;
public class MyFrame extends JFrame {
public MyFrame() {
super("Naslov"); /// ili setTitle("Naslov");
setBounds(100, 200, 500, 600); // pocetak prozora ce biti u tacki (100, 200) u odnosu na gornji levi ugao ekrana, sirina ce biti 500 a visina 600
setDefaultCloseOperation(EXIT_ON_CLOSE); // kada se zatvori prozor, program prekida izvrsavanje
setVisible(true); // prozor treba biti vidljiv
}
}
JButton – regularno dugme
Neke metode, koje ćete koristiti na kolokvijumu:
public String getText()
- geter za tekst koji je postavljen na dugmepublic void setText()
- seter tekst dugmetapublic Icon getIcon()
- geter za ikonicu koja je postaljena na dugmepublic void setIcon(Icon icon)
- seter za ikonicu koja se postavlja na dugmeJCheckBox – dugme sa checkbox-om sa leve strane
JRadioButton – dugmad koja operišu u grupi, tako da je samo jedno dugme pritisnuto u datom trenutku. Ovo
grupisanje se postiže dodavanjem JRadioButton objekta ButtonGroup objektu
JOptionPane.showMessageDialog(null, "Poruka"); // otvara dijalog i prikazuje poruku
int status = JOptionPane.showConfirmDialog(null, "Poruka", "Naslov", JOptionPane.YES_NO_OPTION); // otvara Da-ne dijalog
if (status == JOptionPane.YES_OPTION) {
// korisnik je odabrao "DA" opciju
}
if (status == JOptionPane.NO_OPTION) {
// korisnik je odabrao "NE" opciju
}
if (status == JOptionPane.CANCEL_OPTION) {
// korisnik je zatvorio dijalog
}
JLabel – pasivna komponenta, ne može se editovati, služi za označavanje drugih komponenti. Gorenavedene metode koje postoje u klasi JButton postoje i u klasi JLabel.
JTextField – kao JLabel samo se može editovati. Predstavlja jednu liniju teksta.
JFormattedTextField – to je JTextField komponenta koja ima kontrolu formata podataka koji se
unose/prikazuju.
JTextArea – komponenta koja dozvoljava unos višelinijskog teksta. Ne podržava direktno
skrolovanje, ali to se može postići stavljanjem komponente JTextArea u kontejner JScrollPane
JList – definiše ograničenu listu stavki
JComboBox - dopušta korisniku da izabere jednu stavku iz padajuće liste. Zvanična dokumentacija. Tutorijal
NAPOMENA: Klasa JComboBox je generička. E je tip koji se prosleđuje kao parametar generičkoj klasi (može biti String, Object, …). Primer: new JComboBox<String>( );
public void addItem(E item)
- dodavanje stavke koju korisnik može da izabere u combo boxpublic E getItemAt(int index)
- vraća stavku koja se nalazi na indeksu index. Indeksi kreću od 0.public int getItemCount()
- broj stavki u combo box listipublic int getMaximumRowCount()
- maksimalan broj stavki koji se može videti u listi bez skrolovanjapublic int getSelectedIndex()
- indeks selektovane stavkepublic Object getSelectedItem()
- odabrana stavkapublic void insertItemAt(E item, int index)
- ubaci element na određeni indekspublic void removeAllItems()
- ukloni sve stavkepublic void removeItemAt(int anIndex)
- uklanja stavku na indeksu anIndexprotected void selectedItemChanged()
- metoda koja se poziva kada korisnik promeni odabranu stavkupublic void setEditable(boolean aFlag)
- podešava da li korisnik može ručno da unese vrednost ili nepublic void setEnabled(boolean b)
- podešava da li korisnik može da izabere drugu vrednost ili nepublic void setMaximumRowCount(int count)
- setuje maksimalan broj stavki koje korisnik može videti u listi bez skrolovanjapublic void setSelectedIndex(int anIndex)
- setuje indeks selektovane stavkepublic void setSelectedItem(Object anObject)
- setuje selektovanu stavkuKontejner je objekat svakog tipa koji kao osnovnu klasu ima Container klasu.
Kontejner sadrži:
komponente
Komponente unutar kontejnera se prikazuju unutar površi koju zauzima kontejner na ekranu.
Komponente su smeštene u listu, pa imaju svoje indekse.
public int getComponentCount()
– vraća broj komponenti u kontejnerupublic Component getComponent(int index)
– vraća komponentu koja se identifikuje datim indeksom. Radi se o indeksu niza, pa mora biti
u opsegu [0, count-1].public Component[] getComponents()
– vraća niz komponenti iz kontejneraadd()
metoda – dodavanje komponete kontejneru
public Component add(Component c)
– dodaje komponentu c na kraj liste komponenti sačuvane u kontejneru. Vraća se c.public Component add(Component c, int index
– komponenta se smešta na datu poziciju. Ako je index -1 komponenta se
dodaje na kraj liste, u suprotnom indeks mora biti ne manji od 0 i manji od trenutnog broja komponenti u kontejneru.Vraća
se c.public void add(Component c, Object constraints
- ograničenja specifična za menadžer postavkepublic void add(Component c, Object constraints, int index)
menadžera postavke
Menadžer postavke je objekat neke od klasa tipa LayoutManager. On sadrži opis načina raspoređivanja komponenti u kontejneru.
void setLayout(LayoutManager mgr)
- setuje LayoutManager-a za kontejnerLayoutManager getLayout()
Svi kontejneri imaju podrazumevani layout manager, ali se može izabrati drugačiji kada je potrebno. Layout manager određuje poziciju i veličinu svih komponenti u kontejneru.
Menadžeri:
BorderLayout – prozor je podeljen na 5 delova – north, south, east, west, center; podrazumevani za contentPane u JFrame-u, JDialog, JApplet. Ograničenja koja mogu biti korišćenja prilikom dodavanja komponenti su:
Content Pane – kontejner, zauzime centralni deo prozora i na njega se dodaju ostale komponente (dugmići, polja za unos…). U zavisnosti od potrebe komponente se grupišu tako što se dodaju nekom panelu, koji ima odgovarajući raspored, a onda se paneli smeštaju u veći kontejner. JPanel predstavlja površinu na koju se mogu dodati druge komponente.
Događaj se može shvatiti kao signal (određenog tipa) koji se šalje programu kao informacija o tome da se nešto desilo. Događaj se generiše nakon akcije koja nije desila od strane same aplikacije, kao što su akcija korisnika (pomeranje miša, klik mišem i sl) ili signal poslat od strane OS-a. Java događaje generišu izvori(sources) događaja a obrađuju objekti klasa osluškivača(listeners) događaja.
Sistem delegiranja:
Dva koraka u definisanju obrade:
Klase osluškivača mora da implemetira interfejs nekog osluškivača ili da proširuje neku klasu koja implementira interfejs osluškivača.
Registrovanje instance klase osluškivača događaja kod izvora:
izvorDogadjaja.addActionListener(listener); // listener je instanca klase koja implementira interfejs ActionListener
// ili
izvorDogadjaja.addMouseListener(listener); // listener je instanca klase koja implementira interfejst MouseListener
Samo komponente Button, List i TextField generišu ActionEvent. Sve komponente generišu MouseEvent.
Standardni osluškivači
Adapteri su klase koje implementiraju interfejs osluškivača događaja, tako da programer treba da prepiše samo one metode koje su mu potrebne, kako ne bi morao da implementira sve metode.
Svi događaji poseduju metode:
public int getID()
- vraća tip događajapublic Object getSource()
- vraća izvor događajaInterfejs osluškivača miša predviđa 5 metoda:
public static int BUTTON1
- levi klikpublic static int BUTTON2
- klik na scrollpublic static int BUTTON3
- desni klikpublic int getButton()
- da li je korisnik koristio levi klik, desni klik ili klik na scrollpublic Point getLocationOnScreen()
- x i y koordinate na ekranupublic Point getPoint()
- x i y koordinate relativne u odnosu na izvor događajaKeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
manager.addKeyEventDispatcher(new KeyEventDispatcher() {
@Override
public boolean dispatchKeyEvent(KeyEvent e) {
// TODO Logika
return false;
}
});
public static int VK_1
- dugme 1public static int VK_A
- dugme Apublic char getKeyChar()
- ako korisnik pritisne dugme “A”, vratiće “A”. ako pritisne “1”, vratice “1”, …public int getKeyCode()
- vratiće KeyEvent.VK_1 ili KeyEvent.VK_A ili …