Programovanie

Budovanie množstva fazule: Vytvorte opakovane použiteľné komponenty JavaBeans

V tejto krátkej sérii skúmame vývoj softvérových komponentov JavaBeans. S väčšinou fazule bude nakoniec manipulované vo vývojovom prostredí pre fazuľa; tu sa však zaoberáme iba aspektmi rámca na úrovni zdrojov. Výhody vývoja JavaBeans - teda vývoja podľa špecifikácie JavaBeans - sú niekoľko, medzi nimi sú:

  • S fazuľami môžu vo vizuálnych vývojových prostrediach ľahko manipulovať používatelia, ktorí nemusia byť technicky zruční vo vývoji jazyka Java na zdrojovej úrovni.

  • Vďaka štandardnému rozhraniu je fazuľa ľahko distribuovateľná, čo umožňuje ľahšiu integráciu komponentov tretích strán do vývoja.

  • Vývojári môžu ľahko preniesť kód vyvinutý pre jeden projekt do opakovane použiteľnej knižnice komponentov, ku ktorej bude možné získať prístup v budúcom vývoji.

Oko búrky

V

prvá časť tejto série

, sme vyvinuli dve jednoduché fazule: vizuálny poplachový bean a grafický bean šípka doľava / doprava. Oba boli doplnené vizuálnym

prispôsobovač

a

informácie o fazuli

triedy. V fazuliach, ktoré pokrývame tento mesiac, nebudeme poskytovať úpravy; Namiesto toho sa sústredíme na použitie existujúcich bôbov a komponentov na vytvorenie väčších a lepších bôbov.

Predpoklady

Ako pokračovanie dvojdielnej série predpokladám oboznámenie sa s problémami diskutovanými v predchádzajúcej časti, vrátane doplňujúcich článkov a zdrojov.

Fazuľa

Od začiatku do konca tejto série vyvíjame nasledujúce fazule:

AlarmBean Non-grafická fazuľa, ktorá vypáli udalosť po zadanom oneskorení.
ArrowBean

Grafická fazuľa so šípkou doľava / doprava.

ProgressBean

Grafická fazuľa zobrazujúca pokrok.

NumberFieldBean

Grafická číselná hodnota Textové pole fazuľa s rolovými gombíkmi. Táto fazuľa využíva fazuľu ArrowBean.

FontChooserBean

Grafická fazuľa na výber písma. Táto fazuľa využíva fazuľu NumberFieldBean.

FontSelectorBean

Grafická fazuľa na výber písma, ktorá zobrazuje aktuálne písmo a poskytuje tlačidlá OK / Zrušiť. Táto fazuľa využíva fazuľu FontChooserBean.

FontDialogBean

Grafická fazuľa na výber písma, ktorá otvorí výber písma v samostatnom dialógovom okne. Táto fazuľa využíva fazuľu FontSelectorBean.

Diskutovali sme o AlarmBean a ArrowBean fazuľa podrobne minulý mesiac; v tejto epizóde si rozoberieme zvyšné fazule s rôznou úrovňou podrobností.

Možno by vás zaujímalo, prečo staviame tri fazule písma. Konečným cieľom je jednoducho vytvoriť zrnko selektora písma, ktoré otvorí dialógové okno s fontom, keď používateľ klikne na tlačidlo. Táto úloha sa veľmi prirodzene delí na tri fazule, ktoré vytvoríme: Prvým je používateľské rozhranie pre výber písma, druhým pridávame ovládacie prvky dialógového okna a ukážku písma, tretím sa zobrazuje tlačidlo na vyskakovacie dialógové okno a obsahuje základné informácie. kód na spracovanie dialógového okna.

Bez fazule by sme museli tieto položky vyvíjať ako špecializované komponenty AWT alebo ako jednu monolitickú triedu; pomocou fazule môžeme vyvinúť tri časti ako nezávislé fazule, ktoré sú samy o sebe opakovane použiteľné.

Náš rozsah

Rovnako ako v prvom pokračovaní tejto série, aj tu sa zaoberáme iba beanizmami týchto tried, a nie skutočnými maticami a skrutkami, ktoré ich spôsobujú. Vo výsledku prediskutujeme fazuľu v kosternej podobe, pričom červenou farbou zvýrazníme fragmenty, ktoré majú mimoriadny význam, a ďalšie podrobnosti necháme na nahliadnutie vo vašom voľnom čase. Nebudeme sa zaoberať ani úpravami prispôsobenia, ktorým sme sa dostatočne podrobne venovali v diskusii o prvých dvoch fazuliach.

Ak chcete vidieť nútené práce za fazuľami, pozrite si kompletný zdrojový kód.

Budovanie fazule ProgressBean

ProgressBean

je jednoduchý ukazovateľ priebehu. Je to vlastný komponent AWT, ktorý zobrazuje percentuálnu hodnotu a grafické pruhové znázornenie tejto hodnoty, ako je to znázornené na obrázku nižšie. Vystavuje dve vlastnosti: aktuálnu a maximálnu hodnotu pruhu.

Aktuálna hodnota je vystavená ako pozorovateľný majetok. Pozorovateľné vlastnosti sú vlastnosti, ktorých zmeny možno pozorovať. Pozorovatelia sú zaregistrovaní v beane rovnakým spôsobom ako poslucháči udalostí a sú informovaní o každej zmene vlastnosti. Fazuľa musí mať výslovne pozorovateľné jednotlivé vlastnosti fazule; nie je možné pozorovať zmeny akejkoľvek vlastnosti ktorejkoľvek fazule.

Táto fazuľa je implementovaná v nasledujúcich dvoch triedach:

  • ProgressBean - Hlavná trieda fazule

  • ProgressBeanBeanInfo - Informačná trieda fazule

Trieda ProgressBean

The

ProgressBean class je hlavná trieda fazule, jednoduchý vlastný komponent AWT a Java fazuľa.

verejná trieda ProgressBean rozširuje komponent ... 

Táto fazuľa je ľahký komponent, takže ju rozširujeme Komponent namiesto Plátnoa poskytnúť príslušné informácie farba () metóda. Ľahký rámec komponentov je efektívnejší ako tradičný rámec vlastných komponentov a vyžaduje menej zdrojov miestneho okenného systému. Ako komponent automaticky dedíme serializovateľnosť nariadenú JavaBeans a poskytujeme predvolený konštruktor no-arg.

public void setBarground (Color c) ... public Color getBarground () ... public synchronized void setMaximum (int m) ... public int getMaximum () ... 

Tu vystavujeme Farba nehnuteľnosť barcelona (farba zobrazeného pruhu) a int nehnuteľnosť maximálne (maximálna hodnota stĺpca).

public synchronized void setValue (int v) {if (value! = v) {value = v; premaľovať (); fireValueChange (); }} public int getValue () ... 

The int nehnuteľnosť hodnotu je pozorovateľné, čo znamená, že musíme informovať všetkých zainteresovaných poslucháčov vždy, keď sa zmení jeho hodnota. Za týmto účelom nazývame naše fireValueChange () spôsob informovania poslucháčov kedykoľvek setValue () sa volá.

chránený poslucháčov PropertyChangeSupport = nový PropertyChangeSupport (toto); public void addPropertyChangeListener (PropertyChangeListener l) {listeners.addPropertyChangeListener (l); } public void removePropertyChangeListener (PropertyChangeListener l) {listeners.removePropertyChangeListener (l); } 

Tu udržiavame zoznam objektov, ktoré sú zaregistrované, aby boli notifikované vždy, keď sa zmení pozorovateľná vlastnosť. Používame triedu PropertyChangeSupport z java.beans tento zoznam udržiavať. Konštruktor pre túto triedu vyžaduje, aby sme zadali fazuľu, ktorá bude pôvodom udalostí zmeny vlastnosti; v tomto prípade to je totoa metódy, ktoré poskytuje, nám umožňujú udržiavať zoznam.

Odhalením metód addPropertyChangeListener () a removePropertyChangeListener (), automaticky označujeme, že táto fazuľa má pozorovateľné vlastnosti. To však nenaznačujeme ktoré vlastnosti sú pozorovateľné. Tieto informácie musia byť náležite zdokumentované fazuľou.

chránené celé číslo oValue = nové celé číslo (hodnota); protected void fireValueChange () {listeners.firePropertyChange ("value", oValue, oValue = new Integer (value)); } 

Túto metódu voláme, aby sme poslucháčov informovali o zmene v našej hodnotu nehnuteľnosť; používame firePropertyChange () metóda nášho zoznamu na šírenie tohto oznámenia. Prvý parameter je názov vlastnosti, ktorý by sa mal zhodovať s názvom exponovanej vlastnosti; druhým parametrom je stará hodnota vlastnosti; a tretia vlastnosť je nová hodnota. The PropertyChangeSupport trieda sa vráti bez toho, aby urobila čokoľvek, ak sú staré a nové hodnoty rovnaké.

Trieda ProgressBeanBeanInfo

The

ProgressBeanBeanInfo trieda jednoducho popisuje ProgressBean fazuľa, zakrývajúc všetky zdedené informácie, ktoré by sme chceli zakryť.

Budovanie fazule NumberFieldBean

Táto fazuľa implementuje bežnú súčasť používateľského rozhrania, pole pre rolovateľné zadávanie čísel - číselné textové pole, ktoré poskytuje šípky prírastku a úbytku, ako je znázornené na obrázku nižšie. Táto fazuľa prináša dôležitý koncept JavaBeans:

programová manipulácia s fazuľou

.

Programová manipulácia s fazuľami sa týka mechanizmov, ktoré poskytuje JavaBeans na programové vytváranie a prístup k fazuľám. Aj keď je možné získať prístup k fazuli pomocou štandardného vytvárania objektov Java (nový X ()) a mechanizmy na odlievanie typu ((Y) x), odporúča sa použiť poskytnuté mechanizmy JavaBeans na umožnenie budúceho rozšírenia rámca JavaBeans.

Táto fazuľa je implementovaná v nasledujúcich dvoch triedach:

  • NumberFieldBean - Hlavná trieda fazule

  • NumberFieldBeanBeanInfo - Informačná trieda fazule

Číslo triedyFieldBean

The NumberFieldBean trieda, hlavná trieda fazule, je kontajner AWT, ktorý pridáva tri komponenty: dva ArrowBean fazuľa a a Textové pole. Programový prístup k ArrowBean triedy vyžaduje, aby sme využili mechanizmy manipulácie s fazuľami, ktoré som spomenul pred chvíľou.

Aktuálna číselná hodnota je vystavená ako pozorovateľná vlastnosť. Aj keď je to normálna vlastnosť, ku ktorej je možné pristupovať a manipulovať ju obvyklými metódami pristupovania k fazuľám, je tiež pozorovateľný, aby sa poslucháči mohli zaregistrovať a dostávať upozornenia vždy, keď sa zmení jeho hodnota. Ak používateľ stlačí kláves Return, nevypálime udalosť, aj keď by to bolo zjavné rozšírenie tejto triedy.

verejná trieda NumberFieldBean rozširuje Kontajner implementuje ActionListener ... 

Predlžujeme Kontajner a realizovať ActionListener za účelom prijímania udalostí z beanov a komponentov AWT, ktoré používame. Predĺženie Kontajner namiesto tradičnejších Panel znamená, že táto fazuľa, ako ProgressBean fazuľa je ľahký komponent.

verejné NumberFieldBean () ... 

Ako fazuľa musíme poskytnúť verejný konštruktor no-arg. Upozorňujeme, že by sme nemali poskytovať ďalšie programátory na programové použitie; by to bolo v rozpore s prístupovým mechanizmom JavaBeans.

try {down = (ArrowBean) Beans.instantiate (getClass () .getClassLoader (), "org.merlin.beans.arrow.ArrowBean"); } catch (Výnimka ex) {ex.printStackTrace (); } 

Tu tvoríme ArrowBean pomocou programového inštančného mechanizmu fazule. Nepoužívame štandardnú Javu Nový operátor; namiesto toho použijeme vytvoriť inštanciu () metóda triedy Fazuľa. Zadávame ClassLoader použiť na načítanie triedy fazule; v takom prípade použijeme vlastnú ClassLoader a úplný názov triedy fazule („org.merlin.beans.arrow.ArrowBean“), a výsledný odliatok Objekt do príslušnej triedy.

Všimnite si, že vytvoriť inštanciu () metóda môže vyvolať rôzne výnimky (napríklad ak sa nepodarilo nájsť zadaný fazuľa). Jednoducho zachytíme a zobrazíme všetky takéto výnimky, ktoré by sa, mimochodom, nemali vyskytnúť, ak je fazuľa správne nainštalovaná.

add ("East", (Component) Beans.getInstanceOf (down, Component.class)); 

Tu sme obsadili ArrowBean do a Komponent a pridaj to ako normalne Komponent. Nepoužívame štandard (Komponent) mechanizmus odlievania typu a nepoužívame skutočnosť, že náš AlarmBean je podtrieda Komponent; namiesto toho použijeme getInstanceOf () metóda triedy Fazuľa. Zadáme fazuľu, ktorú chceme hodiť, a Trieda objekt, na ktorý ho chceme hodiť (v tomto prípade Komponent.trieda).

Aj keď tento prístup nemá v súčasnosti veľký zmysel, budúce verzie JavaBeans budú podporovať fazuľa zloženú z viacerých súborov triedy, ako aj fazuľa, ktorá môže ako rôzne triedy vystaviť svoje rôzne aspekty. Napríklad fazuľa sa môže javiť ako podtrieda obidvoch Komponent a RemoteObject poskytnutím dvoch spojených tried: a Komponent a a RemoteObject. Pomocou mechanizmu casting typu JavaBeans je možné automaticky vrátiť vhodný objekt bean, takže fazuľa môže mať zjavnú viacnásobnú dedičnosť, aj keď to Java natívne nepodporuje. Podrobnosti nájdete v špecifikácii JavaBeans „Glasgow“. (Odkaz na túto špecifikáciu je uvedený v časti Zdroje tohto článku.)

Je nevyhnutné, aby sme tieto mechanizmy prístupu k fazuľkám používali už teraz, aby sme mohli bez problémov prejsť na naše fazule na budúce technológie JavaBeans.

down.setDirection (ArrowBean.LEFT); down.addActionListener (toto); 

Tu nakonfigurujeme ArrowBean pomocou setDirection () vlastník nehnuteľnosti a addActionListener () spôsob registrácie. Tieto prístupové vlastnosti a metódy registrácie poslucháčov môžeme použiť priamo na fazuli, ktorú sme práve vytvorili; je potrebné použiť iba funkciu castingu typu JavaBeans, keď pristupujeme k aspektu fazule, ktorý je zdedený z inej triedy.

public synchronized void setValue (int v) {field.setText (String.valueOf (v)); fireValueChange (getValue ()); } verejné synchronizované int getValue () ... 

Tu vystavujeme int nehnuteľnosť hodnotu, čo je hodnota tohto poľa. Túto vlastnosť je možné pozorovať, takže o jej zmene musíme poslucháčov informovať. Robíme to tak, že zavoláme naše fireValueChange () metóda.

public void setColumns (int c) ... public int getColumns () ... public synchronized void setMinimum (int m) ... public int getMinimum () ... public synchronized void setMaximum (int m) ... public int getMaximum () ... verejné synchronizované neplatné setStep (int s) ... verejné int getStep () ... 

Tu vystavujeme int vlastnosti stĺpce, minimum, maximálnea krok, čo je počet stĺpcov zobrazených v Textové pole, minimálna a maximálna hodnota, ktorú by malo toto pole obsahovať, a hodnota, o ktorú majú tlačidlá šípok zmeniť hodnotu. Tieto vlastnosti nie sú pozorovateľné.

Upozorňujeme, že na zaistenie bezpečnosti vlákien používame v prípade potreby synchronizáciu.

public synchronized void actionPerformed (ActionEvent e) {int value = getValue (); if (e.getSource () == dole) {if (hodnota> minimum) {hodnota = (hodnota - krok> hodnota)? minimum: svorka (hodnota - krok); setValue (hodnota); }} ... 
$config[zx-auto] not found$config[zx-overlay] not found