< 上一课 | 下一课 >

第 6 课:创建计算结果处理程序

您创建的下一个处理程序 CalculationResultsHandler 将创建一个饼图,用来说明先前创建的逻辑 MortgageCalculatorHandler 所发布的详细信息。

充当两个处理程序之间的调解者的代码是一个 Infobus,它是 com.ibm.egl.rui 项目中的一个 EGL 库。

Infobus 按如下所示进行工作:
  • 预订所指定名称的事件的处理程序(例如,CalculationResultsHandler)。在预订时,此处理程序还会提供发生所指定事件时将接收数据的函数的名称。作为此预订的结果,Infobus 将注册此函数,并维护稍后调用此函数时所需要的详细信息。
  • 在适当的时机,同一处理程序或者另外的处理程序将发布此事件。此处理程序将指定事件名称和特定于事件的数据,并指示 Infobus 调用已注册的此函数。

在本课程中,您从处理这两个步骤中的第二个步骤开始。您将更新先前编写的 MortgageCalculatorHandler 处理程序,以在从远程服务返回新的计算结果时调用 Infobus publish 函数。然后,您将确保 CalculationResultsHandler 处理程序已预订事件。

通过发布和预订可以显示饼图。

发布服务结果

  1. 查找您在上一课中创建的 displayResults() 函数。在 end 语句前面添加以下行:
    InfoBus.publish("mortgageApplication.mortgageCalculated", retResult);
    第一个自变量是事件名称,第二个自变量是传递给已为该事件注册的函数的记录。回想一下,该记录的结构为如下所示:
    record MortgageCalculationResult
       // user input
       loanAmount money;
       interestRate decimal(10, 8);
       term int;
    
       // calculated fields
       monthlyPayment money;
       interest money;
    end

    因为未导入 Infobus 库,所以显示了错误标记。要添加必需的 import 语句,请按 Ctrl+Shift+O 组合键。要除去此错误标记,请保存该文件。

    现在,displayResults() 函数为如下所示:
    function displayResults(retResult MortgageCalculationResult in)
       paymentLabel.text = MortgageLib.formatMoney(retResult.monthlyPayment as STRING);
       inputRec_form.publish();
       hideProcessImage();
       InfoBus.publish("mortgageApplication.mortgageCalculated", retResult);
    	end

    与以前一样,此代码在“还款金额”字段中显示还款金额,并使用 Rich UI MVC 机制在 retResult 记录中发布计算结果。新语句涉及到不同种类的发布,从而使此记录可用于任何预订 mortgageApplication.mortgageCalculated 事件的窗口小部件。

    注: Infobus 事件名称区分大小写。例如,“mortgageApplication”就不同于“MortgageApplication”。
  2. 保存并关闭该文件。

创建 CalculationResultsHandler 处理程序

  1. 在 MortgageUIProject 项目中,右键单击 handlers 包,然后单击新建 > Rich UI 处理程序。执行这些操作可确保新建 EGL Rich UI 处理程序页面将引用此包。
  2. 将源文件名指定为 CalculationResultsHandler,然后单击完成 此处理程序在 Rich UI 编辑器的“设计”视图中打开。
  3. 像您编写计算器时一样,将初始 GridLayout 窗口小部件的大小减小为单个单元格。在“属性”视图的“常规”页面上,将 rows 属性更改为 1,并将 columns 属性更改为 1
  4. 将 PieChart 窗口小部件从选用板的可视化抽屉拖到网格布局的单个单元格上,并为此窗口小部件指定以下名称:
    interestPieChart
    EGL 将显示缺省饼图。
    缺省饼图显示了各种类型的汽车。
  5. 单击编辑器底部的源代码选项卡。
  6. interestPieChart 窗口小部件声明中,将 height 属性更改为 250
  7. 您仅需要饼图中的两个部分。在 interestPieChart 声明的 data 字段中,替换用于声明 PieChartData 记录的四行。以下是新代码:
    new PieChartData{ y=1, text="Principal", 	color="#99ccbb"},
    new PieChartData{ y=0, text="Interest", 		color="#888855"}
    要计算所给定记录在饼图中所占的百分比,请使用该记录的 y 字段值除以各个 y 字段值的总和。在本例中,除式为 1/1,并且初始屏幕显示抵押贷款本金占 100%。在开发时,屏幕只是一个占位符,直到应用程序在运行时处理第一个缺省计算为止。
  8. 通过向 start 函数添加以下行来预订先前所提到的 Infobus 事件:
    InfoBus.subscribe("mortgageApplication.mortgageCalculated", displayChart);
    此代码可确保每当发生所指定的事件时,Infobus 就会调用 displayChart 函数。下一步将除去错误标记。
  9. start 函数后面,按如下所示添加 displayChart 函数,然后通过按 Ctrl+Shift+O 组合键对 import 语句进行组织:
    function displayChart(eventName STRING in, dataObject ANY in)
       localPieData PieChartData[2];
    
       resultRecord MortgageCalculationResult = 
          dataObject as MortgageCalculationResult;
       localPieData = interestPieChart.data;
       localPieData[1].y = resultRecord.loanAmount;
       localPieData[2].y = resultRecord.interest;
       interestPieChart.data = localPieData;
    end
    发生此事件时,displayChart 函数会接收输入数据并将其输入到 dataObject 参数中。使用 ANY 作为参数类型,将确保您可以使用 Infobus 机制来传输任何类型的记录。
    接下来,此函数将按如下所示执行操作:
    • 创建 localPieData 数组,其类型为 PieChartData[],这适合于饼图的 data 属性。
    • 在一个用于将第二个输入参数的类型强制转换为适合于您使用 Infobus 的数据类型的语句中,将接收到的值分配给类型为 MortgageCalculationResult 的记录:
      resultRecord MortgageCalculationResult = 
         dataObject as MortgageCalculationResult;
    • 将饼图的 data 属性(包括颜色详细信息)分配给新的 localPieData 数组。
    • 将接收到的贷款总额和利息值分配给该数组。
    • 通过更新饼图的 data 属性来强制刷新饼图。具体来说,就是将 localPieData 数组分配给该属性。
  10. 保存该文件。如果您在源文件中发现错误,请将您的代码与在第 6 课之后已为 CalculationResultsHandler.egl 完成的代码中的文件内容进行比较。

测试饼图

  1. 切换到“预览”视图。 EGL 将显示缺省饼图,此饼图中显示 100% 的本金。
    整个圆为浅绿色,但词语“本金”以白色显示。
  2. 关闭该文件。

课程复习要点

您已学习如何完成下列任务:
  • 使用 Infobus 库在处理程序之间传递信息。
  • 创建饼图。

在下一课中,您将创建主要处理程序,它使用其他处理程序。

< 上一课 | 下一课 >

反馈