在本课中,将启用“我的公司目录”应用程序来添加新的职员记录。
因为对于添加新职员来说,应用程序的行为比较复杂并且是动态的,所以本课具有更高的内在复杂度并且将要求您对源代码进行一些手工更改。另外,本课将演示数据对象的一些高级功能,并且提供了一个具有创意的方法示例,可以借助这些方法使用绑定程序和数据对象来满足您的需要。
以下列表描述应用程序的必需行为:
样本 Web Service 提供了 createNewFullEmployeeRecord 服务,而该服务会提供一个可以使用下一个可用职员标识号填充的新的空白职员记录。然后,可以使用新职员的信息填充此空白记录并将此记录提交回 Web Service。
因为详细信息字段和“更新”按钮需要切换方式(用于执行更新和创建新职员),所以在不同的时候它们需要绑定至两个不同的数据对象。为了便于完成此步骤,将添加名为 switchingDataObject 的基本数据对象。将使用此基本数据对象来切换 selectedEmployeeRecord 与 newEmployeeRecord 之间文本字段的绑定。
即使每个职员详细信息字段已绑定至 selectedEmployeeRecord,现在您也需要将它们绑定至 switchingDataObject。在绑定这些字段之后,根据您是正在修改现有的职员记录还是在添加新的职员记录,可以在字段的数据对象之间动态地进行切换。
以下 updateMode() 方法将检查是否将方式标志设置为新建,然后相应地更改应用程序行为。缺省情况下,布尔值标志 isNewMode 设置为 false,updateMode() 方法会启用职员表、启用过滤器字段并将更新按钮上的文本设置为“更新”。如果 isNewMode 设置为 true,则禁用职员表并清除任何选择、禁用过滤器字段以及将“更新”按钮上的文本设置为“添加”。
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"); } }
在此步骤中,添加单击新建按钮时的事件代码。该事件告知 switchingDataObject 使用 newEmployeeRecord 数据对象、将方式标志设置为“新建”和运行在先前步骤中添加的 updateMode() 方法。
在上一课中,对更新按钮进行了编程以对 Web Service 使用 modifyEmployee 方法。该操作是作为 SwingDataServiceAction 实现的。SwingDataServiceAction 的其中一个属性是源对象,它充当服务的自变量。修改操作的源对象当前设置为 selectedEmployeeRecord。为了对该按钮进行编程以控制更新和添加,将重新配置该按钮的操作以将 switchingDataObject 用作 modifyEmployee 服务的自变量。
在单击更新按钮并对 Web Service 完成操作之后,您想要将应用程序返回到它的缺省方式和行为。为此,将事件侦听器添加在该按钮的操作绑定程序上,该绑定程序将在执行更新或添加之后更新方式并刷新表。
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) {} });