Naučte se Javu – grafické uživatelské rozhraní 2.

9. července 2003

V předchozím článku jsme se seznámili se základními charakteristikami uživatelského rozhraní AWT. V tomto závěrečném článku našeho seriálu si ukážeme další možnosti jeho využití. Podíváme se na ošetřování událostí a vytvoříme si obecný dialogový box, který budeme moci využívat v různých dalších programech.

Zpracování událostí

Mechanismus událostí slouží k interakci programu s uživatelem a operačním systémem. Událost nastává například při stisku tlačítka, pohybu myši, změně pozice v seznamu, pokusu o zavření okna a podobně. K reakci na události slouží rozhraní EventListener. Existuje několik rozhraní, které jsou potomky třídy java.util.EventListener a slouží pro obsluhu různých typů událostí, například:

  • ActionListener – zpracovává např. stisk tlačítka
  • ItemListener – zpracovává změnu položek (seznamů apod.)
  • MouseListener – zpracovává události myši
  • ...

Pokud má program reagovat na danou událost, musí být vytvořena třída implementující dané rozhraní a ta musí být zaregistrována u patřičného prvku (to se provádí metodami addActionListener(), addItemListener() a dalšími). Běžně používaný způsob je vytvoření anonymní třídy přímo v registrační metodě, jak ukazuje následující příklad:

java.awt.Button tlacitko = new java.awt.Button();
tlacitko.addActionListener( new java.awt.event.ActionListener() {
  public void actionPerformed(ActionEvent e)
    {
     // zpracování stisku tlačítka;
    }
  } );

Tato konstrukce se může zdát na první pohled neprůhledná, ovšem není to až tak složité – parametrem metody addActionListener je celý konstruktor nepojmenované třídy včetně její implementace, která představuje implementaci metody actionPerformed. Pokud je zpracování události složitější, napíše se většinou její obsluha v samostatné metodě, která se z ActionListeneru pouze volá (jinak by byl kód velice nečitelný).

Na jeden typ události jedné komponenty může reagovat více ActionListenerů a jedna komponenta může vyvolávat události více typů. Například java.awt.List při změně položky v seznamu vyvolává událost pro ItemListener a při dvojitém poklepání na položce seznamu vyvolá událost pro ActionListener.

Další příklad ukazuje pro srovnání implementaci ItemListeneru u seznamu:

java.awt.List seznam = new java.awt.List();
seznam.addItemListener(new ItemListener() {
    public void itemStateChanged(ItemEvent e) {
        // zpracování události posunu v seznamu
      }
  } );

Všechny komponenty také mohou vyvolávat události pro některá rozhraní: MouseListener, MouseMotionListener, MouseWheelListener, KeyListener, ComponentListener, FocusListener a další.

Ukázku použití událostí můžete rovněž najít v závěrečném příkladu z předchozího článku.

Dialog

Nyní, když už rozumíme zpracování událostí, se podíváme na další komplexnější příklad. Napíšeme si třídu, která zobrazuje dialog se dvěma tlačítky a textem. Tento dialog pak budeme moci využít v libovolném programu.

Třídu pojmenujeme MujDialog a bude potomkem třídy Dialog. Té se v parametru konstruktoru předává rámec, do kterého se má dialog vložit. Proto i konstruktor naší třídy má parametr typu java.awt.Frame. Aby zobrazení dialogu bylo co nejjednodušší (nemusel se v kódu vytvářet rámec a volat konstruktor), bude třída dále obsahovat několik statických metod zobrazOtazku(), které založí patřičnou třídu, nastaví její parametry a zobrazí dialog (metodou show). Pokud bude tato metoda zavolána s jedním textovým parametrem, bude tento použit jako zobrazený text a tlačítka se pojmenují „Ano“ a „Ne“. Pokud budou parametry tři, budou další dva použity pro popisy tlačítek.

Po stisku tlačítka (ošetřeno reakcí na událost) bude dialog zavřen a návratová hodnota (konstanta MujDialog.ANO případně MujDialog.NE) vrácena jako hodnota funkce zobrazOtazku().

Další statická metoda se bude jmenovat zobrazOzmaneni() a oproti předchozí se bude lišit v tom, že zobrazí pouze jedno tlačítko (s implicitním textem „OK“).

MujDialog.java:

import java.awt.*;
import java.awt.event.*;
public class mujDialog
  extends Dialog {
  public static int ANO = 1;
  public static int NE = 2;
  Panel panel1 = new Panel();
  BorderLayout borderLayout1 = new BorderLayout();
  Panel panel2 = new Panel();
  Button buttonAno = new Button();
  Button buttonNe = new Button();
  Label label1 = new Label();
  int vysledek;
  public mujDialog(Frame p0, String text, String tlacitko1, String tlacitko2) {
  super(p0, true);
  enableEvents(AWTEvent.WINDOW_EVENT_MASK);
  try {
    add(panel1);
    panel1.setLayout(borderLayout1);
    this.setSize(new Dimension(400, 150));
    this.setTitle(„Muj dialog“);
    label1.setText(text);
    panel1.add(label1, BorderLayout.CENTER);
    panel1.add(panel2, BorderLayout.SOUTH);
    buttonAno.setLabel(tlacitko1);
    buttonAno.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(ActionEvent e) {
        buttonAno_actionPerformed(e);
      }
    });
    panel2.add(buttonAno, null);
    if (tlacitko2 != null) {
      buttonNe.setLabel(tlacitko2);
      buttonNe.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(ActionEvent e) {
        buttonNe_actionPerformed(e);
        }
      });
      panel2.add(buttonNe, null);
    }
  }
  catch (Exception e) {
    e.printStackTrace();
  }
  }
  // Zajistuje, aby se dialog byl zrusen pri zavreni okna (ve Windows krizkem vpravo)
  protected void processWindowEvent(WindowEvent e) {
  super.processWindowEvent(e);
  if (e.getID() == WindowEvent.WINDOW_CLOSING) {
    System.exit(0);
  }
  }
  void buttonAno_actionPerformed(ActionEvent e) {
  vysledek = this.ANO;
  hide();
  }
  void buttonNe_actionPerformed(ActionEvent e) {
  vysledek = this.NE;
  hide();
  }
  static int zobrazOtazku(String otazka, String tlacitko1, String tlacitko2) {
  mujDialog mujDialog1 = new mujDialog(new Frame(), otazka, tlacitko1, tlacitko2);
  mujDialog1.show();
  return mujDialog1.vysledek;
  }
  static int zobrazOtazku(String otazka) {
  return zobrazOtazku(otazka, „Ano“, „Ne“);
  }
  static int zobrazOznameni(String otazka, String tlacitko) {
  mujDialog mujDialog1 = new mujDialog(new Frame(), otazka, tlacitko, null);
  mujDialog1.show();
  return mujDialog1.vysledek;
  }
  static int zobrazOznameni(String otazka) {
  mujDialog mujDialog1 = new mujDialog(new Frame(), otazka, „OK“, null);
  mujDialog1.show();
  return mujDialog1.vysledek;
  }
}

Příklad použití třídy MujDialog:

if (MujDialog. zobrazOtazku („Libi se vám Java?“)==MujDialog.ANO) {
  System.out.println(„To je dobře“);
  } else {
  System.out.println(„To je škoda“);
  }
int vysledek = MujDialog.zobrazOtazku („Jste doma nebo v práci?“, „Doma“, „V práci“);
if (vysledek==MujDialog.ANO) MujDialog.zobrazOznameni („To se máte!!“);
if (vysledek==MujDialog.NE) MujDialog.zobrazOznameni („Tak pracujte!! :-)“);

Dokázali byste podobným způsobem vytvořit dialog pro zadávání textu?

Závěr

Tímto článkem jsme vyčerpali základy jazyka Java. Na takto malém prostoru se dá popsat opravdu pouze hrubý základ obzvláště u tak bohatého jazyka, jakým Java bezesporu je. Pokud se vám Java zalíbila a hledáte více materiálů, chtěl bych vám doporučit oficiální stránky Javy společnosti SUN Microsystems http://java.sun.com, kde najdete jak kompletní dokumentaci a všechny verze JDK (Java Development Kit), tak i množství příkladů a průvodců pro základní i značně pokročilé oblasti Javy.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Předchozí článek reality
Další článek TechEd 2003
Štítky: Články

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *