Programiranje

Ustvarjanje fižola fižola: Ustvarite komponente JavaBeans za večkratno uporabo

V tej kratki seriji preučujemo razvoj programskih komponent JavaBeans. Na koncu bo večina fižola manipulirana v okolju za razvoj fižola; vendar se tu ukvarjamo samo z vidiki okvira na ravni vira. Prednosti razvijanja JavaBeans - torej razvoja po specifikaciji JavaBeans - je med njimi več, med njimi:

  • S fižolom lahko v okoljih za vizualni razvoj zlahka manipulirajo uporabniki, ki jim ni treba tehnično podpreti razvoja Java na izvorni ravni.

  • Zaradi običajnega vmesnika se fižol zlahka distribuira, kar omogoča, da se komponente drugih proizvajalcev lažje vključijo v razvojna prizadevanja.

  • Razvijalci lahko zlahka prenesejo kodo, ki je bila razvita za en projekt, v knjižnico komponent za večkratno uporabo, do katere je mogoče dostopati v prihodnjih prizadevanjih za razvoj.

Oko viharja

V

prvi del te serije

, smo razvili dva preprosta fižola: nevizualni alarmni fižol in grafični fižol levo / desno puščico. Oba sta bila dopolnjena z vizualnim

prilagoditelj

in

informacije o fižolu

razredih. Za fižol, ki ga pokrivamo ta mesec, ne bomo ponujali prilagoditeljev; namesto tega se bomo osredotočili na uporabo obstoječega fižola in komponent za ustvarjanje večjega, boljšega fižola.

Pogoji

Kot nadaljevanje dvodelne serije bom domneval, da poznam vprašanja, obravnavana v prejšnjem delu, vključno z dodatnimi členi in viri.

Fižol

Od začetka do konca te serije razvijamo naslednje fižole:

AlarmBean Negrafski grah, ki sproži dogodek po določeni zakasnitvi.
ArrowBean

Grafični fižol v levi / desni puščici.

ProgressBean

Grafični fižol za prikaz napredka.

NumberFieldBean

Grafična številka TextField fižol z gumbi. Ta fižol uporablja fižol ArrowBean.

FontChooserBean

Grafični fižol za izbiro pisav. Ta zrn uporablja zrn NumberFieldBean.

FontSelectorBean

Grafični zrn za izbiro pisave, ki prikazuje trenutno pisavo in vsebuje gumbe OK / Cancel. Ta zrn uporablja zrn FontChooserBean.

FontDialogBean

Grafični zrn za izbiro pisave, ki se prikaže v ločenem pogovornem oknu. Ta zrn uporablja zrn FontSelectorBean.

Razpravljali smo o AlarmBean in ArrowBean podrobno fižol prejšnji mesec; v tej epizodi bomo o preostalem fižolu razpravljali z različnimi stopnjami podrobnosti.

Morda se sprašujete, zakaj gradimo tri zrna pisave. Končni cilj je preprosto izdelati fižol za izbiro pisave, ki se prikaže v pogovornem oknu, ko uporabnik klikne gumb. Ta naloga se povsem naravno razdeli na tri zrna, ki jih bomo ustvarili: prvi je uporabniški vmesnik za izbiro pisave, drugi doda kontrolnike pogovornega okna in vzorec pisave, tretji pa uvede gumb za pojav pogovornega okna in vsebuje osnovno koda za pogovorno okno.

Brez fižola bi morali te izdelke razviti kot specializirane komponente AWT ali kot en sam monolitni razred; z uporabo fižola lahko tri dele razvijemo kot samostojne fižole, ki jih je mogoče večkrat uporabiti.

Naš obseg

Kot pri prvem delu te serije se tudi pri nas ukvarjamo le z beanizmi teh razredov, ne pa tudi z dejanskimi maticami in vijaki, zaradi katerih se tikajo. Kot rezultat bomo razpravljali o fižolu v skeletni obliki, z rdečo poudarili drobce, ki so še posebej pomembni, ostale podrobnosti pa bomo pustili, da jih boste proučili v prostem času. Prav tako se ne bomo ukvarjali s prilagoditelji, ki smo jih dovolj podrobno zajeli z razpravo o prvih dveh fižolih.

Če si želite ogledati prisilno delo za fižolom, si oglejte celotno izvorno kodo.

Gradnja fižola ProgressBean

ProgressBean

je preprost fižol za prikaz napredka. To je komponenta AWT po meri, ki prikazuje odstotno vrednost in grafični prikaz te vrednosti, kot je prikazano na spodnji sliki. Izpostavi dve lastnosti: trenutno in največjo vrednost stolpca.

Trenutna vrednost je prikazana kot opazna lastnost. Opazne lastnosti so lastnosti, katerih spremembe je mogoče opaziti. Opazovalci so z beanom registrirani na enak način kot poslušalci dogodkov in so obveščeni, kadar se lastnost spremeni. Fižol mora izrecno opazovati posamezne lastnosti fižola; ni mogoče opaziti sprememb le katere koli lastnosti katerega koli zrna.

Ta fižol se izvaja v naslednjih dveh razredih:

  • ProgressBean - Glavni razred fižola

  • ProgressBeanBeanInfo - Razred informacij o fižolu

Razred ProgressBean

The

ProgressBean class je glavni razred fižola, preprosta komponenta AWT po meri in Java fižol.

javni razred ProgressBean razširja komponento ... 

Ta fižol je lahka komponenta, zato ga podaljšujemo Komponenta namesto Platnoin zagotovite ustrezen barva () metoda. Okvir lahkih komponent je učinkovitejši od običajnega ogrodja komponent po meri, saj zahteva manj virov lokalnega okenskega sistema. Kot komponenta samodejno podedujemo serializacijo, ki jo zahteva JavaBeans, in nudimo privzeti konstruktor no-arg.

javna void setBarground (barva c) ... javna barva getBarground () ... javna sinhronizirana void setMaximum (int m) ... public int getMaximum () ... 

Tu izpostavljamo Barva lastnine barground (barva prikazane vrstice) in int lastnine največ (največja vrednost palice).

javna sinhronizirana void setValue (int v) {if (vrednost! = v) {vrednost = v; prebarvati (); fireValueChange (); }} javni int getValue () ... 

The int lastnine vrednost je opazen, kar pomeni, da moramo obvestiti vse zainteresirane poslušalce, kadar koli se spremeni njegova vrednost. V ta namen imenujemo svoje fireValueChange () način obveščanja poslušalcev kadar koli setValue () je poklican.

zaščiteni poslušalci PropertyChangeSupport = novo PropertyChangeSupport (to); javna void addPropertyChangeListener (PropertyChangeListener l) {listeners.addPropertyChangeListener (l); } javna void removePropertyChangeListener (PropertyChangeListener l) {listeners.removePropertyChangeListener (l); } 

Tu vzdržujemo seznam predmetov, ki so registrirani in jih je treba obvestiti, kadar se opazna lastnost spremeni. Uporabljamo razred PropertyChangeSupport Iz java.beans za vzdrževanje tega seznama. Konstruktor za ta razred zahteva, da določimo grah, ki bo izvor dogodkov spremembe lastnosti; v tem primeru je toin metode, ki jih ponuja, nam omogočajo, da vzdržujemo seznam.

Z izpostavljanjem metod addPropertyChangeListener () in removePropertyChangeListener (), samodejno označimo, da ima ta fižol opazne lastnosti. Vendar ne navajamo ki lastnosti so opazne. Te informacije je treba ustrezno dokumentirati s fižolom.

zaščiteno celo število oValue = novo celo število (vrednost); zaščitena void fireValueChange () {listeners.firePropertyChange ("vrednost", oValue, oValue = novo celo število (vrednost)); } 

To metodo pokličemo, da poslušalce obvestimo o spremembi našega vrednost lastnina; uporabljamo firePropertyChange () na našem seznamu za razširjanje tega obvestila. Prvi parameter je ime lastnosti, ki se mora ujemati z imenom izpostavljene lastnosti; drugi parameter je stara vrednost lastnosti; in tretja lastnost je nova vrednost. The PropertyChangeSupport razred se vrne, ne da bi nič naredil, če sta stari in novi vrednosti enaki.

Razred ProgressBeanBeanInfo

The

ProgressBeanBeanInfo razred preprosto opisuje ProgressBean fižol, ki zakriva vse podedovane informacije, ki jih želimo prikriti.

Gradnja fižola NumberFieldBean

Ta grah izvaja skupno komponento uporabniškega vmesnika, polje vnosa številke, ki se lahko premika - številsko besedilno polje, ki vsebuje puščice za prirastek in zmanjševanje, kot je prikazano na spodnji sliki. Ta zrn prikazuje pomemben koncept JavaBeans:

programska manipulacija s fižolom

.

Programska manipulacija z fižolom se nanaša na mehanizme, ki jih JavaBeans zagotavlja za programsko ustvarjanje in dostop do fižola. Čeprav je do fižola mogoče dostopati s standardnim ustvarjanjem predmetov Java (nov X ()) in mehanizmi za ulivanje ((Y) x), je priporočljivo, da uporabite predvidene mehanizme JavaBeans, da omogočite nadaljnjo razširitev okvira JavaBeans.

Ta fižol se izvaja v naslednjih dveh razredih:

  • NumberFieldBean - Glavni razred fižola

  • NumberFieldBeanBeanInfo - Razred informacij o fižolu

Razred NumberFieldBean

The NumberFieldBean class, glavni razred fižolov, je vsebnik AWT, ki doda tri komponente: dve ArrowBean fižol in a TextField. Programski dostop do ArrowBean razred zahteva, da uporabimo mehanizme manipulacije z zrni, ki sem jih omenil pred kratkim.

Trenutna številčna vrednost je izpostavljena kot opazna lastnost. Čeprav je to običajna lastnost, do katere je mogoče dostopati in z njo manipulirati z običajnimi metodami dostopa do fižola, je tudi opazen, tako da se lahko poslušalci registrirajo za obveščanje, kadar koli se spremeni njihova vrednost. Ko uporabnik pritisne tipko Return, ne sprožimo dogodka, čeprav bi bilo to očitno razširitev tega razreda.

javni razred NumberFieldBean razširja vsebnik izvaja ActionListener ... 

Podaljšujemo Zabojnik in izvajati ActionListener da bi prejemali dogodke iz zrn in komponent AWT, ki jih uporabljamo. Podaljšanje Zabojnik namesto bolj tradicionalne Panel pomeni, da ta fižol, kot je ProgressBean fižol je lahka komponenta.

public NumberFieldBean () ... 

Kot fižol moramo zagotoviti javni no-arg konstruktor. Upoštevajte, da ne smemo zagotoviti drugih konstruktorjev za programsko uporabo; to bi bilo v nasprotju z mehanizmom dostopa JavaBeans.

poskusite {dol = (ArrowBean) Beans.instantiate (getClass () .getClassLoader (), "org.merlin.beans.arrow.ArrowBean"); } catch (izjema ex) {ex.printStackTrace (); } 

Tu ustvarimo ArrowBean z uporabo programskega mehanizma za primere fižola. Ne uporabljamo standardne Jave novo operater; namesto tega uporabljamo instantiate () metoda pouka Fižol. Določimo ClassLoader za nalaganje razreda fižola; v tem primeru uporabljamo svojega ClassLoader in popolnoma kvalificirano ime razreda fižola ("org.merlin.beans.arrow.ArrowBean") in oddajte nastalo Predmet v ustrezen razred.

Upoštevajte, da instantiate () metoda lahko povzroči številne izjeme (na primer, če določenega zrna ni bilo mogoče najti). Preprosto ujamemo in prikažemo takšne izjeme, ki se mimogrede ne bi smele pojaviti, če je fižol pravilno nameščen.

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

Tukaj smo oddali ArrowBean do a Komponenta in ga dodajte kot običajno Komponenta. Ne uporabljamo standarda (Komponenta) mehanizem za vlivanje vrst in ne uporabljamo dejstva, da je naš AlarmBean je podrazred Komponenta; namesto tega uporabljamo getInstanceOf () metoda pouka Fižol. Določimo fižol, ki ga želimo uliti, in Razred predmet, na katerega ga želimo oddati (v tem primeru Komponenta.razred).

Čeprav je ta pristop trenutno malo smiseln, bodo prihodnje različice JavaBeans podprle fižol, sestavljen iz več datotek razredov, pa tudi fižol, ki lahko izpostavi različne vidike sebe kot različne razrede. Na primer, fižol se lahko zdi, da podrazvrsti oboje Komponenta in RemoteObject z zagotavljanjem dveh povezanih razredov: a Komponenta in a RemoteObject. Z uporabo mehanizma za vlivanje vrst JavaBeans lahko ustrezen objekt zrna samodejno vrnemo, tako da ima lahko fižol očitno večkratno dedovanje, čeprav Java tega izvorno ne podpira. Za podrobnosti glejte specifikacijo JavaBeans "Glasgow". (Povezava do te specifikacije je na voljo v razdelku Viri tega članka.)

Ta mehanizem dostopa do fižola moramo uporabiti zdaj, da lahko brez težav prehodimo fižol na prihodnje tehnologije JavaBeans.

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

Tu nastavimo ArrowBean uporabljati setDirection () lastnik in addActionListener () način registracije. Te dostopne lastnosti in metode registracije poslušalcev lahko uporabimo neposredno na grahu, ki smo ga pravkar ustvarili; funkcijo ulivanja vrste JavaBeans je treba uporabiti le, ko dostopamo do vidika fižola, ki je podedovan iz drugega razreda.

javna sinhronizirana void setValue (int v) {field.setText (String.valueOf (v)); fireValueChange (getValue ()); } javni sinhronizirani int getValue () ... 

Tu izpostavljamo int lastnine vrednost, kar je vrednost tega polja. Ta lastnost je vidna, zato moramo poslušalce obvestiti o vsaki spremembi. To naredimo tako, da pokličemo našega fireValueChange () metoda.

javna void setColumns (int c) ... javna int getColumns () ... javno sinhronizirana void setMinimum (int m) ... public int getMinimum () ... javna sinhronizirana void setMaximum (int m) ... public int getMaximum () ... javna sinhronizirana void setStep (int s) ... public int getStep () ... 

Tu izpostavljamo int lastnosti stolpci, najmanj, največ, in korak, ki so število stolpcev, prikazanih v TextField, najmanjše in največje vrednosti, ki jih mora imeti to polje, in znesek, za katerega naj puščični gumbi spremenijo vrednost. Teh lastnosti ni mogoče opaziti.

Upoštevajte, da za zagotovitev varnosti niti uporabljamo sinhronizacijo, kjer je to primerno.

javno sinhronizirano void actionPerformed (ActionEvent e) {int vrednost = getValue (); if (e.getSource () == navzdol) {if (vrednost> najmanj) {vrednost = (vrednost - korak> vrednost)? najmanj: objemka (vrednost - korak); setValue (vrednost); }} ... 
$config[zx-auto] not found$config[zx-overlay] not found