A. Abstract Window Toolkit (AWT)
Abstract Window Toolkit (AWT) (1) je Φßst Java Core API, kterou
tvo°φ balφky:
- java.awt,
- java.awt.event (od JDK 1.1),
- java.awt.image,
- java.awt.datatransfer (od JDK 1.1).
AWT umo╛≥uje tvorbu grafickΘho u╛ivatelskΘho rozhranφ (GUI), tj. prßci
se vstupy a v²stupy v graficky orientovan²ch systΘmech (Windows95/NT,
X Window). Programy vyu╛φvajφcφ AWT jsou v duchu jazyka Java pln∞
p°enositelnΘ, ale zßrove≥ je ovlßdßnφ a vzhled jednotliv²ch prvk∙ GUI, komponent, p°izp∙sobeno zvyklostem konkrΘtnφho systΘmu.
Na nßsledujφcφm obrßzku je zachycen applet v prost°edφ X Window - tent²╛
applet b∞╛φcφ pod Windows95 je na str. 3. Ka╛dß komponenta - plßtno (Canvas), v²b∞r (Choice), nßpis (Label), panel (Panel), seznam (List), textovΘ pole (TextField) - je instancφ p°φslu╣nΘ t°φdy komponent z AWT.
A.1. Komponenty
GUI programu tvo°φ komponenty. Strom t°φd komponent v java.awt vypadß
takto:
Component
|
+- Button
+- Canvas
+- Checkbox
+- Choice
+- Container
| |
| +- Panel
| | |
| | +---- java.applet.Applet (!!)
| |
| +- ScrollPane
| +- Window
| |
| +- Dialog
| | |
| | +- FileDialog
| +- Frame
+- Label
+- List
+- Scrollbar
+- TextComponent
|
+- TextArea
+- TextField
Nejd∙le╛it∞j╣φ jsou rodiΦovskΘ t°φdy komponent a kontejner∙:
- Abstraktnφ t°φda Component definuje metody pro zobrazenφ grafickΘ
komponenty a zpracovßnφ (v JDK1.0) a zasφlßnφ (v JDK1.1) udßlostφ (viz
dßle).
- Abstraktnφ t°φda Container definuje metody pro p°idßvßnφ,
odebφrßnφ a manipulaci s komponentami - instance potomk∙ tΘto t°φdy mohou
vlastnit dal╣φ komponenty.
Zp∙sob rozlo╛enφ komponent v kontejneru urΦujφ layout managery -
instance t°φd: BorderLayout, CardLayout, FlowLayout,
GridBagLayout, GridBagConstraints, GridLayout.
Samoz°ejm∞ je mo╛nΘ si navrhnout vlastnφ mana╛er. ╚innost programu vyu╛φvajφcφho komponenty je nßsledujφcφ: program vytvo°φ
kontejner (2) , do kterΘho nßsledn∞ m∙╛e p°idßvat dal╣φ komponenty.
Tφm se vytvo°φ hierarchie instancφ komponent, kterß pro p°edchozφ obrßzek
appletu vypadß takto:
Panel
|
+--------+--------+------+---------+
| | | | |
Canvas Label Choice List TextField
P°i vykreslovßnφ se postupuje shora dol∙; po°adφ vykreslovßnφ komponent na
stejnΘ ·rovni nenφ definovßno. Program reaguje na pokyny u╛ivatele tφm, ╛e jednotlivΘ komponenty zachycujφ
udßlosti (vstupy z klßvesnice a my╣i) a na zßklad∞ nich se vykonßvß
dal╣φ Φinnost.
A.2. Zpracovßnφ udßlostφ
Zp∙sob p°edßvßnφ a zpracovßnφ udßlostφ se v JDK 1.1 zßsadn∞ li╣φ od JDK 1.0,
nebo╗ star² zp∙sob byl "shledßn t∞╛kopßdn²m". Kombinovßnφ obou
zp∙sob∙ se nedoporuΦuje. Krom∞ akcφ, kterΘ u╛ivatel vyvolßvß p°φmo (pohyb
my╣i, stisk klßvesy) se za udßlost pova╛uje i nap°φklad otev°enφ okna,
v²b∞r polo╛ky v menu apod. (3)
- JDK 1.0 - pokud nastane libovolnß udßlost, vytvo°φ se instance t°φdy
java.awt.Event. Tato instance se propaguje zdola nahoru hierarchiφ
komponent, poΦφnaje komponentou, nad nφ╛ udßlost nastala - u ka╛dΘ
komponenty se volß metoda handleEvent() s parametrem instance udßlosti.
- JDK 1.1 - o nastalΘ udßlosti jsou informovßny jen ty objekty (nemusφ
jφt pouze o komponenty), kterΘ o to po╛ßdajφ (zaregistrujφ se). O jednΘ
udßlosti (instanci t°φdy java.util.EventObject) m∙╛e b²t informovßno
i vφce objekt∙ nebo takΘ ╛ßdn².
Udßlosti se d∞lφ do n∞kolika t°φd definovan²ch v balφku java.awt.event:
- ActionEvent - nastane p°i stisku tlaΦφtka apod.,
- KeyEvent - nastane p°i stisku klßvesy,
- MouseEvent - nastane p°i pohybu my╣i, stisknutφ tlaΦφtka my╣i
apod.,
- WindowEvent - nastane p°i otev°enφ, zav°enφ okna apod.
- ...
A.3. V²stup grafiky
Grafick² kontext neboli oblast, kam je mo╛nΘ provßd∞t grafick² v²stup,
reprezentujφ instance t°φdy java.awt.Graphics. Tato t°φda definuje
metody pro kreslenφ grafick²ch primitiv (Φßra - drawLine(), ovßl - drawOval(), polygon - drawPolygon() apod.), v²stup textu - drawString(), vykreslenφ obrßzku - drawImage() atd.Grafick² kontext mß p°i°azen ka╛dß zobrazenß komponenta - v²stup do jejφho
kontextu se provßdφ v metodßch update(java.awt.Graphics g) a paint(java.awt.Graphics g). Manipulaci s obrßzky (vΦetn∞ naΦφtßnφ formßtu GIF a JPEG) slou╛φ t°φdy
z balφku java.awt.image a t°φda java.awt.Image. K vytvß°enφ animacφ je zapot°ebφ vlßken, viz p°φklad 16.2..
Priklad A.1. |
Nßsledujφcφ program demonstruje pou╛itφ AWT. Obsahuje dv∞
komponenty: plßtno (potomka t°φdy java.awt.Canvas), kterΘ umo╛≥uje
kreslenφ pomocφ my╣i, a tlaΦφtko "Clear", kterΘ plßtno vyma╛e. Program
funguje jako applet i jako aplikace. Udßlosti zpracovßvß s vyu╛itφm modelu
podle JDK 1.1.
Dokumentace vygenerovanß z komentß°∙ programem javadoc je
zde.
package demo;
import java.applet.Applet;
import java.awt.event.*;
import java.awt.*;
/**
* Hlavnφ t°φda programu SimpleDraw .
* @author Petr Toman
* @version JDK 1.1
*/
public class SimpleDraw extends java.applet.Applet {
/**
* Metoda init() se volß, je-li program spu╣t∞n jako applet.
* @see java.awt.Frame
* @see java.awt.Button
* @see java.awt.Canvas
*/
public void init() {
// vytvo°enφ plßtna -- plochy pro kreslenφ
PaintCanvas paintCanvas = new PaintCanvas();
// vytvo°enφ tlaΦφtka s nßpisem "Clear"
Button button = new Button("Clear");
// registrace plßtna jako p°φjemce udßlosti p°i stisku tlaΦφtka
button.addActionListener(paintCanvas);
// nastavenφ layout manageru
setLayout(new BorderLayout());
// vlo╛enφ plßtna a tlaΦφtka "Clear" do appletu-kontejneru
add(paintCanvas, "North");
add(button, "South");
}
/**
* Metoda main() se volß, je-li program spu╣t∞n jako aplikace.
* Provßdφ totΘ╛, co init() , pouze nejprve vytvo°φ okno ( frame ),
* do kterΘho umis╗uje komponenty.
* @param args parametry p°φkazovΘ °ßdky (nepou╛ito)
*/
public static void main(String[] args) {
Frame frame = new Frame("SimpleDraw");
PaintCanvas paintCanvas = new PaintCanvas();
Button button = new Button("Clear");
button.addActionListener(paintCanvas);
frame.add(paintCanvas, "North");
frame.add(button, "South");
frame.pack();
frame.show();
}
}
/**
* T°φda slou╛φcφ pro vytvo°enφ plßtna. Zachycuje udßlosti "pohyb my╣i"
* a "stisk tlaΦφtka" -- proto implementuje uvedenß rozhranφ.
* @see java.awt.event.MouseMotionListener
* @see java.awt.event.ActionListener
*/
public class PaintCanvas extends Canvas
implements MouseMotionListener, ActionListener {
Graphics offGraphics; // skryt² grafick² kontext
Image offImage; // skryt² obrßzek (buffer)
int oldx, oldy; // "starΘ" sou°adnice my╣i
/** Konstruktor */
public PaintCanvas() {
// nastavenφ barvy pozadφ na bφlou
setBackground(Color.white);
// registrace sebe ( this ) jako p°φjemce udßlosti "pohyb my╣i"
addMouseMotionListener(this);
}
/**
* Metoda getMinimumSize() musφ b²t implementovßna kv∙li
* urΦenφ velikosti pro layout manager.
* @return minimßlnφ velikost komponenty (plßtna).
*/
public Dimension getMinimumSize() {
return new Dimension(300,200);
}
/**
* Metoda getPreferredSize() musφ b²t implementovßna kv∙li
* urΦenφ velikosti pro layout manager.
* @return preferovanou velikost komponenty (plßtna).
*/
public Dimension getPreferredSize() {
return getMinimumSize();
}
/**
* Metoda mouseDragged() je volanß p°i pohybu a souΦasnΘm dr╛enφ
* tlaΦφtka my╣i.
*/
public void mouseDragged(MouseEvent e) {
// je-li mo╛no provßd∞t v²stup, vykreslφ Φßru
if (offGraphics != null)
offGraphics.drawLine(oldx, oldy, e.getX(), e.getY());
// uschovßnφ sou°adnic my╣i
oldx = e.getX();
oldy = e.getY();
// p°ekreslit plßtno!
repaint();
}
/**
* Metoda mouseMoved() je volanß p°i pohybu my╣i (bez stisku tlaΦφtka).
*/
public void mouseMoved(MouseEvent e) {
// uschovßnφ sou°adnic my╣i
oldx = e.getX();
oldy = e.getY();
}
/**
* Metoda actionPerformed() je volanß stisku tlaΦφtka "Clear".
*/
public void actionPerformed(ActionEvent e) {
// zru╣enφ skrytΘho bufferu (bude provedeno vymazßnφ)
offImage = null;
// p°ekreslit plßtno!
repaint();
}
/**
* Metoda update() je volßna p°i p°ekreslovßnφ komponenty.
* Standardn∞ vyma╛e pozadφ a volß metodu paint() .
* Je p°edefinovßna, aby nedochßzelo k blikßnφ.
*/
public void update(Graphics g) {
paint(g);
}
/**
* Metoda paint() provßdφ vykreslenφ obsahu plßtna -- p°ekopφruje
* skryt² buffer do grafickΘho kontextu komponenty ( parametr g ).
*/
public void paint(Graphics g) {
int width = getSize().width;
int height = getSize().height;
if (offImage == null) {
// vytvo°enφ prßzdnΘho bufferu
offImage = createImage(width, height);
offGraphics = offImage.getGraphics();
}
// nastala zm∞na velikosti komponenty?
if (offImage.getWidth(this) != width ||
offImage.getHeight(this) != height) {
// ano - vytvo°it skryt² buffer aktußlnφ velikosti...
Image img = createImage(width, height);
offGraphics = img.getGraphics();
// ... a zkopφrovat star² buffer
offGraphics.drawImage(offImage,0,0,this);
offImage = img;
}
// zobrazenφ bufferu do grafickΘho kontextu komponenty
g.drawImage(offImage,0,0,this);
}
}
Pro applet je t°eba vytvo°it HTML dokument, kter² obsahuje text:
<APPLET
CODE = demo.SimpleDraw.class
WIDTH = 300
HEIGHT = 230>
</APPLET>
Vlastnφ applet pak vypadß takto: |
---|
|
|
|
|