blob: 4314f59b23823dcfba24c1da7c1a43001b857824 [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!--
Copyright (c) 2009 - 2014, Oracle and/or its affiliates. All rights reserved.
-->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" >
<title>在 Java 应用程序中绑定 Bean 和数据 - NetBeans IDE 教程</title>
<meta name="KEYWORDS" content="NETBEANS, TUTORIAL, GUIDE, USER, DOCUMENTATION">
<meta name="description" content="This guide is an introduction to the support in NetBeans IDE for beans
binding and data binding in Java applications." >
<link rel="stylesheet" href="../../../netbeans.css">
</head>
<body>
<h1>在 Java 应用程序中绑定 Bean 和数据</h1>
<p>本指南介绍了 NetBeans IDE 对 Java 应用程序中 Bean 绑定和数据绑定的支持。</p>
<p><b>目录</b></p>
<img alt="此页上的内容适用于 NetBeans IDE 7.1、7.2、7.3、7.4 和 8.0" class="stamp" src="../../../images_www/articles/73/netbeans-stamp-80-74-73.png" title="此页上的内容适用于 NetBeans IDE 7.1、7.2、7.3、7.4 和 8.0">
<ul class="toc">
<li><a href="#intro">简介:NetBeans IDE 中的 Bean 绑定</a></li>
<li><a href="#prop-binding">将属性绑定到其他属性</a></li>
<li><a href="#prop-custom">绑定定制 Bean</a></li>
<li><a href="#prop-advanced">高级绑定属性</a></li>
<li><a href="#data-binding">将数据绑定到组件</a></li>
<li><a href="#prop-synth">特殊绑定属性</a></li>
</ul>
<p><b>要学完本教程,您需要具备以下软件和资源。</b></p>
<table>
<tbody>
<tr>
<th class="tblheader" scope="col">软件或资源</th>
<th class="tblheader" scope="col">要求的版本</th>
</tr>
<tr>
<td class="tbltd1"><a href="https://netbeans.org/downloads/index.html" target="_blank">NetBeans IDE</a></td>
<td class="tbltd1">版本 7.1、7.2、7.3、7.4 或 8.0 </td>
</tr>
<tr>
<td class="tbltd1"><a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html" target="_blank">Java 开发工具包 (JDK)</a></td>
<td class="tbltd1">版本 6 或更高版本</td>
</tr>
</tbody>
</table>
<a name="intro"></a>
<h2>简介:NetBeans IDE 中的 Bean 绑定</h2>
<p>在发布 Bean 绑定库之前,将 UI 组件连接到数据库或将组件属性的值保持同步非常麻烦。例如,将标准数据库中的数据显示在 JTable 中需要手动创建实用程序类来处理数据库与 JTable 之间的连接。而且让不同 Bean 属性的值保持同步(如呈现可视 Bean 的 JTextField 值)需要手动编码监听程序和事件处理程序。</p>
<p>Bean 绑定库对所有这些操作进行了简化和标准化。只需编写几行代码确定哪些组件的哪些属性需要保持同步,Bean 绑定库就可以处理其余的操作。在 NetBeans IDE 中,Bean 绑定功能集成在 GUI 构建器中,因此,在建立可视设计之后可以快速获取已编码应用程序的行为。</p>
<p>本指南概述了 IDE 中 Bean 绑定的主要功能。
</p>
<a name="prop-binding"></a>
<h2>将属性绑定到其他属性</h2>
<p>就最基本的用途而言,Bean 绑定是一种不使用事件监听和处理代码连接 Bean 属性的方法。</p>
<p>为了说明 Bean 绑定的概念以及 IDE 如何支持该绑定,我们将举一个简单的示例,其中用户可以调整滑块来更改文本字段中的数值。</p>
<p><b>设置示例:</b></p>
<ol>
<li>在 IDE 中,选择 "File"(文件)> "New Project"(新建项目)。</li>
<li>选择 "Java" 类别,然后选择 "Java Application"(Java 应用程序)模板。单击 "Next"(下一步)。</li>
<li>在向导的 "Name and Location"(名称和位置)页中,执行以下操作:
<ul>
<li>键入 <tt>NumberSlider</tt> 作为项目名称。</li>
<li>将 "Use Dedicated Folder for Storing Libraries"(使用专用文件夹存储库)复选框保留为取消选中状态。
<p class="align-center"><a href="../../../images_www/articles/80/java/gui-binding/numberslider.png" rel="lytebox" title="新建 Java 应用程序向导的 &amp;quot;Name &amp; Location&amp;quot;(名称和位置)页"><img alt="新建 Java 应用程序向导的 &amp;quot;Name &amp; Location&amp;quot;(名称和位置)页" border="1" src="../../../images_www/articles/80/java/gui-binding/numberslider-small.png"></a></p></li>
<li>清除 "Create Main Class"(创建主类)复选框。</li>
</ul>
</li>
<li>单击 "Finish"(完成)退出向导并设置项目。</li>
<li>在 "Projects"(项目)窗口中,右键单击 NumberSlider 项目节点并选择 "New"(新建)> "JFrame Form"(JFrame 窗体)。
<p>(如果 "JFrame Form"(JFrame 窗体)在 "New"(新建)菜单中不可用,则选择 "Other"(其他)。然后在新建文件向导中,选择 "Swing GUI Forms"(Swing GUI 窗体)类别,然后选择 "JFrame Form"(JFrame 窗体)模板。)</p>
</li>
<li>在向导的 "Name and Location"(名称和位置)页中,执行以下操作:
<ul>
<li>为类名键入 <tt>NumberSliderFrame</tt></li>
<li>为包名键入 <tt>numberslider</tt></li>
</ul>
<p class="align-center">
<a href="../../../images_www/articles/80/java/gui-binding/numberslider2.png" rel="lytebox" title="新建 JFrame 向导的 &amp;quot;Name &amp; Location&amp;quot;(名称和位置)页"> <img alt="新建 JFrame 向导的 &amp;quot;Name &amp; Location&amp;quot;(名称和位置)页" border="1" src="../../../images_www/articles/80/java/gui-binding/numberslider2-small.png"></a></p>
</li>
<li>单击 "Finish"(完成)退出向导并创建窗体。
<p><tt>NumberSliderFrame.java</tt> 应以设计模式在编辑区域中打开。</p>
</li>
<li>从组件面板的 "Swing Controls"(Swing 控件)部分,将一个滑块组件拖至设计区域。(如果 "Palette"(组件面板)窗口未打开,请选择 "Window"(窗口)> "Palette"(组件面板)。)</li>
<li>从组件面板中,将一个文本字段组件拖至设计区域。
<p>生成的窗体可能类似于下面的屏幕快照。不过,对于本示例而言,定位并不重要。</p>
<p class="align-center">
<a href="../../../images_www/articles/80/java/gui-binding/slider-textfield.png" rel="lytebox" title="已在其中添加了滑块和文本字段的窗体"> <img alt="已在其中添加了滑块和文本字段的窗体" border="1" src="../../../images_www/articles/80/java/gui-binding/slider-textfield-small.png"></a></p>
</li>
</ol>
<div class="indent">
<h3>源和目标</h3>
<p>现在我们已经设置了该示例,下面可以创建绑定了。不过,我们首先需要确定哪个组件作为绑定的<i></i>,哪个组件作为绑定的<i>目标</i>。绑定源组件表示绑定属性值的来源。</p>
<p>在 GUI 编辑器中进行绑定时,开始先进行目标绑定,然后在 "Bind"(绑定)对话框中声明绑定源。</p>
<p>在本例中,由于 JSlider 附带一个默认值范围,因此我们将使用它作为源。</p>
<p><b>注:</b>绑定可以是双向的(读/写),这样,在目标中所做的更改可以自动地反映在源中。但是,初始绑定方向始终从源到目标。请参见<a href="#prop-advanced">高级绑定配置</a>一节中有关“更新模式”的信息。</p>
<p><b>将滑块绑定到文本字段:</b></p>
<ol>
<li>右键单击文本字段组件,并选择 "Bind"(绑定)> "text"(文本)以打开 "Bind"(绑定)对话框。</li>
<li>从 "Binding Source"(绑定源)组合框中,选择 <tt>jSlider1</tt></li>
<li>从 "Binding Expression"(绑定表达式)组合框中,选择 <tt>value int</tt>,如下图所示。
<p class="align-center">
<a href="../../../images_www/articles/80/java/gui-binding/bind-dialog.png" rel="lytebox" title="要在 &amp;quot;Binding Source&amp;quot;(绑定源)组合框中选择的值"> <img alt="要在 &amp;quot;Binding Source&amp;quot;(绑定源)组合框中选择的值" border="1" src="../../../images_www/articles/80/java/gui-binding/bind-dialog-small.png"></a></p>
</li>
<li>单击 "OK"(确定)。</li>
</ol>
<p>刚才将滑块的 <tt>value</tt> Bean 属性绑定到了文本字段的 <tt>text</tt> 值。</p>
<p>在设计区域,文本字段应显示值 <tt>50</tt>。此值说明滑块处于中间位置,并且滑块的默认值范围为 0 到 100。</p>
<p>现在可以运行该应用程序并查看工作中的绑定。</p>
<p>选择 "Run"(运行)> "Run File"(运行文件)以运行文件。</p>
<p>应用程序应在单独的窗口中启动。在运行的应用程序中调整滑块,并查看文本字段中值的更改。</p>
<p class="align-center"><img alt="运行应用程序" class="margin-around" src="../../../images_www/articles/80/java/gui-binding/run-numberslider.png"></p>
<!--TODO - note The syntax shown in the
Binding Expression field comes from expression language syntax, which is similar to what is used in JSP and JSF
programming.-->
</div>
<a name="prop-custom"></a>
<h2>绑定定制 Bean</h2>
<p>在上一节中,您绑定了从组件面板添加到窗体的两个标准 Swing 组件的属性。还可以绑定其他 Bean 的属性。不过,要执行此操作,您需要执行一些步骤,让 IDE 用于生成绑定代码的功能使该 Bean 可用。可以采取以下任一方法使 IDE 的绑定功能可用于 Bean:</p>
<ul>
<li>将 Bean 添加到组件面板,以便可以像添加标准 Swing 组件那样将其添加到窗体。</li>
<li>将 Bean 类添加到您的项目并编译该 Bean。</li>
</ul>
<p>将 Bean 添加到“组件面板”窗口:</p>
<ol>
<li>确保编译了 Bean。</li>
<li>选择“工具”>“组件面板”>“Swing/AWT 组件”。</li>
<li>如果要为 Bean 创建新的组件面板类别,请在添加 Bean 之前单击“新建类别”,然后输入所需的名称。</li>
<li>单击“从 JAR 添加”、“从库添加”或“从项目添加”,完成添加 Bean 的向导操作。</li>
</ol>
<p>从项目添加 Bean:</p>
<ol>
<li>在“项目”窗口中,右键单击 Bean 的节点并选择“编译文件”。</li>
<li>将 Bean 拖至窗体。
<p>然后您应在“检查器”窗口中看到此 Bean。接着可以为该 Bean 的任何属性调用“绑定”对话框。</p></li>
</ol>
<a name="prop-advanced"></a>
<h2>高级绑定配置</h2>
<p>本教程第一节中的示例介绍了与某些默认行为的简单绑定。但是,有时您可能希望或需要以不同方式配置绑定。如果是这种情况,则可以使用“绑定”对话框的“高级”标签。</p>
<p>该对话框的“高级”标签中包含以下字段:</p>
<ul>
<li><b>名称</b>。可用于创建绑定的名称,这可以让您更为灵活地管理绑定。该名称将添加到绑定的构造函数中,可使用绑定的 <tt>getName()</tt> 方法来引用它。</li>
<li><b>更新模式</b>。指定保持属性同步的方式。可能的值为:
<ul>
<li><b>始终同步 (读/写)</b>。不论何时对源或目标之一进行了更改,另一个也将更新。</li>
<li><b>只能从源中读取 (只读)</b>。仅在首次设置源值时更新目标。将在目标中更新对源所做的更改。不会在源中更新对目标所做的更改。</li>
<li><b>从源中读取一次 (读取一次)</b>。仅在初始绑定目标和源时才更新目标。</li>
</ul></li>
<li><b>更新源的时间</b>(仅在绑定 JTextField 和 JTextArea 组件的 <tt>text</tt> 属性时才出现此选项)。用于选择同步属性的频率。
</li>
<li><b>忽略调整</b>(仅在绑定 JSlider 的 <tt>value</tt> 属性、JTable 和 JList 的 <tt>selectedElement</tt> 属性以及 JTable 和 JList 的 <tt>selectedElements</tt> 属性时才出现此选项)。如果选中此复选框,则只有在用户完成更改后,才会将某一属性的任意更改应用到另一个属性中。例如,当应用程序用户拖动滑块时,只有在用户松开鼠标按钮后,才会更新滑块的 <tt>value</tt> 属性所绑定的属性值。
</li>
<li><b>转换器</b>。如果绑定涉及到具有不同数据类型的属性,则可以指定在类型之间转换值的代码。Bean 绑定库可处理很多常用转换,但对于其他属性类型的组合,则可能需要提供您自己的转换器。此类转换器需要扩展 <tt>org.jdesktop.beansbinding.Converter</tt> 类。
<p>“转换器”下拉列表中填充了已作为 Bean 添加到窗体中的任何转换器。还可以使用以下方法直接添加转换代码:单击省略号 (...) 按钮,然后从“使用以下内容选择转换器属性”下拉列表中选择“定制代码”。</p>
<p>下面列出了不需要提供转换器的转换:</p>
<ul>
<li>将 BigDecimal 转换为字符串型,将字符串型转换为 BigDecimal</li>
<li>将 BigInteger 转换为字符串型,将字符串型转换为 BigInteger</li>
<li>将布尔型转换为字符串型,将字符串型转换为布尔型</li>
<li>将字节型转换为字符串型,将字符串型转换为字节型</li>
<li>将字符型转换为字符串型,将字符串型转换为字符型</li>
<li>将双精度型转换为字符串型,将字符串型转换为双精度型</li>
<li>将浮点型转换为字符串型,将字符串型转换为浮点型</li>
<li>将整型转换为字符串型,将字符串型转换为整型</li>
<li>将长整型转换为字符串型,将字符串型转换为 BigDecimal</li>
<li>将短整型转换为字符串型,将字符串型转换为短整型</li>
<li>将整型转换为布尔型,将布尔型转换为整型</li>
</ul>
</li>
<li><b>验证器</b>。可用于指定代码以验证在目标属性值中的更改,然后再将该更改传播回源属性。例如,您可以使用验证器确保整型属性值在指定的范围内。
<p>验证器需要扩展 <tt>org.jdesktop.beansbinding.Validator</tt> 类。<br>“验证器”下拉列表中填充了已作为 Bean 添加到窗体中的任何验证器。还可以使用以下方法直接添加验证代码:单击省略号 (...) 按钮,然后从“使用以下内容选择验证器属性”下拉列表中选择“定制代码”。</p></li>
<li><b>空值源值</b>。可用于在尝试绑定时源属性具有<tt></tt>值的情况下指定使用其他值。该字段与 <tt>org.jdesktop.beansbinding.Binding</tt> 类的 <tt>setSourceNullValue()</tt> 方法相对应。</li>
<li><b>不可读源值</b>。可用于在尝试绑定时无法解析绑定表达式的情况下指定使用其他值。该字段与 <tt>org.jdesktop.beansbinding.Binding</tt> 类的 <tt>setSourceUnreadableValue()</tt> 方法相对应。</li>
</ul>
<p class="notes"><b>注:</b>为了更好地了解上面提到的类和方法,可以从 IDE 中直接访问 Bean 绑定 Javadoc 文档。选择“帮助”>“Javadoc 参考”>“Bean 绑定”。在打开的浏览器窗口中,单击 <tt>org.jdesktop.beansbinding</tt> 链接以访问这些类的文档。</p>
<a name="data-binding"></a>
<h2>将数据绑定到组件</h2>
<p>除了同步可视 Swing 组件和其他定制 Bean 的属性之外,还可以使用 Bean 绑定帮助您使用可视组件与数据库交互。在创建新的 Java 窗体并在窗体中添加组件后,您可以生成代码,以便将这些组件绑定到数据上。本节介绍如何将数据绑定到 Swing JTable、JList 和 JComboBox 组件。</p>
<p>在将组件绑定到数据库中的数据之前,您需要完成以下操作:</p>
<ul>
<li>在 IDE 中连接到数据库。</li>
<li>创建一些类,用于表示要绑定的数据库表。下面介绍了创建实体类以便将数据绑定到组件的步骤。</li>
</ul>
<div class="indent">
<h3>创建实体类</h3>
<!--TODO verbiage on creating of entity classes; stuff about foreign keys-->
<p><b>创建实体类以表示要绑定到 JTable 的数据库:</b></p>
<ol>
<li>在 "Projects"(项目)窗口中,右键单击项目并选择 "New"(新建)> "Other"(其他),选择 "Persistence"(持久性)类别,然后选择 "Entity Classes from Database"(通过数据库生成实体类)模板。 </li>
<li>在向导的 "Database Tables"(数据库表)页中,选择数据库连接。</li>
<li>在 "Available Tables"(可用表)列被填充后,选择要在应用程序中使用的表,然后单击 "Add"(添加),以便将表移到 "Available Tables"(选定的表)列中。单击 "Next"(下一步)。
<p class="align-center">
<a href="../../../images_www/articles/80/java/gui-binding/entity-wizard1.png" rel="lytebox" title="已选定 CUSTOMER 和 DISCOUNT_CODE 表"> <img alt="已选定 CUSTOMER 和 DISCOUNT_CODE 表" border="1" src="../../../images_www/articles/80/java/gui-binding/entity-wizard1-small.png"></a></p>
</li>
<li>在该向导的 "Entity Classes"(实体类)页中,确保选中了 "Generate Named Query Annotations for Persistent Fields"(为持久性字段生成已命名的查询标注)和 "Create Persistence Unit"(创建持久性单元)复选框。
<p class="align-center">
<a href="../../../images_www/articles/80/java/gui-binding/entity-wizard2.png" rel="lytebox" title="“通过数据库新建实体类”向导的 &amp;quot;Entity Classes&amp;quot;(实体类)页"> <img alt="“通过数据库新建实体类”向导的 &amp;quot;Entity Classes&amp;quot;(实体类)页" border="1" src="../../../images_www/articles/80/java/gui-binding/entity-wizard2-small.png"></a></p></li>
<li>对生成类的名称及其位置进行任何所需的定制。
</li>
<li>单击 "Finish"(完成)。
<p>在 "Projects"(项目)窗口中,您会看到实体类的节点。</p></li>
</ol>
<h3>将组件绑定到表示数据的 Bean</h3>
<p>本节介绍如何将数据绑定到 JTable、JList 和 JComboBox 组件。</p>
<p><b>将一个数据库表添加到窗体,并自动生成 JTable 以显示数据库表的内容:</b></p>
<ol>
<li>打开 "Services"(服务)窗口。</li>
<li>连接到包含您要添加到窗体的表的数据库。(可以通过右键单击用于数据库连接的节点并选择 "Connect"(连接)以连接到数据库。)
<p class="notes"><b>注:</b>本教程使用 <tt>sample [app on App]</tt> 数据库,通过选择 "Services"(服务)窗口,展开 "Databases"(数据库)节点,右键单击数据库连接节点 (<tt>jdbc:derby://localhost:1527/sample[app on APP]</tt>),然后从上下文菜单中选择 "Connect"(连接),可连接到该数据库。<br> 如果系统提示您提供用户 ID 和口令,请指定 <tt>app</tt> 作为用户 ID,并指定 <tt>app</tt> 作为口令。 </p>
</li>
<li>展开用于连接的节点,并展开其表节点。</li>
<li>将表节点拖到窗体并在拖至表时按住 Ctrl 键。
<p>这将创建 JTable,并将其列绑定到数据库表中的列。</p></li>
</ol>
<p><b>将数据库表绑定到现有的 JTable 组件:</b></p>
<ol>
<li>在 GUI 构建器中右键单击该组件,然后选择 "Bind"(绑定)> "elements"(元素)。
<p class="align-center">
<a href="../../../images_www/articles/80/java/gui-binding/bind-dialog-table.png" rel="lytebox" title="在 &amp;quot;Bind&amp;quot;(绑定)对话框中选定的值"> <img alt="在 &amp;quot;Bind&amp;quot;(绑定)对话框中选定的值" border="1" src="../../../images_www/articles/80/java/gui-binding/bind-dialog-table-small.png"></a></p></li>
<li>单击 "Import Data to Form"(将数据导入窗体)。在 "Import Data to Form"(将数据导入窗体)对话框中,选择要将组件绑定到的数据库表。单击 "OK"(确定)。</li>
<li>在 "Binding Source"(绑定源)组合框中,选择表示实体类结果列表的项。例如,如果调用实体类 <tt>Customer.java</tt>,则列表对象将生成为 <tt>customerList</tt>
<p class="align-center">
<a href="../../../images_www/articles/80/java/gui-binding/source-selected.png" rel="lytebox" title="已选定绑定源"> <img alt="已选定绑定源" border="1" src="../../../images_www/articles/80/java/gui-binding/source-selected-small.png"></a></p>
</li>
<li>将绑定表达式的值保留为<tt>空值</tt></li>
<li>如果不想在 JTable 中显示某些数据库列,请在 "Selected"(选定)列表中选择这些列,然后将它们移到 "Available"(可用)列表中。</li>
<li>选择 "Advanced"(高级)标签进一步配置绑定内容。例如,您可以指定验证器或转换器,或者指定绑定源为空值或不可读时的行为。</li>
<li>单击 "OK"(确定)。</li>
</ol>
<p><b>将数据绑定到 JList 组件:</b></p>
<ol>
<li>在 GUI 构建器中右键单击该组件,然后选择 "Bind"(绑定)> "elements"(元素)。</li>
<li>单击 "Import Data to Form"(将数据导入窗体)。在 "Import Data to Form"(将数据导入窗体)对话框中,选择要将组件绑定到的数据库表。单击 "OK"(确定)。</li>
<li>在 "Binding Source"(绑定源)组合框中,选择表示实体类结果列表的项。例如,如果调用实体类 <tt>Customer.java</tt>,则列表对象将生成为 <tt>customerList</tt>
<p class="align-center">
<a href="../../../images_www/articles/80/java/gui-binding/jlist-binding.png" rel="lytebox" title="已选定绑定源"> <img alt="已选定绑定源" border="1" src="../../../images_www/articles/80/java/gui-binding/jlist-binding-small.png"></a></p></li>
<li>将绑定表达式的值保留为<tt>空值</tt></li>
<li>在 "Display Expression"(显示表达式)下拉列表中,选择表示数据库列的属性,该列包含了要在列表中显示的值。</li>
<li>选择 "Advanced"(高级)标签进一步配置绑定内容。 </li>
<li>单击 "OK"(确定)。</li>
</ol>
<p><b>将数据绑定到 JComboBox 组件:</b></p>
<ol>
<li>右键单击组合框,然后选择 "Bind"(绑定)> "elements"(元素)。</li>
<li>单击 "Import Data to Form"(将数据导入窗体)。在 "Import Data to Form"(将数据导入窗体)对话框中,选择要将组件绑定到的数据库表。单击 "OK"(确定)。</li>
<li>在 "Binding Source"(绑定源)组合框中,选择表示实体类结果列表的项。例如,如果调用实体类 <tt>Customer.java</tt>,则列表对象将生成为 <tt>customerList</tt>
<p class="align-center">
<a href="../../../images_www/articles/80/java/gui-binding/combo-binding.png" rel="lytebox" title="已选定绑定源"> <img alt="已选定绑定源" border="1" src="../../../images_www/articles/80/java/gui-binding/combo-binding-small.png"></a></p></li>
<li>将绑定表达式值保留为<tt>空值</tt>,然后单击 "OK"(确定)。</li>
<li>再次右键单击组合框,然后选择 "Bind"(绑定)> "selectedItem"。</li>
<li>绑定到您希望受用户选择影响的属性。
<p class="align-center"><img alt="要选定的绑定源" border="1" src="../../../images_www/articles/80/java/gui-binding/combo-item.png"></p></li>
<li>单击 "OK"(确定)保存所做的编辑。</li>
</ol>
<p>Bean 绑定库(从版本 1.2.1 起)没有 DetailBinding 类,该类用于指定如何为 JComboBox 派生 <i>display</i> 值。因此,您需要编写一些定制代码。一种方法是编写定制单元格呈现器,如下所示。</p>
<p><b>要正确呈现组合框,请执行以下操作:</b></p>
<ol>
<li>选择组合框。</li>
<li>在 "Properties"(属性)窗口的 "Properties"(属性)标签中,选择呈现属性。</li>
<li>单击省略号 (...) 按钮。</li>
<li>在属性编辑器顶部的组合框中,选择 "Custom Code"(定制代码)。</li>
<li>在文本区域中,输入类似以下内容的代码,其中 <code>jComboBox1</code> 是 JComboBox 实例的名称,<code>MyEntityClass</code> 是实体类,<code>getPropertyFromMyEntityClass()</code> 是实体类中要绑定的属性的 getter。</li>
</ol>
<pre>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;
}
})</pre>
<p class="align-center">
<a href="../../../images_www/articles/80/java/gui-binding/custom.png" rel="lytebox" title="定制单元格呈现器"> <img alt="定制单元格呈现器" border="1" src="../../../images_www/articles/80/java/gui-binding/custom-small.png"></a></p>
<p class="notes"><b>注:</b>您还可以在其自身的源文件中创建定制呈现器,编译文件,将呈现器拖至窗体,然后设置组合框的呈现器属性以使用此 Bean。</p>
</div>
<a name="prop-synth"></a>
<h2>特殊绑定属性</h2>
<p>根据需要,Bean 绑定库可为某些 Swing 组件提供特殊合成属性(这些组件本身没有这些属性)。这些属性表示用于绑定到其他属性的内容,如选定的表行。</p>
<p>下面列出了 Bean 绑定库添加的一组合成属性:</p>
<table border="1" cellpadding="5" cellspacing="0">
<tr class="align-left" class="valign-top">
<th scope="col">组件</th>
<th scope="col">属性</th>
<th scope="col">描述</th>
</tr>
<tbody>
<tr>
<td>AbstractButton</td>
<td>selected</td>
<td>按钮的选定状态。</td>
</tr>
<tr>
<td>JComboBox</td>
<td>selectedItem</td>
<td>JComboBox 的选定项。</td>
</tr>
<tr>
<td rowspan="2">JSlider</td>
<td>value</td>
<td>JSlider 值;通知所有更改。</td>
</tr>
<tr>
<td>value_IGNORE_ADJUSTING</td>
<td>与 "value" 基本相同,但在滑块调整值时不通知更改。</td>
</tr>
<tr>
<td rowspan="4">JList</td>
<td>selectedElement</td>
<td>JList 的选定元素;通知所有更改。如果在 JListBinding 中将 JList 作为目标,则会将单个选定元素报告为绑定源列表中的元素。否则,将该选定元素报告为列表模型中的对象。如果未选择任何内容,则该属性的值为<tt>空值</tt></td>
</tr>
<tr>
<td>selectedElements</td>
<td>JList 的多个选定元素的列表;通知所有更改。如果在 JListBinding 中将 JList 作为目标,则会将多个选定元素报告为绑定源列表中的元素。否则,将这些选定元素报告为列表模型中的对象。如果未选择任何内容,则该属性的值为空列表。 </td>
</tr>
<tr>
<td>selectedElement_IGNORE_ADJUSTING</td>
<td>与 "selectedElement" 基本相同,但在更新列表选定内容时不通知更改。</td>
</tr>
<tr>
<td>selectedElements_IGNORE_ADJUSTING</td>
<td>与 "selectedElements" 基本相同,但在更新列表选定内容时不通知更改。</td>
</tr>
<tr>
<td rowspan="4">JTable</td>
<td>selectedElement</td>
<td>JTable 的选定元素;通知所有更改。如果在 JTableBinding 中将 JTable 作为目标,则会将选定元素报告为绑定源列表中的元素。否则,将选定元素报告为一个映射,其中,键由字符串 "column" 和列索引组成;值为该列的模型值。例如:{column0=column0value,column1=column1value,...} 如果未选择任何内容,则该属性的值为<tt>空值</tt></td>
</tr>
<tr>
<td>selectedElements</td>
<td>JTable 的选定元素的列表;通知所有更改。如果在 JTableBinding 中将 JTable 作为目标,则会将多个选定元素报告为绑定源列表中的元素。否则,将每个选定元素报告为一个映射,其中,键由字符串 "column" 和列索引组成;值为该列的模型值。例如:{column0=column0value, column1=column1value, ...} 如果未选择任何内容,则该属性的值为空列表。
</td>
</tr>
<tr>
<td>selectedElement_IGNORE_ADJUSTING</td>
<td>与 "selectedElement" 基本相同,但在更新表选定内容时通知更改。 </td>
</tr>
<tr>
<td>selectedElements_IGNORE_ADJUSTING</td>
<td>与 "selectedElements" 基本相同,但在更新表选定内容时不通知更改。</td>
</tr>
<tr>
<td rowspan="3">JTextComponent(包括其子类 JTextField、JTextArea 和 JEditorPane)</td>
<td>text</td>
<td>JTextComponent 的 text 属性;通知所有更改(包括键入内容)。</td>
</tr>
<tr>
<td>text_ON_FOCUS_LOST</td>
<td>JTextComponent 的 text 属性;仅在组件不处于焦点状态时通知更改。
</td>
</tr>
<tr>
<td>text_ON_ACTION_OR_FOCUS_LOST</td>
<td>JTextComponent 的 text 属性;仅在组件通知 actionPerformed 或组件不处于焦点状态时通知更改。
</td>
</tr>
</tbody>
</table>
<div class="feedback-box">
<a href="/about/contact_form.html?to=3&amp;subject=Feedback:%20Binding%20Beans%20and%20Data%20in%20Java%20Applications">发送有关此教程的反馈意见</a>
</div>
<br style="clear:both;">
<h2>另请参见</h2>
<ul>
<li><i>使用 NetBeans IDE 开发应用程序</i>中的<a href="http://www.oracle.com/pls/topic/lookup?ctx=nb8000&id=NBDAG2649">使用数据库应用程序和 Bean 绑定</a></li>
<li><a href="gui-functionality.html">构建 GUI 应用程序简介</a></li>
<li><a href="http://java.net/projects/beansbinding/" target="_blank">Beans 绑定 - Java.net</a></li>
<li><a href="http://docs.oracle.com/javase/tutorial/javabeans/index.html" target="_blank">Java 教程的 JavaBeans(tm) 资源</a></li>
<li><a href="http://wiki.netbeans.org/NetBeansUserFAQ#GUI_Editor_.28Matisse.29" target="_blank">GUI 编辑器常见问题解答</a></li>
</ul>
</body>
</html>