在 Java 应用程序中绑定 Bean 和数据
本指南介绍了 NetBeans IDE 对 Java 应用程序中 Bean 绑定和数据绑定的支持。
要学完本教程,您需要具备以下软件和资源。
软件或资源 | 要求的版本 |
---|---|
NetBeans IDE | 版本 7.1、7.2 或 7.3 |
Java 开发工具包 (JDK) | 版本 6 或更高版本 |
简介:NetBeans IDE 中的 Bean 绑定
在发布 Bean 绑定库之前,将 UI 组件连接到数据库或将组件属性的值保持同步非常麻烦。例如,将标准数据库中的数据显示在 JTable 中需要手动创建实用程序类来处理数据库与 JTable 之间的连接。而且让不同 Bean 属性的值保持同步(如呈现可视 Bean 的 JTextField 值)需要手动编码监听程序和事件处理程序。
Bean 绑定库对所有这些操作进行了简化和标准化。只需编写几行代码确定哪些组件的哪些属性需要保持同步,Bean 绑定库就可以处理其余的操作。在 NetBeans IDE 中,Bean 绑定功能集成在 GUI 构建器中,因此,在建立可视设计之后可以快速获取已编码应用程序的行为。
本指南概述了 IDE 中 Bean 绑定的主要功能。
将属性绑定到其他属性
就最基本的用途而言,Bean 绑定是一种不使用事件监听和处理代码连接 Bean 属性的方法。
为了说明 Bean 绑定的概念以及 IDE 如何支持该绑定,我们将举一个简单的示例,其中用户可以调整滑块来更改文本字段中的数值。
设置示例:
- 在 IDE 中,选择 "File"(文件)> "New Project"(新建项目)。
- 选择 "Java" 类别,然后选择 "Java Application"(Java 应用程序)模板。单击 "Next"(下一步)。
- 在向导的 "Name and Location"(名称和位置)页中,执行以下操作:
- 键入 NumberSlider 作为项目名称。
- 将 "Use Dedicated Folder for Storing Libraries"(使用专用文件夹存储库)复选框保留为取消选中状态。
- 清除 "Create Main Class"(创建主类)复选框。
- 单击 "Finish"(完成)退出向导并设置项目。
- 在 "Projects"(项目)窗口中,右键单击 NumberSlider 项目节点并选择 "New"(新建)> "JFrame Form"(JFrame 窗体)。
(如果 "JFrame Form"(JFrame 窗体)在 "New"(新建)菜单中不可用,则选择 "Other"(其他)。然后在新建文件向导中,选择 "Swing GUI Forms"(Swing GUI 窗体)类别,然后选择 "JFrame Form"(JFrame 窗体)模板。)
- 在向导的 "Name and Location"(名称和位置)页中,执行以下操作:
- 为类名键入 NumberSliderFrame。
- 为包名键入 numberslider。
- 单击 "Finish"(完成)退出向导并创建窗体。
NumberSliderForm.java 应以设计模式在编辑区域中打开。
- 从组件面板的 "Swing Controls"(Swing 控件)部分,将一个滑块组件拖至设计区域。(如果 "Palette"(组件面板)窗口未打开,请选择 "Window"(窗口)> "Palette"(组件面板)。)
- 从组件面板中,将一个文本字段组件拖至设计区域。
生成的窗体可能类似于下面的屏幕快照。不过,对于本示例而言,定位并不重要。
源和目标
现在我们已经设置了该示例,下面可以创建绑定了。不过,我们首先需要确定哪个组件作为绑定的源,哪个组件作为绑定的目标。绑定源组件表示绑定属性值的来源。
在 GUI 编辑器中进行绑定时,开始先进行目标绑定,然后在 "Bind"(绑定)对话框中声明绑定源。
在本例中,由于 JSlider 附带一个默认值范围,因此我们将使用它作为源。
注:绑定可以是双向的(读/写),这样,在目标中所做的更改可以自动地反映在源中。但是,初始绑定方向始终从源到目标。请参见高级绑定配置一节中有关“更新模式”的信息。
将滑块绑定到文本字段:
- 右键单击文本字段组件,并选择 "Bind"(绑定)> "text"(文本)以打开 "Bind"(绑定)对话框。
- 从 "Binding Source"(绑定源)组合框中,选择 jSlider1。
- 从 "Binding Expression"(绑定表达式)组合框中,选择 value int,如下图所示。
- 单击 "OK"(确定)。
刚才将滑块的 value Bean 属性绑定到了文本字段的 text 值。
在设计区域,文本字段应显示值 50。此值说明滑块处于中间位置,并且滑块的默认值范围为 0 到 100。
现在可以运行该应用程序并查看工作中的绑定。
选择 "Run"(运行)> "Run File"(运行文件)以运行文件。
应用程序应在单独的窗口中启动。在运行的应用程序中调整滑块,并查看文本字段中值的更改。
绑定定制 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 添加到窗体中的任何验证器。还可以使用以下方法直接添加验证代码:单击省略号 (...) 按钮,然后从“使用以下内容选择验证器属性”下拉列表中选择“定制代码”。 - 空值源值。可用于在尝试绑定时源属性具有空值的情况下指定使用其他值。该字段与 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 中连接到数据库。
- 创建一些类,用于表示要绑定的数据库表。下面介绍了创建实体类以便将数据绑定到组件的步骤。
创建实体类
创建实体类以表示要绑定到 JTable 的数据库:
- 在 "Projects"(项目)窗口中,右键单击项目并选择 "New"(新建)> "Other"(其他),选择 "Persistence"(持久性)类别,然后选择 "Entity Classes from Database"(通过数据库生成实体类)模板。
- 在向导的 "Database Tables"(数据库表)页中,选择数据库连接。
- 在 "Available Tables"(可用表)列被填充后,选择要在应用程序中使用的表,然后单击 "Add"(添加),以便将表移到 "Available Tables"(选定的表)列中。单击 "Next"(下一步)。
- 在该向导的 "Entity Classes"(实体类)页中,确保选中了 "Generate Named Query Annotations for Persistent Fields"(为持久性字段生成已命名的查询标注)和 "Create Persistence Unit"(创建持久性单元)复选框。
- 对生成类的名称及其位置进行任何所需的定制。
- 单击 "Finish"(完成)。
在 "Projects"(项目)窗口中,您会看到实体类的节点。
将组件绑定到表示数据的 Bean
本节介绍如何将数据绑定到 JTable、JList 和 JComboBox 组件。
将一个数据库表添加到窗体,并自动生成 JTable 以显示数据库表的内容:
- 打开 "Services"(服务)窗口。
- 连接到包含您要添加到窗体的表的数据库。(可以通过右键单击用于数据库连接的节点并选择 "Connect"(连接)以连接到数据库。)
- 展开用于连接的节点,并展开其表节点。
- 将表节点拖到窗体并在拖至表时按住 Ctrl 键。
这将创建 JTable,并将其列绑定到数据库表中的列。
将数据库表绑定到现有的 JTable 组件:
- 在 GUI 构建器中右键单击该组件,然后选择 "Bind"(绑定)> "elements"(元素)。
- 单击 "Import Data to Form"(将数据导入窗体)。在 "Import Data to Form"(将数据导入窗体)对话框中,选择要将组件绑定到的数据库表。单击 "OK"(确定)。
- 在 "Binding Source"(绑定源)组合框中,选择表示实体类结果列表的项。例如,如果调用实体类 Customer.java,则列表对象将生成为 customerList。
- 将绑定表达式的值保留为空值。
- 如果不想在 JTable 中显示某些数据库列,请在 "Selected"(选定)列表中选择这些列,然后将它们移到 "Available"(可用)列表中。
- 选择 "Advanced"(高级)标签进一步配置绑定内容。例如,您可以指定验证器或转换器,或者指定绑定源为空值或不可读时的行为。
- 单击 "OK"(确定)。
将数据绑定到 JList 组件:
- 在 GUI 构建器中右键单击该组件,然后选择 "Bind"(绑定)> "elements"(元素)。
- 单击 "Import Data to Form"(将数据导入窗体)。在 "Import Data to Form"(将数据导入窗体)对话框中,选择要将组件绑定到的数据库表。单击 "OK"(确定)。
- 在 "Binding Source"(绑定源)组合框中,选择表示实体类结果列表的项。例如,如果调用实体类 Customer.java,则列表对象将生成为 customerList。
- 将绑定表达式的值保留为空值。
- 在 "Display Expression"(显示表达式)下拉列表中,选择表示数据库列的属性,该列包含了要在列表中显示的值。
- 选择 "Advanced"(高级)标签进一步配置绑定内容。
- 单击 "OK"(确定)。
将数据绑定到 JComboBox 组件:
- 右键单击组合框,然后选择 "Bind"(绑定)> "elements"(元素)。
- 单击 "Import Data to Form"(将数据导入窗体)。在 "Import Data to Form"(将数据导入窗体)对话框中,选择要将组件绑定到的数据库表。单击 "OK"(确定)。
- 在 "Binding Source"(绑定源)组合框中,选择表示实体类结果列表的项。例如,如果调用实体类 Customer.java,则列表对象将生成为 customerList。
- 将绑定表达式值保留为空值,然后单击 "OK"(确定)。
- 再次右键单击组合框,然后选择 "Bind"(绑定)> "selectedItem"。
- 绑定到您希望受用户选择影响的属性。
- 单击 "OK"(确定)保存所做的编辑。
Bean 绑定库(从版本 1.2.1 起)没有 DetailBinding 类,该类用于指定如何为 JComboBox 派生 display 值。因此,您需要编写一些定制代码。一种方法是编写定制单元格呈现器,如下所示。
要正确呈现组合框,请执行以下操作:
- 选择组合框。
- 在 "Properties"(属性)窗口的 "Properties"(属性)标签中,选择呈现属性。
- 单击省略号 (...) 按钮。
- 在属性编辑器顶部的组合框中,选择 "Custom Code"(定制代码)。
- 在文本区域中,输入类似以下内容的代码,其中
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 或组件不处于焦点状态时通知更改。 |
在 Java 应用程序中绑定 Bean 和数据的更多相关文章
- 在 Java 应用程序中加一些 Groovy 进来
如果您一直在阅读这个系列,那么您应该已经看到有各种各样使用 Groovy 的有趣方式,Groovy 的主要优势之一就是它的生产力.Groovy 代码通常要比 Java 代码更容易编写,而且编写起来也更 ...
- 在Java Web程序中使用监听器可以通过以下两种方法
之前学习了很多涉及servlet的内容,本小结我们说一下监听器,说起监听器,编过桌面程序和手机App的都不陌生,常见的套路都是拖一个控件,然后给它绑定一个监听器,即可以对该对象的事件进行监听以便发生响 ...
- 在 Java 应用程序中使用 Elasticsearch
如果您使用过 Apache Lucene 或 Apache Solr,就会知道它们的使用体验非常有趣.尤其在您需要扩展基于 Lucene 或 Solr 的解决方案时,您就会了解 Elasticsear ...
- 在Java Web程序中使用Hibernate
在Java Web程序中使用Hibernate与普通Java程序一样.本文中将使用Servlet和JSP结合Hibernate实现数据库表的增删改查操作. Web程序中,hibernate.cfg.x ...
- Java应用程序中的声音播放
声音可以创造意境,触发遐想,当与虚拟图像相结合时,更加可以让整个世界充满幻觉,声音是多媒体技术的基础. 播放声音是Java对多媒体的支持一个重要部分,它支持的声音文件类型主要有: AU - (扩展名为 ...
- 在并发Java应用程序中检测可见性错误
了解什么是可见性错误,为什么会发生,以及如何在并发Java应用程序中查找难以捉摸的可见性错误.这些问题你可能也遇到过,当在优锐课学习了一段时间后,我对这些问题有了一定见解,写下这篇文章和大家分享. 检 ...
- C#程序中从数据库取数据时需注意数据类型之间的对应,int16\int32\int64
private void btn2_Click(object sender, RoutedEventArgs e) { using (SqlConnection ...
- MO拆分计划行程序中写入PRODUCTIONORDERS表数据出现重复导致报错(BUG)20180502
错误提示:ORA-00001: 违反唯一约束条件 (ABPPMGR.C0248833319_6192)ORA-06512: 在 "STG.FP_MO_SPLIT", line 19 ...
- [转载]Java应用程序中的内存泄漏及内存管理
近期发现测试的项目中有JAVA内存泄露的现象.虽然JAVA有垃圾回收的机制,但是如果不及时释放引用就会发生内存泄露现象.在实际工作中我们使用Jprofiler调用java自带的 jmap来做检测还是很 ...
随机推荐
- API 版本控制的几种方式
个人建议:用content type,即放在Header里面!比如加一个Version:1.4.3 这篇文章写得很好,介绍了三种实现web api版本化的三种方式.我从评论里又收集到两种方式,所以一共 ...
- unity, GUIStyle and Skin
例1: using UnityEngine; using System.Collections; using UnityEditor; using System.Collections.Generic ...
- 连接SQLServer的增删改查方法代码
在Visual C++中用ADO进行数据库编程 1. 生成应用程序框架并初始化OLE/COM库环境 创建一个标准的MFC AppWizard(exe)应用程序CADOConnection,然后在使用A ...
- Ubuntu安装Sublime Text 2
参考资料:http://www.technoreply.com/how-to-install-sublime-text-2-on-ubuntu-12-04-unity/ 1.去Sublime Text ...
- python跳一跳辅助学习
微信跳一跳辅助工具 准备工具 adb驱动 安卓手机 打开手机的调试模式 usb接好手机和电脑 PyCharm:全宇宙唯一一款专门用于Python开发IDE工具 实现原理: 获取手机的实时的截图 点击起 ...
- javascript 异步实现方案
1.回调函数 fn1( fn2 ); 2.事件监听 fn1.on('done', fn2); function fn1() { setTimeout(function(){ fn1.trigger(' ...
- Unix系统编程()改变信号处置:signal
Unix系统提供了两种方法来改变信号处置:signal和sigaction.这篇描述的是signal系统调用,是设置信号处理的原始API,所提供的接口比sigaction简单.另一方面,sigacti ...
- Groovy学习专栏
今天新开了一个groovy的学习专栏,因为最近工作中会用到Groovy模板. 然后就是在网上找了一下Groovy模板相关的东西发现ibm中在2005年就有讲到这个的,我勒个去,这么早,我初中都还没毕业 ...
- Android——gridLayout(网格布局)
<?xml version="1.0" encoding="utf-8"?> <GridLayout xmlns:android=" ...
- Java中float/double取值范围与精度
Java浮点数 浮点数结构 要说清楚Java浮点数的取值范围与其精度,必须先了解浮点数的表示方法,浮点数的结构组成,之所以会有这种所谓的结构,是因为机器只认识01,你想表示小数,你要机器认识小数点这个 ...