JavaBeans用戶化
JavaBeans開發者可以給一個Beans添加用戶化器(Customizer)、屬性編輯器(PropertyEditor)和BeansInfo接口來描述一個Beans的內容,Beans的使用者可在構造環境中通過與Beans附帶在一起的這些信息來用戶化Beans的外觀和應做的動作。一個Beans不必都有BeansCustomizer、PrpertyEditor和BeansInfo,根據實際情況,這些是可選的,當有些Beans較復雜時,就要提供這些信息,以Wizard的方式使Beans的使用者能夠用戶化一個Beans。有些簡單的Beans可能這些信息都沒有,則構造工具可使用自帶的透視裝置,透視出Beans的內容,並把信息顯示到標准的屬性表或事件表中供使用者用戶化Beans,前幾節提到的Beans的屬性、方法和事件名要以一定的格式命名,主要的作用就是供開發工具對Beans進行透視。當然也是給程序員在手寫程序中使用Beans提供方便,使他能觀其名、知其意。
用戶化器接口(Customizer Interface)
當一個Beans有了自己的用戶化器時,在構造工具內就可展現出自己的屬性表。在定義用戶化器時必須要實現Java.Beanss.Customizer接口。例如,下面是一個"按鈕"Beans的用戶化一器:
public class OurButtonCustomizer
extends Panel implements Customizer {
... ...
/*當實現象OurButtonCustomizer這樣的常規屬性表時,
一定要在其中實現addProperChangeListener
和removePropertyChangeListener,這樣,
構造工具可用這些功能代碼為屬性事件添加監聽者。*/
... ...
private PropertyChangeSupport changes=new PropertyChangeSupport(this);
public void addPropertyChangeListener(PropertyChangeListener l) {
changes.addPropertyChangeListener(l);
public void removePropertyChangeListener(PropertyChangeListener l) {
changes.removePropertyChangeListener(l);
}
... ...
屬性編輯器接口(PropertyEditor Interface)
一個JavaBeans可提供PropertyEditor類,為指定的屬性創建一個編輯器。這個類必須繼承自Java.Beanss.PropertyEditorSupport類。構造工具與手寫代碼的程序員不直接使用這個類,而是在下一小節的BeansInfo中實例化並調用這個類。例:
public class MoleculeNameEditor extends Java.Beanss.PropertyEditorSupport {
public String[] getTags() {
String resule[]={
"HyaluronicAcid","Benzene","buckmisterfullerine",
"cyclohexane","ethane","water"};
return resule;}
}
上例中是為Tags屬性創建了屬性編輯器,在構造工具內,可從下拉表格中選擇MoleculeName的屬性應是"HyaluronicAid"或是"water"。
BeansInfo接口
每個Beans類也可能有與之相關的BeansInfo類,在其中描述了這個Beans在構造工具內出現時的外觀。BeansInfo中可定義屬性、方法、事件,顯示它們的名稱,提供簡單的幫助說明。 例如:
public class MoleculeBeansInfo extends SimpleBeansInfo {
public PropertyDescriptor[] getPropertyDescriptors() {
try {
PropertyDescriptor pd=new PropertyDescriptor("moleculeName",Molecule.class);
/*通過pd引用了上一節的MoleculeNameEditor類,取得並返回moleculeName屬性*/
pd.setPropertyEditorClass(MoleculeNameEditor.class);
PropertyDescriptor result[]={pd};
return result;
} catch(Exception ex) {
System.err.println("MoleculeBeansInfo: unexpected exeption: "+ex);
return null;
}
}
}
JavaBeans持久化
當一個JavaBeans在構造工具內被用戶化,並與其它Beans建立連接之後,它的所有狀態都應當可被保存,下一次被load進構造工具內或在運行時,就應當是上一次修改完的信息。為了能做到這一點,要把Beans的某些字段的信息保存下來,在定義Beans時要使它實現Java.io.Serializable接口。例如:
public class Button
implements Java.io.Serializable {
}
實現了序列化接口的Beans中字段的信息將被自動保存。若不想保存某些字段的信息則可在這些字段前冠以transient或static關鍵字,transient和static變量的信息是不可被保存的。通常,一個Beans所有公開出來的屬性都應當是被保存的,也可有選擇地保存內部狀態。 Beans開發者在修改軟件時,可以添加字段,移走對其它類的引用,改變一個字段的private/protected/public狀態,這些都不影響類的存儲結構關系。然而,當從類中刪除一個字段,改變一個變量在類體系中的位置,把某個字段改成transient/static,或原來是transIEnt/static,現改為別的特性時,都將引起存儲關系的變化。
JavaBeans的存儲格式
JavaBeans組件被設計出來後,一般是以擴展名為jar的Zip格式文件存儲,在jar中包含與JavaBeans有關的信息,並以MANIFEST文件指定其中的哪些類是JavaBeans。以jar文件存儲的JavaBeans在網絡中傳送時極大地減少了數據的傳輸數量,並把JavaBeans運行時所需要的一些資源捆綁在一起,本章主要論述了JavaBeans的一些內部特性及其常規設計方法,參考的是JavaBeans規范1.0A版本。隨著世界各大ISV對JavaBeans越來越多的支持,規范在一些細節上還在不斷演化,但基本框架不會再有大的變動。