首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2EE

JavaBeans 進階開發:客製化器、屬性編輯器與 BeanInfo 完整指南

     編輯:J2EE

前言

JavaBeans 規範提供三大擴充機制讓開發者在建構工具 (如 IDE 視覺化設計器) 中豐富元件行為:客製化器、屬性編輯器、BeanInfo。這些類別隨 Bean 封裝在 JAR 中,供設計工具發現並使用。

1. 客製化器

實作 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));

2. 屬性編輯器

繼承 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);
    }
}

3. BeanInfo - 元件中繼資料中心

繼承 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),放在同一套件下,設計工具自動發現。

4. JavaBeans 持久化

實作 java.io.Serializable,所有非 transient/static 欄位自動序列化。版本演進注意:

  • 新增欄位、修改存取修飾子、移除其他類別引用 → 相容
  • 刪除欄位、改變欄位在類別階層位置、修改 transient/static 屬性 → 不相容 (需管理 serialVersionUID)

5. 封裝部署 (JAR + Manifest)

// 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 標示為可視元件,設計工具才會列入元件調色盤。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved