13 SwingA
13 SwingA
13 SwingA
JAVA
Osnovne osobine
Swing je paket klasa koje omoguavaju implementaciju grafikog korisnikog interfejsa u aplikacijama. Uveden je 1997. godine sa sledeim osobinama:
Accessibility API
Korienje razliitih neuobiajenih tehnologija u radu sa aplikacijom.
JAVA
Swing komponente
JAVA
Swing komponente
JAVA
Swing komponente
JAVA
Swing komponente
JAVA
Swing komponente
JAVA
Swing komponente
Komponente koje prikazuju informacije koje mogu biti izmenjene od strane korisnika (ako tako odabere).
JAVA
JAVA
JAVA 10
JAVA 11
Najjednostavnija Swing aplikacija koju moete da napiete. Program sam po sebi ne radi mnogo, ali prikazuje osnovni kod u svakom Swing programu:
import javax.swing.*; public class HelloWorldSwing { public static void main(String[] args) { JFrame frame = new JFrame("HelloWorldSwing"); final JLabel label = new JLabel("Hello World"); frame.getContentPane().add(label); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setVisible(true); } }
JAVA 12
U prvoj liniji koda uvozi se glavni Swing paket: import javax.swing.*; . Ovo je jedini paket koji je u ovom programu potreban. Veina Swing programa mora da uveze dva AWT paketa, import java.awt.*; import java.awt.event.*; . Oni su neophodni jer Swing komponente koriste AWT infrastrukturu, ukljuujui AWT event model. Event model upravlja kako komponente reaguju na dogaaj, npr. klik na mia, ili pomeranje mia. Svaki program sa Swing GUI mora da sadri najmanje jedan Swing kontejner najvieg nivoa. Postoje tri kontejnera najvieg nivoa JFrame, JDialog i JApplet.
JAVA 13
U primeru HelloWorldSwing postoji samo jedan top-level kontejner, a to je JFrame. Prozor (frame), primenjen kao jedna instanca klase JFrame, je prozor koji ima detalje, kao npr. naslov, okvir, taster za minimiziranje i zatvaranje prozora. Aplikacije sa GUI uobiajeno imaju najmanje jedan frejm. Deo koda koji postavlja i prikazuje prozor: JFrame frame = new JFrame("HelloWorldSwing"); ... frame.pack(); frame.setVisible(true);
JAVA 14
Postavljanje komponenti
HelloWorldSwing ima jednu komponentu, labelu sa tekstom "Hello World. Sledee dve linije koda stvaraju, a zatim dodaju komponentu u okvir:
JAVA 15
Zatvaranje prozora...
Kako bi zatvorili prozor kada se klikne na taster za zatvaranje neophodan je sledei deo koda:
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JFrame obezbeuje metod setDefaultCloseOperation kako bi konfigurisao podrazumevane (default) dogaaje kada korisnik klikne na taster za zatvaranje prozora. U ovom sluaju prekida se izvravanje aplikacije nakon zatvaranja prozora.
JAVA 16
Koristimo program SwingApplication da prikaemo neke najee koriene komponente u GUI i kako se se meusobno uklapaju u hijerarhiji sadraja. Aplikacija koristi etiri najee primenjivane komponente:
frejm, ili glavni prozor (JFrame) panel, ponekad se zove i pane (JPanel) taster (JButton) labela (JLabel)
JAVA 17
Importovanje Swing paketa Definisanje look and feel-a Podeavanje top-level container-a Podeavanje tastera, labela itd. Postavljane komponenti u kontejner Definisanje okvira oko komponenti Reagovanje na dogaaje (Handling events)
JAVA 18
Hijerarhija
Frejm je tzv. top-level kontejner. Na njega se postavljaju ostale Swing komponente (pored ovoga postoje i top-level kontejneri JDialog i JApplet). Panel kontejner je srednji sloj. Zadatak mu je da olaka postavljanje tastera, labela itd. Pored ovog postoje i sledei kontejneri JScrollPane, JTabbedPane. Tasteri i labele ine tzv. atomic components samostalni entiteti koji prema korisniku mogu da znae neku informaciju. esto se koriste i za unos podataka. Swing API ima jo nekoliko komponenti, npr. JComboBox, JTextField, JTable itd. Sledi dijagram hijerarhije sadraja (containment hierarchy ) aplikacije SwingApplication:
JAVA 19
JAVA 20
O hijerarhiji ...
Sledi kod koji dodaje tastere i labele na panel, a zatim panel u glavni kontejner:
frame = new JFrame(...); button = new JButton(...); label = new JLabel(...); pane = new JPanel(); pane.add(button); pane.add(label); frame.getContentPane().add(pane, borderLayout.CENTER);
JAVA 21
Swing nudi mogunost definisanja izgleda i funkcionisanja komponenata, odnosno naina na koji se tasteri, obeleja i ostali elementi GUI prikazuju na ekranu. Upravljanje nainom prikazivanja komponenata obavlja UIManager, klasa za upravljanje korisnikim interfejsom u javax.swing paketu.
Windows izgled Windows classic izgled Motif X Window system izgled Metal, standardni Swing izgled Java aplikacija u sluaju razliitih platformi.
JAVA 22
U sledeem kodu, prikazano je kako se u Swing aplikaciji odreuje stil kojim e komponente biti prikazane:
public static void main(String[] args) { try { UIManager.setLookAndFeel( UIManager.getCrossPlatformLookAndFeelClassName()); } catch (Exception e) { } ... //Create and show the GUI... }
Obeleeni deo koda zapravo kae: ne interesuje me koji je izgled korisnik odabrao, koristi Java prikaz (the Java look and feel).".
JAVA 23
JAVA 24
Prvi red kreira taster. Drugi red postavlja da ALT+I bude preica za aktiviranje tastera. Trei red omoguava reagovanje tastera na dogaaje.
JAVA 26
... //podeavanje labele: final JLabel label = new JLabel(labelPrefix + "0 ");
JAVA 27
SwingApplication grupie labele i tastere u kontejner (JPanel) i nakon toga ih dodaje u frejm, kao top-level kontejner. Sledi kod koji inicijalizira panel:
JPanel pane = new JPanel(); pane.setBorder(BorderFactory.createEmptyBorder(30, 30, 10, 30)); pane.setLayout(new GridLayout(0, 1)); pane.add(button); pane.add(label);
Prvi red kreira panel. Drugi red dodaje okvir. Trei red kreira layout manager koji pokuava da sadraj panela postavi u jednu kolonu. Na kraju se labela i taster dodaju panelu.
JAVA 28
Ovaj okvir obezbeuje prazan prostor oko sadraja panela, -- 30 piksela na vrhu, levo, desno i 10 piksela na dnu. Okviri su osobina koju JPanel nasleuje od klase JComponent.
JAVA 29
Reagovanje na dogaaje
Svaki put kada korisnik ukuca neko slovo ili klikne na mia, odigra se jedan dogaaj. Svaki objekat moe biti obaveten o dogaaju. Sve to treba da uradi jeste da primeni odgovarajui interfjes i da se registruje kao event listener u odgovarajuem izvoru dogaaja (event source). Swing komponente mogu da stvore mnogo vrsta dogaaja.
JAVA 30
Reagovanje na dogaaje
SwingApplication primer ima samo jedan objekat koji reaguje na dogaaje (action events):
JAVA 31
import javax.swing.*; import java.awt.*; import java.awt.event.*; public class SwingApplication extends JFrame implements ActionListener { private static String labelPrefix = "Number of button clicks: "; private int numClicks = 0; final JLabel label = new JLabel(labelPrefix + "0 "); JButton button = new JButton("I'm a Swing button!"); public Component createComponents() { button.setMnemonic(KeyEvent.VK_I); button.addActionListener(this); JPanel pane = new JPanel(); pane.setBorder(BorderFactory.createEmptyBorder(30,30,10,30)); pane.setLayout(new GridLayout(0, 1)); pane.add(button); pane.add(label); return pane; } public void actionPerformed(ActionEvent e) { numClicks++; label.setText(labelPrefix + numClicks); } public static void main(String[] args) { try { UIManager.setLookAndFeel( UIManager.getCrossPlatformLookAndFeelClassName()); } catch (Exception e) { } JFrame frame = new JFrame("SwingApplication"); SwingApplication app = new SwingApplication(); Component contents = app.createComponents(); frame.getContentPane().add(contents, BorderLayout.CENTER); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setVisible(true); JAVA } }
32
Layout management je proces koji odreuje veliinu i poziciju komponenti. U Java platformi standardni layout manageri su: BorderLayout, BoxLayout, FlowLayout, GridBagLayout i GridLayout. Olakavaju dizajn GUI aplikacije. Vode rauna o poziciji i veliini komponenti u prozoru. Korisni su u sistemima gde se veliina displeja menja.
JAVA 33
FlowLayout
Podrazumevani je za Panel, JPanel, i za Applet Ono to zna:
Menja veliinu komponenti Komponente postavlja u redove, poev od gorenjeg levog ugla na desno, pa dole Elementi u redovima su podrazumevano centrirani
Konstruktori FlowLayout()
FlowLayout(int alignment)
JAVA 34
FlowLayout primer
public class FlowTest extends Applet { public void init() { setLayout(new FlowLayout()); for(int i=1; i<6; i++) { add(new Button("Button " + i)); } } }
JAVA 35
BorderLayout
ono to zna
Deli kontejner na 5 delova Svaki deo se identifikuje imenom: NORTH, SOUTH, EAST, WEST i CENTER
JAVA 36
BorderLayout (nastavak)
Konstruktori
BorderLayout()
Izmeu komponenti nema razmaka
Dodavanje komponenti
JAVA 37
BorderLayout: primer
public class BorderTest extends Applet { public void init() { setLayout(new BorderLayout()); add(new Button("Button 1"), BorderLayout.NORTH); add(new Button("Button 2"), BorderLayout.SOUTH); add(new Button("Button 3"), BorderLayout.EAST); add(new Button("Button 4"), BorderLayout.WEST); add(new Button("Button 5"), BorderLayout.CENTER); } }
JAVA 38
GridLayout
ta zna Deli prozor u zavisnoti od broja redova i kolona na na pravougaonike iste veliine Elementi se postavljaju sleva na desno, od gore na dole Zanemaruje se originalna veliina komponenti i veliina im se menja kako bi odgovarala veliini elije u koju treba da se smesti
JAVA 39
GridLayout
Konstruktor GridLayout() Jedan red sa onoliko kolona koliko je komponenata GridLayout(int rows, int cols) Deli prozor na specificirani broj redova i kolona GridLayout(int rows, int cols, int hGap, int vGap) definie se razmak izmeu elija
JAVA 40
GridLayout primer
public class GridTest extends Applet { public void init() { setLayout(new GridLayout(2,3)); // 2 reda, 3 kolone add(new Button("Button One")); add(new Button("Button Two")); add(new Button("Button Three")); add(new Button("Button Four")); add(new Button("Button Five")); add(new Button("Button Six"));
JAVA 41
Reagovanje na dogaaje
JAVA 42
Primer:Listener interfejs
import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class CircleDrawer2 extends Applet implements MouseListener { private int radius = 25; public void init() { setForeground(Color.BLUE); addMouseListener(this); }
JAVA 43
JAVA 44
JAVA 45
ActionListener
AdjustmentListener
ComponentListener
ContainerListener
FocusListener
JAVA 47
ItemListener
KeyListener
JAVA 48
MouseListener
MouseMotionListener
MouseInputListener
JAVA 49
TextListener
Primenjuje se na tekstualna polja i oblasti teksta (text fields and text areas)
textValueChanged(TextEvent event)
WindowListener
JAVA 50