JavaBeans (1. část) - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Java

JavaBeans (1. část)

16. února 2001, 00.00 | Praktická ukázka použití JavaBeans. Co umožnují tyto komponenty a k čemu všemu se dají použít? Jak napsat vlastní JavaBeans vám ukáže tento článek.

V tomto článku bych chtěl na příkladu ukázat použití JavaBeans. Nejedná se o kompletního průvodce, spíše bych chtěl upozornit na některé záludnosti. JavaBeans v překladu znamená kávové boby, pod tímto pojmem máme na mysli viditelné (ve skutečnosti nemusejí být vždy viditelné) komponenty v jazyce Java, které mají svou vlastní inteligenci. Dokáží reagovat na události a samy naopak události vyvolávat. Mají určitý svůj vnitřní stav, který jsou schopny uložit na disk a zachovat pro příští použití (perzistence). Tyto jednotlivé komponenty obvykle anglicky označujeme jako "Beans". Uvedené označení budu používat i v následujícím textu.

Pro práci s JavaBeans pužíváme BDK (Beans Development Kit), ten k dispozici zdarma na stránkách firmy Sun. BDK obsahuje tzv. "BeanBox", který umožňuje pracovat s JavaBeans vizuálně a pomocí myši mezi nimi vytvářet vazby. V následujícím textu budu předpokládat, že čtenář má již BDK nainstalován (instalace spočívá v překopírování na disk).

Kávovníková plantáž

Protože všechno se točí kolem kávy, bude náš příklad popisovat zpracování této suroviny. Kávovník arabský je stále zelený strom, který se pěstuje na plantážích převážně v Brazílii. Semena kávovníku se praží, což jim dodává charakteristickou vůni. V našem příkladě bude komponentou Bean kávoníková plantáž. Každá Bean může mít určité vlastnosti. Vlastností plantáže je například počet stromů, které na ní rostou. V jazyce Java bychom vše vyjádřili následovně:

import java.beans.*;
import javax.swing.*;

public class Plantaz extends JPanel implements java.io.Serializable {
	private int pocetStromu;
	private JLabel label = new JLabel();

	public Plantaz() {
	    setPocetStromu(0);
		add(label);
	}
	public void setPocetStromu(int novyPocetStromu) {
	    pocetStromu = novyPocetStromu;
	    label.setText(String.valueOf(pocetStromu));
	}
	public int getPocetStromu() {
	    return pocetStromu;
	}
	public void pridejStrom() {
        setPocetStromu(getPocetStromu() + 1);
	}
}

Aby bylo možné "plantáž snadno zobrazit", jedná se o potomka komponenty JPanel, stejně tak by ale předkem mohl být třeba Canvas nebo jiná viditelná komponenta. Počet stromů je uložen v proměnné pocetStromu. Ke změně počtu stromů a zjištění jejich počtu používáme metody setPocetStromu a getPocetStromu. Metoda setPocetStromu kromě toho také zobrazí aktuální počet stromů na obrazovce. Navíc je zde metoda pridejStrom, která zvýší počet stromů o jedna. Interface java.io.Serializable implementujeme kvůli již zmíněné perzistenci.

Každou Bean, se kterou chceme pracovat v BeanBoxu, je nutné uložit do archivu typu JAR. Zdrojový kód Plantaz.java nejprve přeložíme do bytoveho kódu povelem

javac Plantaz.java

z příkazové řádky. Pak vytvoříme tzv. "manifest", tj. soubor obsahující informace o jednotlivých třídách, nazvat si jej můžeme třeba manifest.mf, tento soubor by měl obsahovat následující řádky:

Name: Plantaz.class
Java-Bean: True

To znamená, že soubor obsahuje Bean a ta je obsažena v třídě Plantaz.class. Nyní vytvoříme JAR archiv příkazem

jar cfm Plantaz.jar manifest.mf Plantaz.class.

Prohlížení v BeanBoxu

Po nainstalování BDK je na disku vytvořen adresář BeanBox a v něm soubor run.bat. Spuštěním tohoto souboru je spuštěn BeanBox. Jedná se o grafické prostředí pro práci s JavaBeans, vypadá následovně:

Klikněte pro větší obrázek

V okně nejvíce vlevo (nazvaném ToolBox) je seznam všech dostupných Beans. Při spuštění programu jsou zde všechny Beans obsažené v podadresáři jars adresáře s instalací BDK. Za chvíli si ukážeme, jak přidat další.

Do velkého okna uprostřed (BeanBox) umisťujeme jednotlivé Beans a pomocí myši mezi nimi vytváříme vazby.

Chceme-li přidat novou Bean, máme dvě možnosti, buď její JAR archiv umístit do adresáře jars a znovu spustit BeanBox, nebo v menu BeanBoxu File zvolit povel LoadJar... a otevřít JAR archiv ručně. Když uvedené provedeme s archivem Plantaz.jar objeví se v ToolBoxu nový řádek (možná, že bude nutné malinko změnit polohu posuvníků, aby byl vidět), ToolBox je vidět na následujícím obrázku:

ToolBox

Kliknutím myší na tento řádek (které je následováno změnou tvaru kurzoru) a následujícím kliknutím "někam do BeanBoxu" je Bean Plantaz umístěna. V okně Properties se objeví všechny její vlastnosti. Je jich poměrně hodně, neboť jsou zde také vlastnosti komponenty JLabel. Mezi vlasnostmi je i pocetStromu, kterou jsme přidali my.

Vlastnost se jmenuje pocetStromu nikoliv proto, že je její hodnota uložena v proměnné pocetStromu, ale proto, že k ní přistupujeme pomocí metod setPocetStromu a getPocetStromu. Jméno vlastnosti je vždy odvozeno z jmen přístupových metod a vůbec nezávisí ne tom, jak a kde je její hodnota uložena.

V okně Properties můžeme hodnoty jednotlivých vlastností libovolně měnit (později si ukážeme, že ne vždy libovolně).

Reakce na události

V ToolBoxu je několik již hotových Beans, zatím se nebudeme zajímat o to, jak fungují, ale zkusíme hned některou z nich použít. Zkusme umístit do BeanBoxu komponentu BlueButton. Jedná se (jak již název napovídá) o modré tlačítko, které po stisku vyvolá událost. Jestliže si myší vybereme toto tlačítko (to, že je vybrané, poznáme podle zvýrazněného okraje) a v menu Edit vybereme povel Events|button push|actionPerformed, pak se na obrazovce objeví čára vedoucí z tlačítka. Jestliže pomocí myši umístíme druhý konec čáry na Bean Plantaz, objeví se nabídka možných akcí. Jedná se o metody komponenty Plantaz, z nichž můžeme vybrat tu, kterou si přejeme vyvolat po stisku tlačítka. Jestliže vybereme pridejStrom, pak po každém stisku tlačítka bude vyvolána stejnojmenná metoda a dojde ke zvýšení počtu stromů plantáže. Aby kód třídy nebyl zbytečně komplikovaný, nedochází k automatické aktualizaci velikosti Bean při zvýšení počtu stromů, jestliže je místo hodnoty počtu stromů zobrazeno několik teček, je nutné komponentu pomocí myši zvětšit.

My bychom ale chtěli, aby současně na změnu počtu stromů reagovala nějaká další Bean, to si hned ukážeme.

Sledování změn

Plantáž, kterou jsme vytvořily, byla schopna reagovat na vnější události, sama však nebyla schopna události vyvolávat. K tomu, aby se to naučila, ji budeme muset malinko pozměnit. Aby nedocházelo k nedorozuměním, novou třídu pojmenujeme Plantaz2. Vlastnostem, které vyvolávají události, říkáme "vázané vlastnosti" (bound properties), abychom z pocetStromu udělali vázanou vlasnost, musíme vytvořit instanci objektu PropertyChangeSupport, to provedeme přidáním řádku

private PropertyChangeSupport zmena = new PropertyChangeSupport(this);

do zdrojového textu třídy. Dále musíme zařídit, aby v metodě setPocetStromu došlo k vyvolání události změny, do zdrojového kódu této metody musíme přidat volání metody firePropertyChange, jejímiž parametry jsou název vlastnosti, její stará hodnota a její nová hodnoty, v našem případě:

	public void setPocetStromu(int novyPocetStromu) {
	    label.setText(String.valueOf(novyPocetStromu));
	    zmena.firePropertyChange("pocetStromu",
		    new Integer(pocetStromu), new Integer(novyPocetStromu));
   	    pocetStromu = novyPocetStromu;
	}

Druhý a třetí parametr této metody je typu Object, proto musíme primitivní datové typy nejprve převést na objekty. Poslední nutnou změnou je přidání dvou metod pro přidávání a odstraňování "posluchačů" (listeners), tj. komponent, které budou reagovat na události. Protože třída PropertyChangeSupport již tyto metody implementuje, postačí, když je zavoláme.

	public void addPropertyChangeListener(PropertyChangeListener l) {
    	    zmena.addPropertyChangeListener(l);
	}
	public void removePropertyChangeListener(PropertyChangeListener l) {
    	    zmena.removePropertyChangeListener(l);
    }

Abychom mohli Plantaz2 použít, musíme ji již popsaným postupem "zabalit" do JAR archivu, kde manifest bude nyní obsahovat jméno třídy Plantaz2.class.

Mezi hotovými Beans v ToolBoxu je také ChangeReporter. Ten je schopen reagovat na změny vlastností jiných Beans a popisovat je. Zkusme umístit na plochu BeanBoxu jedno tlačítko BlueButton, jednu Plantaz2 a jeden ChangeReporter. Dále navážeme metodu pridejStrom na událost tlačítka (tj. zvolíme BlueButton, v menu Edit vybereme Events|button push|action Performed a čáru napojíme na Plantaz2, kde mezi akcemi vybereme pridejStrom a na událost propertyChange navážeme metodu reportChange komponenty ChangeReporter. Nyní každý stisk tlačítka BlueButton způsobí zvýšení počtu stromů (jako dříve), ale navíc je každé zvýšení počtu stromů oznámeno v komponentě ChangeReporter.

V příštím díle se podíváme, jak naprogramovat onen slibovaný daňový úřad, který bude stanovovat daňové zatížení plantáže na základě počtu stromů na ní pěstovaných.

Všechny zdrojové kódy jsou k dispozici ke stažení, soubor manifest2.mf se vztahuje ke třídě Plantaz2.class.

Tématické zařazení:

 » Rubriky  » Java  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: