定制程序是一个附加的对话框,用户可以启动该对话框来更改 Java bean 属性。您可以创建定制程序类来对添加至 Visual Editor 的 Java bean 的属性进行编辑。
定制程序类应实现接口 java.beans.Customizer,并且还应为 java.awt.Component 的子类。通常,定制程序是一个容器(如 java.awt.Panel 或 javax.swing.JPanel),它包含允许您查看并处理 Java bean 的属性的控件。当从工具栏按钮启动定制程序时,它驻留在具有确定和取消按钮的对话框内。
当用户打开定制程序时,作为方法 public void setObject(Object bean); 的一部分,将向该定制程序提供它正在定制的 Java bean。这样,该定制程序就能够直接对自变量进行更改。
java.beans.Customizer 接口还具有方法 public void addPropertyChangeListener(PropertyChangeListener listener) 和 public void removePropertyChangeListener(PropertyChangeListener listener)。Visual Editor 将把它自已作为定制程序上的侦听器添加,并且,如果定制程序要刷新“设计”视图中 Java bean 的外观,它应该通过使用带有任何自变量集的任何 firePropertyChange(... 方法调用其侦听器来对属性更改发出信号。
当用户单击确定时,Visual Editor 将尝试确定定制程序对 Java bean 进行了哪些更改,以便它可以更新 Java 源代码。为此,Visual Editor 在定制程序启动之前复制所有 Java bean 的属性,然后在定制程序关闭时将它们与属性作比较。如果有任何属性不相同(对于 equals 方法返回 false),则确定该属性已被更改。为了确定属性的 set 方法的自变量,创建了 java.beans.PropertyDescriptor 的属性编辑器。然后,通过 public void setValue(Object) 和 public String getJavaInitializationString(); 来调用该编辑器。同样,当您单击取消时,由于定制程序已经更改了 Java bean,所以 Visual Editor 将查询属性集并重置任何与其初始状态不同的属性。
如果定制程序是不需要在对话框中运行的顶级 shell(如 java.awt.Frame 或 javax.swing.JFrame),则 Visual Editor 将按原样运行该定制程序。因为这种类型的定制程序负责它自已的按钮组,并且 Visual Editor 无法知道是取消了还是确认了它,所以,每当关闭定制程序时,都将查询顶级属性以了解它们是否已被更改。因此,如果定制程序执行取消操作,它就必须这样做,从而确保将 Java bean 的属性复原为它们的初始状态。
在编写定制程序之后,需要在 Java bean 的 BeanInfo 类的 bean 描述符上设置它:
public class MyClassBeanInfo extends SimpleBeanInfo { public BeanDescriptor getBeanDescriptor() { return new BeanDescriptor(MyClass.class, MyCustomizer.class); } }