Šajā īsajā sērijā mēs pārbaudām JavaBeans programmatūras komponentu attīstību. Galu galā ar lielāko daļu pupiņu tiks manipulēts pupiņu attīstības vidē; tomēr šeit mēs rūpējamies tikai par ietvara avota līmeņa aspektiem. JavaBeans izstrādes priekšrocības, tas ir, izstrāde atbilstoši JavaBeans specifikācijai, ir vairākas, tostarp:
Pupas var viegli manipulēt vizuālās izstrādes vidēs lietotājiem, kuriem nav jābūt tehniskām prasmēm avota līmeņa Java izstrādē.
Standarta saskarnes dēļ pupiņas ir viegli izplatāmas, kas ļauj trešo pušu komponentus vieglāk integrēt attīstības centienos.
- Izstrādātāji var viegli pārsūtīt vienam projektam izstrādāto kodu atkārtoti lietojamā komponentu bibliotēkā, kurai var piekļūt turpmākajos attīstības centienos.
Vētras acs
Iekš
šīs sērijas pirmā daļa
, mēs izstrādājām divas vienkāršas pupiņas: nevizuālu trauksmes pupiņu un grafisku kreiso bultiņu / labās bultiņas pupiņu. Abi tika papildināti ar vizuālo
pielāgotājs
un
informācija par pupiņām
klases. Pupās, kuras mēs aptveram šajā mēnesī, mēs nenodrošināsim pielāgotājus; tā vietā mēs koncentrēsimies uz esošo pupiņu un sastāvdaļu izmantošanu, lai izveidotu lielākas, labākas pupiņas.
Priekšnoteikumi
Kā divdaļīgas sērijas turpinājums es pieņemšu iepazīties ar jautājumiem, kas tika apspriesti iepriekšējā daļā, ieskaitot papildu rakstus un resursus.
Pupiņas
No šīs sērijas sākuma līdz beigām mēs izstrādājam šādas pupiņas:
Trauksmes pupiņa | Negrafisks pupiņš, kas aktivizē notikumu pēc noteiktas kavēšanās. |
ArrowBean | Grafisks kreisās bultiņas / labās bultiņas pupiņas. |
ProgressBean | Grafiska progresa displeja pupiņa. | |
NumberFieldBean | Grafisks cipars | |
FontChooserBean | Grafiska fontu izvēles pupiņa. Šī pupiņa izmanto pupiņu NumberFieldBean. | |
FontSelectorBean | Grafisks fontu izvēles pupa, kas parāda pašreizējo fontu un nodrošina pogas Labi / Atcelt. Šī pupiņa izmanto FontChooserBean pupiņu. | |
FontDialogBean | Grafiska fontu izvēles pupa, kas uznirst fontu atlasītāju atsevišķā dialoglodziņā. Šī pupiņa izmanto pupiņu FontSelectorBean. |
Mēs apspriedām Trauksmes pupiņa
un ArrowBean
pupas detalizēti pagājušajā mēnesī; šajā epizodē mēs apspriedīsim atlikušās pupiņas dažādās detalizācijas pakāpēs.
Jums var būt jautājums, kāpēc mēs veidojam trīs fontu pupiņas. Galīgais mērķis ir vienkārši izveidot fontu atlasītāja pupiņu, kas uznirst fonta dialoglodziņā, kad lietotājs noklikšķina uz pogas. Šis uzdevums ļoti dabiski tiek sadalīts trīs mūsu izveidotajās pupiņās: pirmais ir lietotāja interfeiss fontu izvēlei, otrais pievieno dialoga vadīklas un fonta paraugu, bet trešais ievada pogu, lai parādītu dialogu, un satur pamata dialoglodziņu apstrādes kods.
Bez pupiņām mums šie izstrādājumi būtu jāattīsta kā specializēti AWT komponenti vai kā viena monolīta klase; izmantojot pupiņas, mēs varam izstrādāt trīs daļas kā neatkarīgas pupiņas, kuras pašas par sevi var izmantot atkārtoti.
Mūsu darbības joma
Tāpat kā ar šīs sērijas pirmo daļu, mēs esam noraizējušies tikai par šo klašu beanismiem, nevis ar faktiskajiem uzgriežņiem un skrūvēm, kas liek tiem atzīmēties. Rezultātā mēs apspriedīsim pupiņas skeleta formā, sarkanā krāsā izceļot fragmentus, kuriem ir īpaša nozīme, un atstājot pārējās detaļas, kuras jūs varat iepazīties brīvajā laikā. Mēs neraizēsimies arī par pielāgotājiem, kurus mēs pietiekami detalizēti aplūkojām, apspriežot pirmās divas pupiņas.
Lai redzētu piespiedu darbu aiz pupiņām, pārbaudiet pilnu pirmkodu.
Pupas ProgressBean veidošana
ProgressBean
ir vienkārša progresa displeja pupiņa. Tas ir pielāgots AWT komponents, kas parāda šīs vērtības procentuālo vērtību un grafisko joslu attēlojumu, kā parādīts attēlā zemāk. Tas atklāj divas īpašības: pašreizējās un maksimālās joslas vērtības.
Pašreizējā vērtība tiek parādīta kā novērojams īpašums. Novērojamās īpašības ir īpašības, kuru izmaiņas var novērot. Novērotāji tiek reģistrēti pupiņā tāpat kā notikumu klausītāji, un viņi tiek informēti par katru īpašuma maiņu. Pupai ir skaidri jānodrošina pupiņu individuālās īpašības; nav iespējams novērot izmaiņas jebkura pupiņu īpašībā.
Šī pupiņa tiek realizēta šādās divās klasēs:
ProgressBean
- galvenā pupiņu klaseProgressBeanBeanInfo
- Pupiņu informācijas klase
Klase ProgressBean
The
ProgressBean
klase ir galvenā pupiņu klase, vienkāršs pielāgots AWT komponents un Java pupiņas.publiskā klase ProgressBean paplašina komponentu ...
Šī pupiņa ir viegla sastāvdaļa, tāpēc mēs pagarinām Komponents
tā vietā Audekls
un sniedz atbilstošu krāsot ()
metodi. Vieglā komponenta ietvars ir efektīvāks par tradicionālo pasūtījuma komponentu ietvaru, un tam nepieciešams mazāk vietējās velmēšanas sistēmas resursu. Kā komponents mēs automātiski pārmantojam JavaBeans pilnvaroto serializējamību un nodrošinām noklusējuma konstruktoru no-arg.
public void setBarground (krāsa c) ... public Color getBarground () ... publiski sinhronizēta void setMaximum (int m) ... public int getMaximum () ...
Šeit mēs atmaskojam Krāsa
īpašums bāra laukums (attēlotās joslas krāsa) un int
īpašums maksimāli (maksimālā joslas vērtība).
publiski sinhronizēta void setValue (int v) {if (vērtība! = v) {vērtība = v; pārkrāsot (); fireValueChange (); }} public int getValue () ...
The int
īpašums vērtība ir novērojams, kas nozīmē, ka mums jāinformē visi ieinteresētie klausītāji ikreiz, kad tā vērtība mainās. Šajā nolūkā mēs saucam par mūsu fireValueChange ()
metodi, lai informētu klausītājus vienmēr setValue ()
tiek saukts.
aizsargātie PropertyChangeSupport klausītāji = new PropertyChangeSupport (šis); public void addPropertyChangeListener (PropertyChangeListener l) {klausītāji.addPropertyChangeListener (l); } public void removePropertyChangeListener (PropertyChangeListener l) {klausītāji.removePropertyChangeListener (l); }
Šeit mēs uzturam to objektu sarakstu, par kuriem ir reģistrēts paziņojums, kad mainās novērojams īpašums. Mēs izmantojam klasi PropertyChangeSupport
no java.pupas
lai saglabātu šo sarakstu. Šīs klases konstruktors pieprasa mums norādīt pupiņu, kas būs īpašuma maiņas notikumu izcelsme; šajā gadījumā tā ir šo
, un tā sniegtās metodes ļauj mums uzturēt sarakstu.
Atklājot metodes addPropertyChangeListener ()
un removePropertyChangeListener ()
, mēs automātiski norādām, ka šai pupai ir novērojamas īpašības. Mēs tomēr nenorādām kas īpašības ir novērojamas. Šī informācija ir atbilstoši jādokumentē kopā ar pupiņu.
aizsargāts vesels skaitlis oValue = jauns vesels skaitlis (vērtība); aizsargāts tukšums fireValueChange () {klausītāji.firePropertyChange ("vērtība", oValue, oValue = jauns Integer (vērtība)); }
Mēs saucam šo metodi, lai informētu klausītājus par izmaiņām mūsu vērtība īpašums; mēs izmantojam firePropertyChange ()
mūsu saraksta metode šī paziņojuma izplatīšanai. Pirmais parametrs ir rekvizīta nosaukums, kuram jāatbilst pakļautā rekvizīta nosaukumam; otrais parametrs ir rekvizīta vecā vērtība; un trešais īpašums ir jaunā vērtība. The PropertyChangeSupport
klase atgriežas neko nedarot, ja vecā un jaunā vērtība ir vienādas.
Klase ProgressBeanBeanInfo
The
ProgressBeanBeanInfo
klase vienkārši apraksta ProgressBean
jebkādu iedzimtu informāciju, kuru mēs vēlamies aizsegt.Pupas NumberFieldBean veidošana
Šī pupiņa ievieš kopēju lietotāja saskarnes komponentu, ritināmā numura ievades lauku - ciparu teksta lauku, kas nodrošina pieauguma un samazināšanas bultiņas, kā parādīts zemāk redzamajā attēlā. Šī pupiņa izvirza svarīgu JavaBeans koncepciju:
programmatiska manipulācija ar pupiņām
.
Programmēta manipulācija ar pupiņām attiecas uz mehānismiem, kurus JavaBeans nodrošina pupiņu programmatiskai izveidošanai un piekļuvei tām. Lai gan ir iespējams piekļūt pupiņām, izmantojot Java Java standarta izveidi (jauns X ()
) un tipa liešanas mehānismi ((Y) x
), ieteicams izmantot paredzētos JavaBeans mehānismus, lai nākotnē varētu paplašināt JavaBeans sistēmu.
Šī pupiņa tiek realizēta šādās divās klasēs:
NumberFieldBean
- galvenā pupiņu klaseNumursFieldBeanBeanInfo
- Pupiņu informācijas klase
Klases numursFieldBean
The NumberFieldBean
klase, galvenā pupiņu klase, ir AWT konteiners, kurā pievienoti trīs komponenti: divi ArrowBean
pupiņas un a TextField
. Programmatiska piekļuve ArrowBean
klase prasa, lai mēs izmantotu pupiņu manipulācijas mehānismus, kurus es minēju pirms brīža.
Pašreizējā skaitliskā vērtība tiek pakļauta kā novērojama īpašība. Lai gan tas ir normāls īpašums, kuram var piekļūt un ar kuru var manipulēt, izmantojot parastās pupiņu piekļuves metodes, tas ir arī novērojams, lai klausītāji varētu reģistrēties, lai saņemtu paziņojumus ikreiz, kad tā vērtība mainās. Mēs neizraidām notikumu, kad lietotājs nospiež Return, lai gan tas būtu acīmredzams šīs klases paplašinājums.
publiskā klase NumberFieldBean pagarina konteineru rīku ActionListener ...
Mēs pagarinām Konteiners
un ieviest ActionListener
lai saņemtu notikumus no mūsu izmantotajām pupiņām un AWT komponentiem. Pagarināšana Konteiners
tradicionālāku vietā Panelis
nozīmē, ka šī pupiņa, tāpat kā ProgressBean
pupas ir viegls komponents.
public NumberFieldBean () ...
Kā pupai mums jānodrošina publisks konstruktors bez arg. Ņemiet vērā, ka mums nav jānodrošina citi konstruktori programmatiskai lietošanai; tas būtu pretrunā ar JavaBeans piekļuves mehānismu.
mēģiniet {uz leju = (ArrowBean) Pupas.instancināt (getClass () .getClassLoader (), "org.merlin.beans.arrow.ArrowBean"); } catch (izņēmums ex) {ex.printStackTrace (); }
Šeit mēs izveidojam ArrowBean
izmantojot programmatisko pupiņu instantiation mehānismu. Mēs neizmantojam standarta Java jauns
operators; tā vietā mēs izmantojam instantiate ()
klases metode Pupiņas
. Mēs precizējam ClassLoader
izmantot pupiņu klases iekraušanai; šajā gadījumā mēs izmantojam savu ClassLoader
un pilnībā kvalificēts pupiņu klases nosaukums ("org.merlin.beans.arrow.ArrowBean"
), un izliet iegūto Objekts
uz atbilstošo klasi.
Ņemiet vērā, ka instantiate ()
metode var radīt dažādus izņēmumus (piemēram, ja norādīto pupiņu nevarēja atrast). Mēs vienkārši noķeram un parādām jebkādus šādus izņēmumus, kuriem, starp citu, nevajadzētu rasties, ja pupiņa ir atbilstoši uzstādīta.
pievienot ("East", (Component) Beans.getInstanceOf (uz leju, Component.class));
Lūk, mēs iemetām ArrowBean
uz a Komponents
un pievienojiet to kā parasti Komponents
. Mēs neizmantojam standartu (Komponents)
tipa liešanas mehānismu, un mēs neizmantojam faktu, ka mūsu Trauksmes pupiņa
ir apakšklase Komponents
; tā vietā mēs izmantojam getInstanceOf ()
klases metode Pupiņas
. Mēs norādām pupiņu, kuru vēlamies izmest, un Klase
objektu, uz kuru mēs to vēlamies nodot (šajā gadījumā Komponents.klase
).
Lai gan šai pieejai šobrīd nav lielas jēgas, nākamās JavaBeans versijas atbalstīs pupiņas, kas sastāv no vairākiem klases failiem, kā arī pupiņas, kas var atmaskot dažādus aspektus kā dažādas klases. Piemēram, pupas var šķist abas apakšklases Komponents
un RemoteObject
nodrošinot divas saistītās klases: a Komponents
un a RemoteObject
. Izmantojot JavaBeans tipa liešanas mehānismu, atbilstošo pupiņu objektu var automātiski atgriezt, tāpēc pupiņām var būt acīmredzama vairākkārtēja mantošana, kaut arī Java to natīvi neatbalsta. Lai iegūtu sīkāku informāciju, skatiet JavaBeans specifikāciju "Glāzgova". (Saite uz šo specifikāciju ir sniegta šī raksta sadaļā Resursi.)
Mums tagad ir jāizmanto šie pupiņu piekļuves mehānismi, lai mēs varētu bez problēmām pāriet uz nākamajām JavaBeans tehnoloģijām.
down.setDirection (ArrowBean.LEFT); down.addActionListener (šis);
Šeit mēs konfigurējam ArrowBean
izmantojot setDirection ()
īpašuma pieņēmējs un addActionListener ()
reģistrācijas metode. Šīs īpašuma piekļuves un klausītāju reģistrēšanas metodes mēs varam izmantot tieši uz tikko izveidotās pupas; JavaBeans tipa liešanas funkcija ir jāizmanto tikai tad, kad mēs piekļūstam pupas aspektam, kas ir mantots no citas klases.
publiski sinhronizēta void setValue (int v) {field.setText (String.valueOf (v)); fireValueChange (getValue ()); } publiski sinhronizēts int getValue () ...
Šeit mēs atmaskojam int
īpašums vērtība, kas ir šī lauka vērtība. Šis īpašums ir novērojams, tāpēc mums par to jāinformē klausītāji, kad tas tiek mainīts. Mēs to darām, piezvanot savējiem fireValueChange ()
metodi.
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 () ... publiski sinhronizēts void setStep (int s) ... public int getStep () ...
Šeit mēs atmaskojam int
īpašības kolonnas, minimums, maksimāli, un solis, kas ir attiecīgi kolonnu skaits, kas parādīts TextField
, minimālās un maksimālās vērtības, kas šim laukam jāsatur, un summa, par kādu bultiņu pogām ir jāmaina vērtība. Šīs īpašības nav novērojamas.
Ņemiet vērā, ka mēs izmantojam sinhronizāciju, lai vajadzības gadījumā nodrošinātu pavedienu drošību.
publiski sinhronizēta void actionPerformed (ActionEvent e) {int value = getValue (); if (e.getSource () == uz leju) {if (vērtība> minimums) {vērtība = (vērtība - solis> vērtība)? minimums: skava (vērtība - solis); setValue (vērtība); }} ...