在桌面应用程序中实现 Beans 和数据绑定
本教程将介绍如何通过 NetBeans IDE 6.0 支持在 Java 桌面应用程序实现 Beans 绑定和数据绑定的 。
|
内容
|
|
 |
本教程的软件和文件需求
要完成本教程,需要在计算机中安装以下软件:
简介:NetBeans IDE 6.0 中的 Bean 绑定
在还没有发布 bean 绑定库的时候,通常很难将 UI 组件连接到数据库或者使组件属性值保持同步。例如,要在 JTable 中显示来自标准数据库的数据,需要手动创建实用类来处理数据库和 JTable 之间的连接。而要使不同 bean 属性的值(例如描绘可见 bean 的 JTextField 的值)保持同步则需要亲自编写侦听程序和事件处理程序。
bean 绑定库对所有这些操作进行了简化和标准化。您仅需编写几行代码来确定哪些组件的哪些属性需要保持同步,余下的工作则由 bean 绑定库负责完成。在 NetBeans IDE 中,bean 绑定特性被集成到了 GUI Builder 中,因此在确定可视设计之后,您可以立刻编写应用程序的行为。
本教程概述了 IDE bean 绑定的主要方面。要了解众多 特性的具体应用,请阅读 构建 Java 桌面数据库应用程序教程。
对多个属性进行绑定
本质上讲,bean 绑定就是一种不需要侦听事件和处理代码就可连接 bean 属性的方法。
为解释 bean 绑定的概念以及 IDE 对其提供的支持,我们将实现一个简单的示例,其中用户可以调整滑块来修改文本字段中的数字值。
示例设置如下:
- 在 IDE 中,选择 File > New Project。
- 选择 Java 类别并选择 Java Application 模板。单击 Next 按钮。
- 在向导的 Name 和 Location 页面,执行以下操作:
- 输入 NumberSlider 作为项目名。
- 选中 Set As Main Project 复选框。
- 取消选择 Create Main Class 复选框。
- 单击 Finish 按钮退出向导并设置项目。
- 在 Projects 窗口中,右键单击 NumberSlider 项目节点并选择 New > JFrame Form。
(如果 New 菜单中的 JFrame Form 不可用,选择 Other。然后在 New File 向导中,选择 Swing GUI Forms 类别并选择 JFrame Form 模板)。

- 在向导的 Name and Location 页面中,执行以下操作:
- 输入 NumberSliderFrame 作为类名。
- 输入 numberslider 作为包名。

- 单击 Finish 按钮退出向导并创建表单。
NumberSliderForm.java 将在编辑区域中以设计模式打开。
- 在刚刚显示的 Palette 的 Swing Controls 区域中,将滑块控件拖拽到设计区。
- 将 Palette 中的文本字段组件拖拽到设计区。
产生的表单可能类似于下面显示的屏幕截图。但是,控件的摆放位置不会影响演示目的。

源和目标
现在我们已经建立好了示例,可以开始创建绑定了。然而,我们首先需要确定分别将哪些组件作为绑定源 和绑定目标。绑定源中的属性值将作为绑定的初始值。
当在 GUI Editor 中进行绑定时,将对目标组件发起绑定,然后在 Bind 对话框中声明绑定源。
在本例中,由于 JSlider 提供了默认值,我们就使用它作为绑定源。
注意:绑定可以是双向的(读/写),因此对目标作出的改动会自动反映到源中。然而,初始绑定的方向总是从源到目标。有关 Update Mode 的信息请参阅 高级绑定配置 小节。
要将滑块绑定到文本字段:
- 右键单击文本字段组件并选择 Bind > text 以打开 Bind 对话框。
- 从 Binding Source 组合框中选择 jSlider1。
- 从 Binding Expression 组合框中选择 value int,如下图所示。

- 单击 OK 按钮。
您已经将滑块的 value bean 属性绑定到文本字段的 text 值。
在设计区内,文本字段应该显示值 50。该值表示滑块处于正中间的位置,而默认的值的范围为 0 到 100。
现在您可以运行应用程序并查看绑定的运作。
要运行项目:
- 选择 Run > Run Main Project。
- 在 Run Project 对话框中,单击 OK 按钮将 numberslider.NumberSliderForm 设置为主类。
应用程序将从一个独立的窗口中启动。调整所运行应用程序中的滑块并观察文本字段的值是否发生变化。

高级绑定配置
上面的示例显示了使用默认行为的简单绑定。但是,某些时候您希望或需要配置不同的绑定。如果是这样,则可以使用 Binding 对话框的 Advanced 选项卡。
对话框的 Advanced 选项卡包含以下字段:
- Name。使您能够为绑定创建一个名字,从而可以更加灵活地管理绑定。绑定的名字被添加到绑定构造函数中,并且可以被绑定的 getName() 方法引用。
- Update Mode。指定实现属性同步的方法。可能的值包括:
- 始终执行同步(读/写)。无论何时只要对源或目标作出更改,与之相应的另一方也将被更新。
- 只从源进行读取(只包括读)。只有首次设定源值时对目标进行更新。当对源作出修改时,将对目标进行更新。而对目标作出的修改不会更新到源中。
- 只对源进行一次读取(只读取一次)。 只有第一次绑定目标和源时对目标进行更新。
- Update Source When (只对 JTextField 和 JTextArea 组件的 text 属性起作用)。使您能够选择与属性进行同步的频率。
- Ignore Adjusting(只对 JSlider 的 value 属性、JTable 和 JList 的 selectedElement 属性、JTable 和 JList 的 selectedElements 属性起作用)。如果选中该复选框,在用户完成更改之前,对某个属性的所有更改不会传递到与之对应的属性中。例如,当应用程序的用户拖动滑块时,与滑块的 value 属性相绑定的属性的值只有在用户释放鼠标后才会更新。
- Converter。如果绑定包含不同数据类型的属性,则可以指定代码在类型之间转换值。beans 绑定库可以处理很多常见的转换,但是对于其他的属性类型组合,您需要提供自己的转换程序。这类转换程序需要扩展 org.jdesktop.beansbinding.Converter 类。
可以使用作为 bean 添加到表单的任何转换程序填充 Converter 下拉列表。您还可以直接添加转换代码,方法为单击 ellipsis (...) 按钮,然后从 Select Converter Property Using 下拉列表中选择 Custom Code。
- Validator。使您能够指示代码验证目标属性值的更改,然后将该更改传递回源属性中。这种验证程序需要扩展 org.jdesktop.beansbinding.Validator 类。
可以使用作为 bean 添加到表单的任何验证程序填充 Validator 下拉列表。您还可以直接添加验证代码,方法为单击 ellipsis (...) 按钮,然后从 Select Validator Property Using 下拉列表中选择 Custom Code。
- Null Source Value。在尝试绑定时,如果源属性具有一个 null 值,则该字段可以使您指定一个不同的值使用。该字段对应于 org.jdesktop.beansbinding.Binding 类的 setSourceNullValue() 方法。
- Unreadable Source Value。在尝试绑定时,如果无法解析绑定表达式,该字段可以使您能够指定一个不同的值来使用。该字段对应于 org.jdesktop.beansbinding.Binding 类的 setSourceUnreadableValue() 方法。
- 为了更好地理解以上提到的类和方法,您可以直接通过 IDE 方法 beans 绑定 Javadoc 文档。选择 Help > Javadoc References > Beans Binding。在打开的浏览器窗口中,单击 org.jdesktop.beansbinding 链接可以访问这些类的文档。
对组件绑定数据
创建完新 Java 表单并向其中添加了组件后,您可以生成代码来为这些组件绑定数据。使用 IDE 可以轻松地将数据绑定到 Swing JTable、JList 和 JComboBox 组件。
在将数据库中的数据绑定到组件之前,您需要执行以下操作:
- 将 IDE 连接到一个数据库。
- 向 GUI Builder 中的表单添加组件。
- 创建需要进行绑定的代表数据库表的类。下面介绍了将数据绑定到组件的实体类的创建步骤。
创建实体类
要创建实体类并使用它表示绑定到 JTable 的数据库,请执行以下操作:
- 在 Projects 窗口中,右键单击项目并选择 New > Other,选择 Persistence 类别,然后从 Database 模板选择 Entity Classes。
- 在向导的 Database Tables 页面中选择 database connection。
- 填充 Available Tables 列后,选择希望在应用程序中使用的表并单击 Add 将它们移动到 Selected Tables 列中,单击 Next 按钮。

- 在向导的 Entity Classes 页面中,确保 Generate Named Query Annotations for Persistent Fields 对话框被选中。
- 根据需求对所生成的类的名称和位置进行自定义。

- 单击 Create Persistence Unit 按钮。
- 在 Create Persistence Unit 对话框中,确保进行了以下选择:
- 所选的 Persistence Library 为 TopLink。
- 所选的 Table Generation Strategy 为 “None”。

- 单击 Finish 按钮。
您应该能够在 Projects 窗口中看到实体类节点。
将组件绑定到表示数据的 Bean
要将数据绑定到 JTable 组件:
- 右键单击 GUI Builder 中的组件并选择 Bind > 元素。
- 单击 Import Data to Form 按钮。从 Import Data to Form 对话框中选择希望对其绑定组件的数据库表。单击 OK 按钮。
- 在 Binding Source 复选框中,选择表示实体类的结果列表的项。例如,如果调用了实体类 Customer.java,那么将生成 customerList 列表对象。
- 保留 Binding Expression 的值为 null。
- 如果希望将一些数据库列显示在 JTable 中,则从 Selected 列表中选择这些列,然后将它们移动到 Available 列表。
- 选择 Advanced 选项卡进一步配置绑定。例如,您可以指定一个验证程序或是转换程序,或者如果绑定源为 null 或不可读时指定行为。
- 单击 OK 按钮。
要将数据绑定到 JList 组件:
- 右键单击 GUI Builder 中的组件并选择 Bind > 元素。
- 单击 Import Data to Form。从 Import Data to Form 对话框中选择希望对其绑定组件的数据库表。单击 OK 按钮。
- 从 Binding Source 复选框中选择表示实体类结果列表的项。例如,如果调用了实体类 Customer.java,那么将生成 customerList 类别对象。
- 保留 Binding Expression 的值为 null 不变。
- 在 Display Expression 下拉列表中,选择表示数据库列的属性,这些数据库列包含希望显示在列表的值。
- 选择 Advanced 选项卡进一步配置绑定。
- 单击 OK。
注意:您还可以使用 New Java Desktop Application 向导快速创建具有 CRUD 特性(创建、更新和删除)的功能完整的应用程序。然而,最好提前创建所有实体类,以确保所生成的类涵盖了实体间的所有关系。
特殊绑定属性
如果需要,可以使用 bean 绑定库为组件中缺失的一些 Swing 组件提供的人为创建的特殊属性。这些属性表示的内容(如选中的表行)有助于绑定属性。
下面的列表展示了 bean 绑定库添加的一些人为创建的属性:
| 组件 |
属性 |
说明 |
| AbstractButton |
selected |
选中的按钮状态。 |
| JComboBox |
selectedItem |
选中的 JComboBox 项。 |
| JSlider |
value |
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) |
text |
JTextComponent 的 text 属性;通知所有更改(包括输入)。 |
| text_ON_FOCUS_LOST |
JTextComponent 的 text 属性;只有当组件丢失焦点时通知更改。 |
| text_ON_ACTION_OR_FOCUS_LOST |
JTextComponent 的 text 属性;只有当组件通知 actionPerformed 或组件丢失焦点时通知更改。 |
结束语
有关更全面的 IDE GUI Builder 使用信息,请参阅 GUI Building in NetBeans IDE 5.5。 有关 Beans Binding 的更多信息,请参阅 java.net 上的 Beans Binding 项目页面。