Dione
Z. KotalaP. Toman: Java
Predchozi (Obsah) Dalsi

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.

appx256.gif

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:

Bohu╛el, Vß╣ applet nespou╣tφ Javu.


  • (1) Podrobn² popis knihovny AWT obsahujφ [CW97] a [JDK97].
  • (2) V p°φpad∞ appletu je kontejnerem u╛ sßm applet - aplikace musφ vytvo°it instanci t°φdy Frame (viz p°φklad A.1.).
  • (3) P°esnΘ rozli╣enφ typ∙ udßlostφ obsahuje [JDK97].

Predchozi
Converted by Selathco v0.9 on 25.09.1999 19:46
Dalsi