JavaBeans 規範提供三大擴充機制讓開發者在建構工具 (如 IDE 視覺化設計器) 中豐富元件行為:客製化器、屬性編輯器、BeanInfo。這些類別隨 Bean 封裝在 JAR 中,供設計工具發現並使用。
實作 java.beans.Customizer 介面,繼承 java.awt.Component (通常為 Panel),提供自訂 UI 讓使用者一次設定多個屬性或執行複雜操作。
public class OurButtonCustomizer extends Panel implements Customizer {
private PropertyChangeSupport changes = new PropertyChangeSupport(this);
// 設計工具呼叫以註冊屬性變更監聽
public void addPropertyChangeListener(PropertyChangeListener l) {
changes.addPropertyChangeListener(l);
}
public void removePropertyChangeListener(PropertyChangeListener l) {
changes.removePropertyChangeListener(l);
}
// 內部 UI 變更時發送事件通知設計工具更新屬性表
private void fireChange(String prop, Object oldVal, Object newVal) {
changes.firePropertyChange(prop, oldVal, newVal);
}
// ... UI 元件初始化與事件處理程式碼
}
在 BeanInfo 中關聯:
beanInfo.setBeanDescriptor(new BeanDescriptor(BeanClass.class, OurButtonCustomizer.class));
繼承 java.beans.PropertyEditorSupport,為特定屬性型別提供自訂編輯方式 (下拉選單、顏色選擇器、文字驗證等)。
public class MoleculeNameEditor extends PropertyEditorSupport {
private static final String[] TAGS = {
"HyaluronicAcid", "Benzene", "Buckminsterfullerene",
"Cyclohexane", "Ethane", "Water"
};
@Override
public String[] getTags() { return TAGS; } // 設計工具顯示下拉選單
@Override
public void setAsText(String text) throws IllegalArgumentException {
// 驗證輸入是否在合法清單中
for (String tag : TAGS) if (tag.equals(text)) { setValue(text); return; }
throw new IllegalArgumentException("Invalid molecule: " + text);
}
}
繼承 SimpleBeanInfo,覆寫方法描述屬性、事件、方法、圖示等。
public class MoleculeBeanInfo extends SimpleBeanInfo {
@Override
public PropertyDescriptor[] getPropertyDescriptors() {
try {
PropertyDescriptor pd = new PropertyDescriptor("moleculeName", Molecule.class);
pd.setPropertyEditorClass(MoleculeNameEditor.class); // 關聯屬性編輯器
pd.setDisplayName("分子名稱"); // 設計工具顯示名
pd.setShortDescription("選擇一個分子"); // 工具提示
return new PropertyDescriptor[]{pd};
} catch (IntrospectionException e) {
return super.getPropertyDescriptors();
}
}
@Override
public Image getIcon(int iconKind) {
// 返回 16x16 或 32x32 圖示
return loadImage("molecule.gif");
}
}
命名慣例:Bean類別名 + BeanInfo (如 MoleculeBeanInfo),放在同一套件下,設計工具自動發現。
實作 java.io.Serializable,所有非 transient/static 欄位自動序列化。版本演進注意:
serialVersionUID)// Manifest.mf
Name: Molecule.class
Java-Bean: True
Name: MoleculeNameEditor.class
Java-Bean: False
Name: MoleculeBeanInfo.class
Java-Bean: False
// 打包指令
jar cvfm Molecule.jar Manifest.mf *.class *.gif
Java-Bean: True 標示為可視元件,設計工具才會列入元件調色盤。