Programmēšana

Pupiņu šķirnes veidošana: izveidojiet atkārtoti lietojamus JavaBeans komponentus

Š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 TextField pupiņa ar rullīšu pogām. Šī pupiņa izmanto ArrowBean pupiņu.

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 klase

  • ProgressBeanBeanInfo - 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ā Audeklsun 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 klase

  • NumursFieldBeanBeanInfo - 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); }} ... 
$config[zx-auto] not found$config[zx-overlay] not found