本指南介绍了 NetBeans IDE 对 Java 应用程序中 Bean 绑定和数据绑定的支持。
要学完本教程,您需要具备以下软件和资源。
软件或资源 | 要求的版本 |
---|---|
NetBeans IDE | 版本 7.1、7.2 或 7.3 |
Java 开发工具包 (JDK) | 版本 6 或更高版本 |
在发布 Bean 绑定库之前,将 UI 组件连接到数据库或将组件属性的值保持同步非常麻烦。例如,将标准数据库中的数据显示在 JTable 中需要手动创建实用程序类来处理数据库与 JTable 之间的连接。而且让不同 Bean 属性的值保持同步(如呈现可视 Bean 的 JTextField 值)需要手动编码监听程序和事件处理程序。
Bean 绑定库对所有这些操作进行了简化和标准化。只需编写几行代码确定哪些组件的哪些属性需要保持同步,Bean 绑定库就可以处理其余的操作。在 NetBeans IDE 中,Bean 绑定功能集成在 GUI 构建器中,因此,在建立可视设计之后可以快速获取已编码应用程序的行为。
本指南概述了 IDE 中 Bean 绑定的主要功能。
就最基本的用途而言,Bean 绑定是一种不使用事件监听和处理代码连接 Bean 属性的方法。
为了说明 Bean 绑定的概念以及 IDE 如何支持该绑定,我们将举一个简单的示例,其中用户可以调整滑块来更改文本字段中的数值。
设置示例:
(如果 "JFrame Form"(JFrame 窗体)在 "New"(新建)菜单中不可用,则选择 "Other"(其他)。然后在新建文件向导中,选择 "Swing GUI Forms"(Swing GUI 窗体)类别,然后选择 "JFrame Form"(JFrame 窗体)模板。)
NumberSliderForm.java 应以设计模式在编辑区域中打开。
生成的窗体可能类似于下面的屏幕快照。不过,对于本示例而言,定位并不重要。
现在我们已经设置了该示例,下面可以创建绑定了。不过,我们首先需要确定哪个组件作为绑定的源,哪个组件作为绑定的目标。绑定源组件表示绑定属性值的来源。
在 GUI 编辑器中进行绑定时,开始先进行目标绑定,然后在 "Bind"(绑定)对话框中声明绑定源。
在本例中,由于 JSlider 附带一个默认值范围,因此我们将使用它作为源。
注:绑定可以是双向的(读/写),这样,在目标中所做的更改可以自动地反映在源中。但是,初始绑定方向始终从源到目标。请参见高级绑定配置一节中有关“更新模式”的信息。
将滑块绑定到文本字段:
刚才将滑块的 value Bean 属性绑定到了文本字段的 text 值。
在设计区域,文本字段应显示值 50。此值说明滑块处于中间位置,并且滑块的默认值范围为 0 到 100。
现在可以运行该应用程序并查看工作中的绑定。
选择 "Run"(运行)> "Run File"(运行文件)以运行文件。
应用程序应在单独的窗口中启动。在运行的应用程序中调整滑块,并查看文本字段中值的更改。
在上一节中,您绑定了从组件面板添加到窗体的两个标准 Swing 组件的属性。还可以绑定其他 Bean 的属性。不过,要执行此操作,您需要执行一些步骤,让 IDE 用于生成绑定代码的功能使该 Bean 可用。可以采取以下任一方法使 IDE 的绑定功能可用于 Bean:
将 Bean 添加到“组件面板”窗口:
从项目添加 Bean:
然后您应在“检查器”窗口中看到此 Bean。接着可以为该 Bean 的任何属性调用“绑定”对话框。
本教程第一节中的示例介绍了与某些默认行为的简单绑定。但是,有时您可能希望或需要以不同方式配置绑定。如果是这种情况,则可以使用“绑定”对话框的“高级”标签。
该对话框的“高级”标签中包含以下字段:
“转换器”下拉列表中填充了已作为 Bean 添加到窗体中的任何转换器。还可以使用以下方法直接添加转换代码:单击省略号 (...) 按钮,然后从“使用以下内容选择转换器属性”下拉列表中选择“定制代码”。
下面列出了不需要提供转换器的转换:
验证器需要扩展 org.jdesktop.beansbinding.Validator 类。
“验证器”下拉列表中填充了已作为 Bean 添加到窗体中的任何验证器。还可以使用以下方法直接添加验证代码:单击省略号 (...) 按钮,然后从“使用以下内容选择验证器属性”下拉列表中选择“定制代码”。
注:为了更好地了解上面提到的类和方法,可以从 IDE 中直接访问 Bean 绑定 Javadoc 文档。选择“帮助”>“Javadoc 参考”>“Bean 绑定”。在打开的浏览器窗口中,单击 org.jdesktop.beansbinding 链接以访问这些类的文档。
除了同步可视 Swing 组件和其他定制 Bean 的属性之外,还可以使用 Bean 绑定帮助您使用可视组件与数据库交互。在创建新的 Java 窗体并在窗体中添加组件后,您可以生成代码,以便将这些组件绑定到数据上。本节介绍如何将数据绑定到 Swing JTable、JList 和 JComboBox 组件。
在将组件绑定到数据库中的数据之前,您需要完成以下操作:
创建实体类以表示要绑定到 JTable 的数据库:
在 "Projects"(项目)窗口中,您会看到实体类的节点。
本节介绍如何将数据绑定到 JTable、JList 和 JComboBox 组件。
将一个数据库表添加到窗体,并自动生成 JTable 以显示数据库表的内容:
这将创建 JTable,并将其列绑定到数据库表中的列。
将数据库表绑定到现有的 JTable 组件:
将数据绑定到 JList 组件:
将数据绑定到 JComboBox 组件:
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 | selected | 按钮的选定状态。 |
JComboBox | selectedItem | JComboBox 的选定项。 |
JSlider | value | JSlider 值;通知所有更改。 |
value_IGNORE_ADJUSTING | 与 "value" 基本相同,但在滑块调整值时不通知更改。 | |
JList | selectedElement | JList 的选定元素;通知所有更改。如果在 JListBinding 中将 JList 作为目标,则会将单个选定元素报告为绑定源列表中的元素。否则,将该选定元素报告为列表模型中的对象。如果未选择任何内容,则该属性的值为空值。 |
selectedElements | JList 的多个选定元素的列表;通知所有更改。如果在 JListBinding 中将 JList 作为目标,则会将多个选定元素报告为绑定源列表中的元素。否则,将这些选定元素报告为列表模型中的对象。如果未选择任何内容,则该属性的值为空列表。 | |
selectedElement_IGNORE_ADJUSTING | 与 "selectedElement" 基本相同,但在更新列表选定内容时不通知更改。 | |
selectedElements_IGNORE_ADJUSTING | 与 "selectedElements" 基本相同,但在更新列表选定内容时不通知更改。 | |
JTable | selectedElement | JTable 的选定元素;通知所有更改。如果在 JTableBinding 中将 JTable 作为目标,则会将选定元素报告为绑定源列表中的元素。否则,将选定元素报告为一个映射,其中,键由字符串 "column" 和列索引组成;值为该列的模型值。例如:{column0=column0value,column1=column1value,...} 如果未选择任何内容,则该属性的值为空值。 |
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 或组件不处于焦点状态时通知更改。 |