在桌面应用程序中绑定 Bean 和数据
本指南介绍了 NetBeans IDE 对 Java 桌面应用程序中 Bean 绑定和数据绑定的支持。
目录

要完成本教程,您需要具备以下软件和资源。
简介:NetBeans IDE 中的 Bean 绑定
在发布 Bean 绑定库之前,将 UI 组件连接到数据库或将组件属性的值保持同步非常麻烦。例如,将标准数据库中的数据显示在 JTable 中需要手动创建实用程序类来处理数据库与 JTable 之间的连接。而且让不同 Bean 属性的值保持同步(如呈现可视 Bean 的 JTextField 值)需要手动编码侦听程序和事件处理程序。
Bean 绑定库对所有这些操作进行了简化和标准化。只需编写几行代码确定哪些组件的哪些属性需要保持同步,Bean 绑定库就可以处理其余的操作。在 NetBeans IDE 中,Bean 绑定功能集成在 GUI 生成器中,因此,在建立可视设计之后可以快速获取已编码应用程序的行为。
本指南概述了 IDE 中 Bean 绑定的主要功能。有关这些功能的许多具体示例,可以尝试构建 Java 桌面数据库应用程序和创建定制 Java 桌面数据库应用程序教程。
将属性绑定到其他属性
就最基本的用途而言,Bean 绑定是一种不使用事件侦听和处理代码连接 Bean 属性的方法。
为了说明 Bean 绑定的概念以及 IDE 如何支持该绑定,我们将举一个简单的示例,其中用户可以调整滑块来更改文本字段中的数值。
设置示例:
- 在 IDE 中,选择“文件”>“新建项目”。
- 选择 "Java" 类别,然后选择“Java 应用程序”模板。单击“下一步”。
- 在向导的“名称和位置”页中,执行以下操作:
- 键入 NumberSlider 作为项目名称。
- 将“使用专用文件夹存储库”复选框保留为未选中状态。(如果使用的是 NetBeans IDE 6.0,则此选项不可用。)
- 将“设置为主项目”复选框保留为选中状态。
- 清除“创建主类”复选框。

- 单击“完成”退出向导并设置项目。
- 在“项目”窗口中,右键单击 NumberSlider 项目节点并选择“新建”>“JFrame 窗体”。
(如果“JFrame 窗体”在“新建”菜单中不可用,则选择“其他”。然后在“新建文件”向导中,选择“Swing GUI 窗体”类别,然后选择“JFrame 窗体”模板。)
- 在向导的“名称和位置”页中,执行以下操作:
- 为类名键入 NumberSliderFrame。
- 为包名键入 numberslider。

- 单击“完成”退出向导并创建窗体。
NumberSliderForm.java 应以设计模式在编辑区域中打开。
- 从组件面板的“Swing 控件”部分,将一个滑块组件拖到设计区域。(如果“组件面板”窗口未打开,请选择“窗口”>“组件面板”。)
- 从组件面板中,将一个文本字段组件拖到设计区域。
生成的窗体可能类似于下面的屏幕快照。不过,对于本示例而言,定位并不重要。

源和目标
现在我们已经设置了该示例,下面可以创建绑定了。不过,我们首先需要确定哪个组件作为绑定的源,哪个组件作为绑定的目标。绑定源组件表示绑定属性值的来源。
在 GUI 编辑器中进行绑定时,开始先进行目标绑定,然后在“绑定”对话框中声明绑定源。
在本例中,由于 JSlider 附带一个缺省值范围,因此我们将使用它作为源。
注意:绑定可以是双向的(读/写),这样,在目标中所做的更改可以自动地反映在源中。但是,初始绑定方向始终从源到目标。请参见高级绑定配置一节中有关“更新模式”的信息。
将滑块绑定到文本字段:
- 右键单击文本字段组件,并选择“绑定”> "text" 以打开“绑定”对话框。
- 从“绑定源”组合框中,选择 jSlider1。
- 从“绑定表达式”组合框中,选择 value int,如下图所示。

- 单击“确定”。
刚才将滑块的 value Bean 属性绑定到了文本字段的 text 值。
在设计区域,文本字段应显示值 50。此值说明滑块处于中间位置,并且滑块的缺省值范围为 0 到 100。
现在可以运行该应用程序并查看工作中的绑定。
运行项目:
- 选择“运行”>“运行主项目”。
- 在“运行项目”对话框中,单击“确定”接受 numberslider.NumberSliderForm 作为主类。
应用程序应在单独的窗口中启动。在运行的应用程序中调整滑块,并查看文本字段中值的更改。
绑定定制 Bean
在上一节中,您绑定了从组件面板添加到窗体的两个标准 Swing 组件的属性。还可以绑定其他 Bean 的属性。不过,要执行此操作,您需要执行一些步骤,让 IDE 用于生成绑定代码的功能使该 Bean 可用。可以采取以下任一方法使 IDE 的绑定功能可用于 Bean:
- 将 Bean 添加到组件面板,以便可以像添加标准 Swing 组件那样将其添加到窗体。
- 将 Bean 类添加到您的项目并编译该 Bean。
将 Bean 添加到“组件面板”窗口:
- 确保编译了 Bean。
- 选择“工具”>“组件面板”>“Swing/AWT 组件”。
- 如果要为 Bean 创建新的组件面板类别,请在添加 Bean 之前单击“新建类别”,然后输入所需的名称。
- 单击“从 JAR 添加”、“从库添加”或“从项目添加”,完成添加 Bean 的向导操作。
从项目添加 Bean:
- 在“项目”窗口中,右键单击 Bean 的节点并选择“编译文件”。
- 将 Bean 拖到窗体。
然后您应在“检查器”窗口中看到此 Bean。接着可以为该 Bean 的任何属性调用“绑定”对话框。
高级绑定配置
本教程第一节中的示例介绍了与某些缺省行为的简单绑定。但是,有时您可能希望或需要以不同方式配置绑定。如果是这种情况,则可以使用“绑定”对话框的“高级”标签。
该对话框的“高级”标签中包含以下字段:
- 名称。用于创建绑定的名称,这为管理绑定提供了更大的灵活性。该名称将添加到绑定的构造函数中,可使用绑定的 getName() 方法来引用它。
- 更新模式。指定属性保持同步的方式。 可能的值为:
- 始终同步(读/写)。每当对源和目标中的任一项进行更改时,另一项也随之更新。
- 只能从源中读取(只读)。仅在第一次设置源值时更新目标。将在目标中更新对源所做的更改。不会在源中更新对目标所做的更改。
- 从源中读取一次(读取一次)。仅在最初绑定源和目标时更新目标。
- 更新源的时间(仅在绑定 JTextField 和 JTextArea 组件的 text 属性时才出现此选项)。用于选择同步属性的频率。
- 忽略调整(仅在绑定 JSlider 的 value 属性、JTable 和 JList 的 selectedElement 属性以及 JTable 和 JList 的 selectedElements 属性时才出现此选项)。 如果选中此复选框,则只有在用户完成更改后,才会将某一属性的任意更改应用到另一个属性中。例如,当应用程序用户拖动滑块时,只有在用户松开鼠标按钮后,才会更新滑块的 value 属性所绑定的属性值。
- 转换器。如果绑定涉及的属性具有不同的数据类型,则可以指定代码用来转换这些类型之间的值。 Bean 绑定库可处理很多常用转换,但对于其他属性类型的组合,则可能需要提供您自己的转换器。 此类转换器需要扩展 org.jdesktop.beansbinding.Converter 类。
“转换器”下拉列表中填充了已作为 Bean 添加到窗体中的任何转换器。还可以使用以下方法直接添加转换代码:单击省略号 (...) 按钮,然后从“使用以下内容选择转换器属性”下拉列表中选择“定制代码”。
下面列出了不需要提供转换器的转换:
- 将 BigDecimal 转换为字符串型,将字符串型转换为 BigDecimal
- 将 BigInteger 转换为字符串型,将字符串型转换为 BigInteger
- 将布尔型转换为字符串型,将字符串型转换为布尔型
- 将字节型转换为字符串型,将字符串型转换为字节型
- 将字符型转换为字符串型,将字符串型转换为字符型
- 将双精度型转换为字符串型,将字符串型转换为双精度型
- 将浮点型转换为字符串型,将字符串型转换为浮点型
- 将整型转换为字符串型,将字符串型转换为整型
- 将长整型转换为字符串型,将字符串型转换为 BigDecimal
- 将短整型转换为字符串型,将字符串型转换为短整型
- 将整型转换为布尔型,将布尔型转换为整型
- 验证器。用于指定代码以验证目标属性值中的更改,然后再将更改应用到源属性中。例如,您可以使用验证器确保整型属性值在指定的范围内。
验证器需要扩展 org.jdesktop.beansbinding.Validator 类。
“验证器”下拉列表中填充了已作为 Bean 添加到窗体中的任何验证器。还可以使用以下方法直接添加验证代码:单击省略号 (...) 按钮,然后从“使用以下内容选择验证器属性”下拉列表中选择“定制代码”。
- Null 源值。在尝试进行绑定时,如果源属性的值为 null,则可以指定要使用的其他值。 该字段与 org.jdesktop.beansbinding.Binding 类的 setSourceNullValue() 方法相对应。
- 无法读取源值。在尝试进行绑定时,如果无法解析绑定表达式,则可以指定要使用的其他值。 该字段与 org.jdesktop.beansbinding.Binding 类的 setSourceUnreadableValue() 方法相对应。
注意:为了更好地了解上面提到的类和方法,可以从 IDE 中直接访问 Bean 绑定 Javadoc 文档。选择“帮助”>“Javadoc 引用”>“Bean 绑定”。在打开的浏览器窗口中,单击 org.jdesktop.beansbinding 链接以访问这些类的文档。
将数据绑定到组件
除了同步可视 Swing 组件和其他定制 Bean 的属性之外,还可以使用 Bean 绑定帮助您使用可视组件与数据库交互。在创建新的 Java 窗体并在窗体中添加组件后,您可以生成代码,以便将这些组件绑定到数据上。本节介绍如何将数据绑定到 Swing JTable、JList 和 JComboBox 组件。
在将组件绑定到数据库中的数据之前,您需要完成以下操作:
- 在 IDE 中连接数据库。
- 创建一些类,用于表示要绑定的数据库表。下面介绍了创建实体类以便将数据绑定到组件的步骤。
注意:您还可以使用“新建 Java 桌面应用程序”项目向导快速创建功能完善的应用程序,该应用程序在简单的主视图/详细视图中具有 CRUD(Create, Read, Update, and Delete,创建、读取、更新和删除)功能。有关详细信息,请参见构建 Java 桌面数据库应用程序。
创建实体类
创建实体类以表示要绑定到 JTable 的数据库:
- 在“项目”窗口中,右键单击项目并选择“新建”>“其他”,选择“持久性”类别,然后选择“通过数据库生成实体类”模板。
- 在向导的“数据库表”页中,选择数据库连接。
- 在“可用表”列被填充后,选择要在应用程序中使用的表,然后单击“添加”,以便将表移到“选定的表”列中。单击“下一步”。

- 在向导的“实体类”页中,确保选中了“为持久性字段生成已命名的查询标注”复选框。
- 对生成类的名称及其位置进行任何所需的定制。

- 单击“创建持久性单元”。
- 在“创建持久性单元”对话框中,确保设置了以下内容:
- 选择的持久性库为 TopLink。
- 选择的表生成策略为“无”。

- 单击“完成”。
在“项目”窗口中,您会看到实体类的节点。
将组件绑定到表示数据的 Bean
本节介绍如何将数据绑定到 JTable、JList 和 JComboBox 组件。
将一个数据库表添加到窗体,并自动生成 JTable 以显示数据库表的内容:
- 打开“服务”窗口 (Ctrl-5)。
- 连接到包含您要添加到窗体的表的数据库。(可以通过右键单击用于数据库连接的节点并选择“连接”连接到数据库。)
- 展开用于连接的节点,并展开其表节点。
- 将表节点拖到窗体并在拖动表时按住 Ctrl 键。
这将创建 JTable,并将其列绑定到数据库表中的列。
将数据库表绑定到现有的 JTable 组件:
- 在 GUI 生成器中右键单击该组件,然后选择“绑定”>“元素”。
- 单击“将数据导入到窗体”。在“将数据导入到窗体”对话框中,选择要将组件绑定到的数据库表。单击“确定”。
- 在“绑定源”组合框中,选择表示实体类结果列表的项。例如,如果调用实体类 Customer.java,则列表对象将生成为 customerList。
- 将绑定表达式的值保留为 null。
- 如果不想在 JTable 中显示某些数据库列,请在“选定”列表中选择这些列,然后将它们移到“可用”列表中。
- 选择“高级”标签进一步配置绑定内容。例如,您可以指定验证器或转换器,或者指定绑定源为 null 或不可读时的行为。
- 单击“确定”。
将数据绑定到 JList 组件:
- 在 GUI 生成器中右键单击该组件,然后选择“绑定”>“元素”。
- 单击“将数据导入到窗体”。在“将数据导入到窗体”对话框中,选择要将组件绑定到的数据库表。单击“确定”。
- 在“绑定源”组合框中,选择表示实体类结果列表的项。例如,如果调用实体类 Customer.java,则列表对象将生成为 customerList。
- 将绑定表达式的值保留为 null。
- 在“显示表达式”下拉列表中,选择表示数据库列的属性,该列包含了要在列表中显示的值。
- 选择“高级”标签进一步配置绑定内容。
- 单击“确定”。
将数据绑定到 JComboBox 组件:
- 右键单击组合框并选择“绑定”> "elements"。
- 单击“将数据导入到窗体”。在“将数据导入到窗体”对话框中,选择要将组件绑定到的数据库表。单击“确定”。
- 在“绑定源”组合框中,选择表示实体类结果列表的项。例如,如果调用实体类 Customer.java,则列表对象将生成为 customerList。
- 将绑定表达式的值保留为 null。
- 再次右键单击组合框并选择“绑定”> "selectedItem"。
- 绑定到您希望受用户选择影响的属性。单击“确定”。
Bean 绑定库(从版本 1.2.1 起)没有 DetailBinding 类,该类用于指定如何为 JComboBox 派生 display 值。因此,您需要编写一些定制代码。一种方法是编写定制单元格呈现器,如下所示。
正确呈现组合框:
- 选择组合框。
- 在“属性”窗口的“属性”标签中,选择呈现属性。
- 单击省略号 (...) 按钮。
- 在属性编辑器顶部的组合框中,选择“定制代码”。
- 在文本区域,输入类似于以下内容的代码,其中
jComboBox1 是 JComboBox 实例的名称,MyEntityClass 是实体类,getPropertyFromMyEntityClass() 是绑定的实体类中属性的 getter。
jComboBox1.setRenderer(new DefaultListCellRenderer() {
@Override
public Component getListCellRendererComponent(
JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
if (value instanceof MyEntityClass) {
MyEntityClass mec = (MyEntityClass)value;
setText(mec.getPropertyFromMyEntityClass());
}
return this;
}
})
注意:您还可以在其自身的源文件中创建定制呈现器,编译文件,将呈现器拖到窗体,然后设置组合框的呈现器属性以使用此 Bean。您可以看到在创建定制桌面数据库应用程序教程中使用了此方法。
特殊绑定属性
Bean 绑定库在必要时可为某些 Swing 组件提供特殊合成属性(这些组件本身没有这些属性)。这些属性表示用于绑定到其他属性的内容,如选定的表行。
下面列出了 Bean 绑定库添加的一组合成属性:
| 组件 |
属性 |
描述 |
| AbstractButton |
已选定 |
按钮的选定状态。 |
| JComboBox |
selectedItem |
JComboBox 的选定项。 |
| JSlider |
值 |
JSlider 值;通知所有更改。 |
| value_IGNORE_ADJUSTING |
与 "value" 基本相同,但在滑块调整值时不通知更改。 |
| JList |
selectedElement |
JList 的选定元素;通知所有更改。如果在 JListBinding 中将 JList 作为目标,则会将单个选定元素报告为绑定源列表中的元素。否则,将该选定元素报告为列表模型中的对象。如果未选择任何内容,则该属性的值为 "null"。 |
| selectedElements |
JList 的多个选定元素的列表;通知所有更改。如果在 JListBinding 中将 JList 作为目标,则会将多个选定元素报告为绑定源列表中的元素。否则,将这些选定元素报告为列表模型中的对象。如果未选择任何内容,则该属性的值为空列表。 |
| selectedElement_IGNORE_ADJUSTING |
与 "selectedElement" 基本相同,但在更新列表选定内容时不通知更改。 |
| selectedElements_IGNORE_ADJUSTING |
与 "selectedElements" 基本相同,但在更新列表选定内容时不通知更改。 |
| JTable |
selectedElement |
JTable 的选定元素;通知所有更改。如果在 JTableBinding 中将 JTable 作为目标,则会将选定元素报告为绑定源列表中的元素。否则,将选定元素报告为一个映射,其中,键由字符串 "column" 和列索引组成;值为该列的模型值。例如:{column0=column0value,column1=column1value,...} 如果未选择任何内容,则该属性的值为 "null"。 |
| selectedElements |
JTable 的选定元素的列表;通知所有更改。如果在 JTableBinding 中将 JTable 作为目标,则会将多个选定元素报告为绑定源列表中的元素。否则,将每个选定元素报告为一个映射,其中,键由字符串 "column" 和列索引组成;值为该列的模型值。例如:{column0=column0value, column1=column1value, ...} 如果未选择任何内容,则该属性的值为空列表。 |
| selectedElement_IGNORE_ADJUSTING |
与 "selectedElement" 基本相同,但在更新表选定内容时通知更改。 |
| selectedElements_IGNORE_ADJUSTING |
与 "selectedElements" 基本相同,但在更新表选定内容时不通知更改。 |
| JTextComponent(包括其子类 JTextField、JTextArea 和 JEditorPane) |
文本 |
JTextComponent 的 text 属性;通知所有更改(包括键入内容)。 |
| text_ON_FOCUS_LOST |
JTextComponent 的 text 属性;仅在组件不处于焦点状态时通知更改。 |
| text_ON_ACTION_OR_FOCUS_LOST |
JTextComponent 的 text 属性;仅在组件通知 actionPerformed 或组件不处于焦点状态时通知更改。 |
另请参见
有关在 IDE 中使用 Bean 绑定的详细信息,请参见使用 JPA 和 Bean 绑定的最佳实践。
有关使用 IDE 的 GUI 生成器的更一般性介绍,请参见生成 GUI 应用程序简介。
有关在 IDE 中使用 Bean 绑定功能的具体示例,请参见构建 Java 桌面数据库应用程序和创建定制 Java 桌面数据库应用程序教程。
要了解可以如何使用 Java 桌面应用程序项目模板来生成带有主视图/详细视图的数据库应用程序,请参见构建 Java 桌面数据库应用程序。
有关 Bean 绑定的详细信息,请参见 java.net 上的“Bean 绑定”项目页。
有关 JavaBeans 组件的一般信息,请参见 Java 教程的 Bean 学习资源。
有关在 NetBeans IDE 中使用 GUI 生成器的一般提示和技巧,请参见 GUI 编辑器常见问题解答和 Patrick Keegan 的 Web 日志。