MokaByte 61 - Marzo 2002 

Java Beans
La programmazione per componenti in Java
V parte

di
Andrea Gini
Si conclude con questo articolo il corso introduttivo alla specifica Java Beans. Dopo aver analizzato il protocollo di comunicazione tra componenti ed il meccanismo di introspezione, è arrivato il momento di dare un'occhiata alle funzionalità più avanzate previste dalla specifica Java Beans, come il supporto alla personalizzazione o la persistenza.

Personalizzazione dei Bean
L'aspetto e il comportamento di un Bean possono essere personalizzati in fase di composizione all'interno di un Tool grafico abilitato ai Beans. Esistono due strumenti per personalizzare un Bean: gli Editor di Proprietà e i Customizer. Gli Editor di proprietà sono componenti grafici specializzati nell'editing di un particolare tipo di proprietà: interi, Stringhe, Files... Ogni Editor di Proprietà viene associato ad un particolare tipo Java, e il Tool grafico compone automaticamente un Property Sheet analizzando le proprietà di un Bean, e ricorrendo agli Editor più adatti alla circostanza. In Figura 1 si può vedere un esempio di property sheet, realizzato dal Bean Box: ogni riga presenta, accanto al nome della proprietà, il relativo Editor.


Figura 1 - Un Property Sheet generato in modo automatico
a partire
dalle proprietà di un pulsante Bean

Un Customizer, d'altra parte, è un pannello di controllo specializzato per un particolare Bean: in questo caso è il programmatore a decidere cosa mostrare nel pannello e in quale maniera. Per questa ragione un Customizer viene associato, grazie al BeanInfo, ad un particolare Bean e non può, in linea di massima, essere usato su Bean differenti.

 

Come creare un Editor di Proprietà
Un Editor di Proprietà deve implementare l'interfaccia PropertyEditor, o in alternativa, estendere la classe PropertyEditorSupport che fornisce un'implementazione standard dei metodi dell'interfaccia. L'interfaccia PropertyEditor dispone di metodi che premettono di specificare come una proprietà debba essere rappresentata in un property sheet. Alcuni Editor consistono in uno strumento direttamente editabile, altri presentano uno strumento a scelta multipla, come un ComboBox; altri ancora, per permettere la modifica, aprono un pannello separato, come nella proprietà 'font' dell'esempio, che viene modificata grazie al pannello ausiliario FontEditor.



Figura 2
- Il Property Sheet relativo ad un pulsante Bean.
Si noti il pannello ausiliario FontEditor

Per fornire il supporto a queste modalità di editing, bisogna implementare alcuni metodi di PropertyEditor, in modo che ritornino valori non nulli.
I valori numerici o String possono implementare il metodo setAsText(String s), che estrae il valore della proprietà dalla stringa che costituisce il parametro. Questo sistema permette di inserire una proprietà con un normale campo di testo.

Gli Editor standard per le proprietà Color e Font usano un pannello separato, e ricorrono al Property Sheet solamente per mostrare l'impostazione corrente. Clickando sul valore, viene aperto l'Editor vero e proprio. Per mostrare il valore corrente della proprietà, è necessario sovrascrivere il metodo isPaintable() in modo che restituisca true, e sovrascrivere paintValue in modo che dipinga la proprietà attuale in un rettangolo all'interno del Property Sheet.

Per supportare l'Editor di Proprietà personalizzato, bisogna sovrascrivere altri due metodi della classe PropertyEditorSupport: supportsCustomEditor, che in questo caso deve restituire true, e getCustomEditor, in modo che restituisca un'istanza dell'Editor.

 

Registrare gli Editor
I PropertyEditor vengono associati alle proprietà attraverso un'associazione esplicita, all'interno del metodo getPropertyDescriptors() del BeanInfo, con una chiamata al metodo setPropertyEditorClass(Class propertyEditorClass) del PropertyDescriptor corrispondente, come avviene nel Bean Molecule:

PropertyDescriptor pd =
new PropertyDescriptor("moleculeName",Molecule.class);
pd.setPropertyEditorClass(MoleculeNameEditor.class);

MoleculePropertyEditor.gif:
Fgura 8 - Il Bean Molecule associa alla proprietà "moleculeName" di un Editor di Proprietà personalizzato

In alternativa si può registrare l'Editor con il seguente metodo statico:

PropertyEditorManager.registerEditor(Class targetType,Class editorType)

che richiede come parametri la classe che specifica il tipo e quella che specifica l'Editor.

 

Customizers
Con un Bean Customizer è possibile fornire un controllo completo su come configurare ed editare un Bean. Un Customizer è in pratica una piccola applicazione specializzata nell'editing di un particolare Bean. Ogni volta che la configurazione di un Bean richiede modalità troppo sofisticate per il normale processo di creazione automatica del Property Sheet.
Le uniche regole a cui ci si deve attenere per realizzare un Customizator sono:

  • Un Customizator deve estendere la classe Component, o una delle sue sottoclassi
  • Deve implementare l'interfaccia java.bean.Customizer
  • Deve implementare un costruttore privo di parametri

Per associare il Customizer al proprio Bean, bisogna sovrascrivere il meotodo getBeanDescriptor nella classe BeanInfo, in modo che restituisca un opportuno BeanDescriptor, il quale a sua volta dovrà restituire la classe del Customizer alla chiamata del metodo getCustomizerClass.

 

Serializzazione
Per rendere serializzabile una classe Bean è di norma sufficiente implementare l'interfaccia Serializable, sfruttando così l'Object Serialization di Java. L'interfaccia Serializable non contiene metodi: essa viene usata dal compilatore per marcare le classi che possono essere serializzate. Esistono solo poche regole per implementare classi Serializable: anzitutto è necessario dichiarare un costruttore privo di argomenti, che verrà chiamato quando l'oggetto verrà ricostruito a partire da un file .ser; in secondo luogo una classe serializzabile deve definire al suo interno solamente attributi serializzabili.
Se si desidera fare in modo che un particolare attributo non venga salvato al momento della serializzazione, si può ricorrere al modificatore transient. La serializzazione standard, inoltre, non salva lo stato delle variabili static.
Per tutti i casi in cui la serializzazione standard non risultasse applicabile, occorre procedere all'implementazione dell'interfaccia Externalizable, fornendo, attraverso i metodi readExternal(ObjectInput in) e writeExternal(ObjectOutput out), delle istruzioni esplicite su come salvare lo stato di un oggetto su uno stream e come ripristinarlo in un secondo tempo.

 

Conclusioni
Con questo articolo termina il corso introduttivo alla specifica Java Beans. A più di cinque anni dalla sua introduzione, Java Beans ha dimostrato di essere una ottima tecnologia per lo sviluppo di software componibile a basso costo, come testimoniano numerose success stories. Chi volesse approfondire il tema, può trovare un ottimo punto di partenza nel sito della Sun Microsystem, al linsk http://java.sun.com/products/javabeans

MokaByte® è un marchio registrato da MokaByte s.r.l. 
Java®, Jini® e tutti i nomi derivati sono marchi registrati da Sun Microsystems.
Tutti i diritti riservati. E' vietata la riproduzione anche parziale.
Per comunicazioni inviare una mail a info@mokabyte.it