java.sun.com Technológie JavaTM - cvičenia
Cvičenie 9
Téma

Grafické rozhranie (GUI)
Udalosti
Komponenty a kontajnery, hierarchia
Rozmiestňovanie komponentov - layout manažéry

Grafické rozhranie

Grafické používateľské rozhranie (Graphical User Interface) predstavuje komunikáciu medzi aplikáciou a používateľom. Slúži na vstup informácií špecifikovaných používateľom do aplikácie a zároveň prezentuje informácie získané počas behu aplikácie. Práve toto rozhrania určuje do istej miery aj atraktívnosť produktu - aplikácie.

Jazyk Java ponúka množstvo tried na tvorbu grafického rozhrania. Základom sú balíky:

  • AWT - abstract window toolkit - množina tried na tvorbu grafického rozhrania, komponenty v AWT (tlačidlá, nadpisy) majú vzhľad platformy, na ktorej sa program používajúci AWT vykonáva. Z tohto dôvodu sa v súčasnosti upúšťa od použitia tejto knižnice na tvorbu GUI.
  • SWING - množina tried na tvorbu grafického rozhrania, vzhľad komponentov je nezávislý od platformy. Aplikácia má rovnaký vzhľad na všetkých platformách. Swing nepoužíva natívny kód na zobrazenie komponentov. O vykreslenie komponentov sa stará sám.

Triedy AWT sú implementované v balíkoch java.awt. Triedy implementujúce rozhranie SWING sú v balíkoch javax.swing.

Udalosti

Udalosť - definuje nejakú zmenu v systéme. Na túto udalosť by mala aplikácia patrične zareagovať. Takouto udalosťou môže byť napríklad stlačenie tlačidla, vybratie prvku zo zoznamu a podobne.

Nasledujúca tabuľka popisuje niekoľko typov udalostí, triedy objektov charakterizujúce danú udalosť a rozhrania popisujúce metódy reakcie na udalosť.

Typ udalosti Trieda udalosti (Event) Obsluha udalosti (Event Listener)
Stlačenie tlačidla, výber prvku z menu, ... ActionEvent ActionListener
Zatvorenie okna WindowEvent WindowListener
Stlačenie tlačidla myši MouseEvent MouseListener
Posun kurzora myši MouseEvent MouseMotionListener
Detekcia získania (straty) fokusu FocusEvent FocusListener
Zmena zvoleného riadku v tabuľke, zozname ListSelectionEvent ListSelectionListener

Príklad pod textom prezentuje reakciu na udalosť - stlačenie myši.
Zdrojový text ClickTest.java.

Komponenty a kontajnery

Komponent - predstavuje grafický prvok - tlačidlo, nadpis, panel (rodičovská trieda Component, JComponent).
Kontajner - komponent, do ktorého je možné vkladať iné komponenty napr. tlačidlá, nadpisy a podobne (rodičovská trieda Container).

Hierarchické zoskupovanie komponentov má význam pri rozmiestňovaní komponentov v rámci formulára. Koreňom je vždy kontajner najvrchnejšej úrovne (JFrame, JDialog, JApplet). Kontajnery najvrchnejšej úrovne môžu obsahovať menu. Na pridávanie komponentu do kontajnera sa používa metóda add. Komponenty sa vykresľujú od najvrchnejšej úrovne t.j. najprv rodičovský kontajner a až potom komponenty v ňom. Vykresľovanie v SWING-u je zdvojene vykonávané (double-buffering).

Nasledujúci príklad prezentuje použitie knižnice SWING, hierarchiu komponentov.
Zdrojový text UITest.java. Obrázok pod textom zobrazuje bežiacu aplikáciu.

V tomto programe je nasledujúca hierarchia komponentov: Hlavné okno aplikácie (JFrame) obsahuje kontajner (contentPane). Do tohto kontajnera je vložený panel (JPanel). Tento panel obsahuje horný panel a dole tlačidlo (JButton). V hornom panely sú štyri grafické prvky (JTextField, JLabel, JComboBox, JLabel).

Komponenty knižnice SWING

Kontajnery najvrchnejšej úrovne
JApplet JDialog JFrame
Kontajnery všeobecného použitia

JPanel

JScrollPane

JTabbedPane

JToolBar

JSplitPane
 
Základné prvky

JButton, JToggleButton, JCheckBox, JRadioButton

JComboBox

JList

JMenu

JSlider

JTextFieldJ, PasswordField

JLabel

JProgressBar

JToolTip

JTable

JTextArea, JTextPane, JEditorPane

JTree

Rozmiestňovanie komponentov - layout manažéry

Okrem vloženia komponentov do kontajneru (napr. Panel) - hierarchické vrstvenie - je nutné určiť rozmiestnenie týchto komponentov vrámci kontajneru - layout.
Konkrétny layout pre kontajner sa nastavuje:

	setLayout(layout);
	

Border Layout

Border Layout má päť oblastí - NORTH (sever-hore), WEST (západ-vľavo), CENTER (stred), EAST (východ-vľavo), SOUTH (juh-dole). Preferovaná na veľkosť je stredná časť. Ostatným oblastiam je pridelený len nutný priestor. Border Layout je predvolený layout pre contentPane.

Použitie

Nastavenie layout-u pre kontajner:

	setLayout(new BorderLayout());
resp. je možné špecifikovať aj medzery medzi oblasťami.
	setLayout(new BorderLayout(horizontalnaMedzera, vertikalnaMedzera));
Pri pridávaní komponentu do kontajnera je nutné špecifikovať oblasť.
	add(component, BorderLayout.NORTH);
	add(component, BorderLayout.WEST);
	add(component, BorderLayout.CENTER);
	add(component, BorderLayout.EAST);
	add(component, BorderLayout.SOUTH);
Zdrojový text AWT appletu BorderLayoutAWTApplet.java.

Zdrojový text SWING appletu a zároveň aplikácie BorderLayoutTest.java.
Odkaz na applet - nutný Java 2 plugin z dôvodu použitia knižnice SWING - BorderLayout.html.

Flow Layout

Flow Layout je jeden z najjednoduchších layout-ov. Flow Layout je predvolený layout pre JPanel.

Použitie

Nastavenie layout-u pre kontajner:

	setLayout(new FlowLayout());
resp. je možné špecifikovať zarovananie aj medzery medzi oblasťami.
	setLayout(new FlowLayout(zarovnanie,horizontalnaMedzera, vertikalnaMedzera));
Pridávanie komponentu do kontajnera:
	add(component);
Zdrojový text AWT appletu FlowLayoutAWTApplet.java.

Zdrojový text SWING appletu a zároveň aplikácie FlowLayoutTest.java.
Odkaz na applet - nutný Java 2 plugin z dôvodu použitia knižnice SWING - FlowLayout.html.

Grid Layout

Grid Layout slúži na umiestňovanie komponentov do buniek v riadkoch a stĺpcoch - mriežka. Veľkosť každej bunky je rovnaká - prispôsobí sa najväčšiemu komponentu.

Použitie

Nastavenie layout-u pre kontajner:

	setLayout(new GridLayout(pocetRiadkov, pocetStlpcov));
resp. je možné špecifikovať zarovananie aj medzery medzi oblasťami.
	setLayout(new GridLayout(pocetRiadkov, pocetStlpcov, horizontalnaMedzera, vertikalnaMedzera));
Pridávanie komponentu do kontajnera:
	add(component);
Zdrojový text AWT appletu GridLayoutAWTApplet.java.

Zdrojový text SWING appletu a zároveň aplikácie GridLayoutTest.java.
Odkaz na applet - nutný Java 2 plugin z dôvodu použitia knižnice SWING - GridLayout.html.

Grid Bag Layout

Grid Bag Layout je najkomplexnejším a zároveň najzložitejšie použiteľným layout-om. Tento layout je pomerne flexibilný a umožňuje dobré rozmiestňovanie komponentov. Bližšie Java Tutoriál. Na prácu s týmto layout-om odporúčam nejaké vhodné grafické vývojové prostredie.

Zdrojový text AWT appletu GridBagLayoutAWTApplet.java.

Zdrojový text SWING appletu a zároveň aplikácie GridBagLayoutTest.java.
Odkaz na applet - nutný Java 2 plugin z dôvodu použitia knižnice SWING - GridBagLayout.html.

Box Layout

Box Layout slúži na umiestňovanie komponentov v riadku zľava doprava alebo v stĺpci zhora nadol. Tento layout je pomerne flexibilný a umožňuje dobré rozmiestňovanie komponentov, je definovaný v balíku javax.swing ako jediný z layout-ov. Bližšie Java Tutoriál.

Použitie

Nastavenie layout-u pre kontajner:

	setLayout(new BoxLayout(pocetRiadkov, pocetStlpcov));
resp. je možné špecifikovať zarovnanie aj medzery medzi oblasťami.
	setLayout(new BoxLayout(pocetRiadkov, pocetStlpcov, horizontalnaMedzera, vertikalnaMedzera));
Pridávanie komponentu do kontajnera:
	add(component);
Zdrojový text SWING appletu a zároveň aplikácie BoxLayoutTest.java.
Odkaz na applet - nutný Java 2 plugin z dôvodu použitia knižnice SWING - BoxLayout.html.

Absolútne pozície

Okrem použitia layout-ov je možné špecifikovať pre komponenty aj absolútne pozície.

Použitie

Zrušenie nastaveného layout-u pre kontajner:

	setLayout(null);
Pridávanie komponentu do kontajnera:
	add(component);
	component.setBounds(lavyHornyRohX,lavyHornyRohY,sirka,vyska);
Zdrojový text AWT appletu NoLayoutAWTApplet.java.

Zdrojový text SWING appletu a zároveň aplikácie NoLayoutTest.java.
Odkaz na applet - nutný Java 2 plugin z dôvodu použitia knižnice SWING - NoLayout.html.

Zhrnutie

  1. Čo je GUI?
  2. Čo je to udalosť?
  3. Aký význam majú kontajnery pri tvorbe GUI?
  4. Ktoré balíky v Jave obsahujú triedy a rozhrania na tvorbu GUI?
  5. Aký je rozdiel medzi AWT a SWING?
  6. Aký výzmnam má hierarchické zlučovanie komponentov?
  7. Načo slúžia layout manažéry?
  8. Ako sa nastavuje layout pre kontajner?
  9. Aké existujú základné layout manažéry v Jave?