本教程是为JDK 8编写的。本页中描述的示例和实践不利用后续版本中引入的改进,并且可能使用已不再可用的技术。
有关Java SE 9及其后续版本中更新的语言功能的摘要,请参阅Java语言更改。
有关所有JDK版本的新功能、增强功能和已删除或已弃用选项的信息,请参阅JDK发行说明。
自定义提供了一种修改bean在应用程序构建器中外观和行为的方式,以满足您的特定需求。有几个级别的自定义可供bean开发人员使用,以使其他开发人员从bean的潜在功能中获得最大的利益。
以下链接对于学习属性编辑器和定制器非常有用:
在符合bean的构建工具中,可以在设计时自定义bean的外观和行为。有两种方法可以自定义bean:
属性编辑器是用于自定义特定属性类型的工具。属性编辑器在属性窗口中激活。该窗口确定属性的类型,搜索相关的属性编辑器,并以相关方式显示属性的当前值。
属性编辑器必须实现PropertyEditor
接口,该接口提供了指定如何在属性表中显示属性的方法。下图表示属性窗口中包含myBean1
属性:
您可以通过点击属性条目来开始编辑这些属性。点击大多数条目将会弹出单独的面板。例如,要设置foreground
或background
,可以使用带有颜色选择的选择框,或者按下“…”按钮来使用标准的ColorEditor窗口。点击toolTipText
属性将会打开一个StringEditor窗口。
支持类PropertyEditorSupport
提供了PropertyEditor
接口的默认实现。通过从PropertyEditorSupport
派生您的属性编辑器,您可以简单地重写所需的方法。
要在属性窗口中显示当前属性值“示例”,需要重写isPaintable
以返回true
。然后,您必须重写paintValue
以在属性表中的矩形中绘制当前属性值。这是ColorEditor
实现paintValue
的方式:
public void paintValue(java.awt.Graphics gfx, java.awt.Rectangle box) { Color oldColor = gfx.getColor(); gfx.setColor(Color.black); gfx.drawRect(box.x, box.y, box.width-3, box.height-3); gfx.setColor(color); gfx.fillRect(box.x+1, box.y+1, box.width-4, box.height-4); gfx.setColor(oldColor); }
为了支持自定义属性编辑器,还需要重写另外两个方法。重写supportsCustomEditor
以返回true
,然后重写getCustomEditor
以返回自定义编辑器实例。ColorEditor.getCustomEditor
返回this
。
此外,PropertyEditorSupport
类维护一个PropertyChangeListener
列表,并在绑定属性发生更改时向这些监听器触发属性更改事件通知。
属性编辑器是通过以下方式发现并与给定属性关联:
BeanInfo
对象的显式关联。使用以下代码行设置标题属性的编辑器:
pd.setPropertyEditorClass(TitleEditor.class);
java.beans.PropertyEditorManager.registerEditor
方法的显式注册。此方法接受两个参数:bean类类型和要与该类型关联的编辑器类。PropertyEditorManager
会按照以下方式搜索该类的属性编辑器:
my.package.ComplexNumber
类,属性编辑器管理器会搜索my.package.ComplexNumberEditor
类。您已经了解到构建工具提供了支持,使您能够创建自己的属性编辑器。对于复杂的、工业级的bean,可视化构建工具还应满足哪些需求?通常,将一个bean的所有属性都显示在单个(有时是巨大的)属性表上是不可取的。如果有一个单一的根选择决定了bean类型的一半属性都是无关的呢?JavaBeans规范提供了用户定义的定制器,通过它可以为bean属性定义比属性编辑器更高级别的定制。
当您使用一个自定义器(Customizer)时,您完全控制如何配置或编辑一个bean。自定义器是一个专门针对bean定制的应用程序。有时,属性不足以表示一个bean的可配置属性。当需要复杂的指令来更改一个bean,并且属性编辑器过于简单以实现bean的定制时,就会使用自定义器。
所有自定义器必须满足以下条件:
java.awt.Component
或其子类。java.beans.Customizer
接口,这意味着实现注册PropertyChangeListener
对象的方法,并在目标bean发生更改时向这些监听器发送属性更改事件。BeanInfo.getBeanDescriptor
将自定义器与目标类关联。