< 上一课 | 下一课 >

课程 2.6:设置操作和绑定以添加新职员

在本课中,将启用“我的公司目录”应用程序来添加新的职员记录。

因为对于添加新职员来说,应用程序的行为比较复杂并且是动态的,所以本课具有更高的内在复杂度并且将要求您对源代码进行一些手工更改。另外,本课将演示数据对象的一些高级功能,并且提供了一个具有创意的方法示例,可以借助这些方法使用绑定程序和数据对象来满足您的需要。

以下列表描述应用程序的必需行为:

  • 当您单击新建按钮时,将发生以下行为:
    • 清除对职员表的选择并且禁用该表。
    • 清除选择表会导致删除按钮被禁用。
    • 禁用过滤器字段。
    • 清除详细信息字段的任何值(除了新的职员标识之外)。
    • 更新按钮上的文本将切换为添加
  • 当您单击添加按钮时,将发生以下行为:
    • 将输入到详细信息字段中的值添加至目录作为新的职员记录。
    • 启用表并刷新值。
    • 启用过滤器字段。
    • 添加按钮上的文本将切换回更新

添加调用 createNewFullEmployeeRecord() 的新的数据源数据对象

样本 Web Service 提供了 createNewFullEmployeeRecord 服务,而该服务会提供一个可以使用下一个可用职员标识号填充的新的空白职员记录。然后,可以使用新职员的信息填充此空白记录并将此记录提交回 Web Service。

  1. 在 Java 可视编辑器的选用板上,展开“数据对象”抽屉并选择数据源数据对象
  2. 将鼠标指针移至设计视图的空白区域或自由格式区域上并左键单击以放下数据源数据对象。将添加新的数据源数据对象并且将在自由格式区域上显示它。

    自由格式区域上的数据源数据对象。未配置。

  3. 右键单击数据源数据对象并选择重命名字段。将该数据对象重命名为 newEmployeeRecord
  4. 右键单击 newEmployeeRecord 数据对象并选择绑定属性。“数据绑定”对话框打开。
  5. 数据源字段中,选择 webServiceDataSource。
  6. 服务字段中,选择 createNewFullEmployeeRecord()。
  7. 单击确定
在自由格式区域上,您可以看到 newEmployeeRecord 数据源数据对象已绑定至 Web Service。

newEmployeeRecord 数据对象,已连接至 webServiceDataSource

添加基本数据对象以便于切换数据对象

因为详细信息字段和“更新”按钮需要切换方式(用于执行更新和创建新职员),所以在不同的时候它们需要绑定至两个不同的数据对象。为了便于完成此步骤,将添加名为 switchingDataObject 的基本数据对象。将使用此基本数据对象来切换 selectedEmployeeRecord 与 newEmployeeRecord 之间文本字段的绑定。

新的基本数据对象只指向在前面的课程中定义的另一个数据对象(selectedEmployeeRecord)。当您创建一个方法来告知此基本数据对象使用先前创建的 newEmployeeRecord 的方法时,这个新的数据对象将很有用。换句话说,此基本数据对象将用作中间数据对象,它可以在 selectedEmployeeRecord 数据对象与 newEmployeeRecord 数据对象之间进行切换,从而使应用程序中的可视组件能够使用两个不同的数据对象。
  1. 在可视编辑器选用板上,选择基本数据对象并将它放到自由格式区域上。这就添加了 basicDataObject。

    自由格式区域上的基本数据对象,未配置

  2. 将该数据对象重命名为 switchingDataObject
  3. 在 switchingDataObject 的“属性”视图中,将 sourceObject 属性设置为 selectedEmployeeRecord。可以从该属性的“值”列的下拉菜单中,选择 selectedEmployeeRecord。

    现在,switchingDataObject 指的是 selectedEmployeeRecord 并且反映相同的值:

    自由格式区域上的 switchingDataObject,已连接至 selectedEmployeeRecord 数据对象

将每个职员字段重新绑定至 switchingDataObject

即使每个职员详细信息字段已绑定至 selectedEmployeeRecord,现在您也需要将它们绑定至 switchingDataObject。在绑定这些字段之后,根据您是正在修改现有的职员记录还是在添加新的职员记录,可以在字段的数据对象之间动态地进行切换。

对于职员详细信息部分中的每个字段,请完成下列步骤:
  1. 选择字段并单击绑定选项卡。
  2. 在“字段数据绑定”对话框中,选择 switchingDataObject。前面已将这些字段绑定至 selectedEmployeeRecord。

    显示 lastNameField 已绑定至 switchingDataObject 上的 lastName 属性的“字段数据绑定”对话框

  3. 确保该字段仍然绑定至正确的数据对象属性并单击确定。如果在设计视图上选择该字段,则可以看到绑定程序线现在指向 switchingDataObject。

    绑定至 switchingDataObject 的详细信息字段

定义更新方式和切换方式的标志和方法

以下 updateMode() 方法将检查是否将方式标志设置为新建,然后相应地更改应用程序行为。缺省情况下,布尔值标志 isNewMode 设置为 false,updateMode() 方法会启用职员表、启用过滤器字段并将更新按钮上的文本设置为“更新”。如果 isNewMode 设置为 true,则禁用职员表并清除任何选择、禁用过滤器字段以及将“更新”按钮上的文本设置为“添加”。

将以下代码添加至 DirectoryApp.java 类中最后一个右花括号的前面:
private boolean isNewMode = false;
private void updateMode() {
   if (isNewMode) {
      		getEmployeesTable().clearSelection();
      		getEmployeesTable().setEnabled(false);
      		getFilterField().setEditable(false);
      		getUpdateCreateButton().setText("Add");
           } else {
      		getEmployeesTable().setEnabled(true);
      		getFilterField().setEditable(true);
      		getUpdateCreateButton().setText("Update");
   }
}

将 actionPerformed 事件添加至“新建”按钮

在此步骤中,添加单击新建按钮时的事件代码。该事件告知 switchingDataObject 使用 newEmployeeRecord 数据对象、将方式标志设置为“新建”和运行在先前步骤中添加的 updateMode() 方法。

  1. 在设计视图中,右键单击新建按键,并选择事件 > actionPerformed。以下代码是在 getNewButton() 方法中生成的:
    newButton.addActionListener(new java.awt.event.ActionListener() {
          public void actionPerformed(java.awt.event.ActionEvent e) {
          System.out.println("actionPerformed()"); // TODO Auto-generated Event stub actionPerformed()
       }
    });
  2. 将此生成的存根替换为下面的代码:
    newButton.addActionListener(new java.awt.event.ActionListener() {
          public void actionPerformed(java.awt.event.ActionEvent e) {
          getSwitchingDataObject().setSourceObject(getNewEmployeeRecord());
                getNewEmployeeRecord().refresh();
                isNewMode = true; //sets application to new mode
                updateMode(); //changes UI according to new mode
          getLastNameField().grabFocus();   }
    });

重新绑定“更新”按钮

在上一课中,对更新按钮进行了编程以对 Web Service 使用 modifyEmployee 方法。该操作是作为 SwingDataServiceAction 实现的。SwingDataServiceAction 的其中一个属性是源对象,它充当服务的自变量。修改操作的源对象当前设置为 selectedEmployeeRecord。为了对该按钮进行编程以控制更新和添加,将重新配置该按钮的操作以将 switchingDataObject 用作 modifyEmployee 服务的自变量。

  1. 在设计视图中,选择更新按钮。注意,粉红的虚线箭头显示 selectedEmployeeRecord 是服务调用的自变量。
  2. 单击更新按钮上的绑定选项卡。
  3. 自变量字段中,选择 switchingDataObject。

    “更新”按钮的“组件操作绑定”现在使用 switchingDataObject

  4. 单击确定

    现在,注意该按钮的操作已配置为将 switchingDataObject 用作 modifyEmployee 方法的自变量:

    已绑定至 Web Service 且将 switchingDataObject 作为自变量的“更新”按钮

将事件添加至“更新”按钮的绑定程序以复位方式

在单击更新按钮并对 Web Service 完成操作之后,您想要将应用程序返回到它的缺省方式和行为。为此,将事件侦听器添加在该按钮的操作绑定程序上,该绑定程序将在执行更新或添加之后更新方式并刷新表。

对“更新”按钮的 getModifyEmployeeAction() 方法添加以下代码:
modifyEmployeeAction.addActionBinderListener(
  new jve.generated.IActionBinder.ActionBinderListener() { 
       public void afterActionPerformed(jve.generated.IActionBinder.ActionBinderEvent e) {
      if (isNewMode) {
                 //Go back to using the selectedEmployeeRecord
                 getSwitchingDataObject().setSourceObject(getSelectedEmployeeRecord());
                 //Revert out of new mode
                 isNewMode = false;
                 updateMode();
      }
            // Refresh the table's data object
      getLightEmployeeRecordRows().refresh();    }
       public void beforeActionPerformed(jve.generated.IActionBinder.ActionBinderEvent e) {}
});

课程要点

现在,当您运行“我的公司目录”应用程序时,可以单击新建按钮并添加新的职员记录。

< 上一课 | 下一课 >