面向对象的编程-Application 34

Previously on OOP:

If the second parameter ingroupingBy()collector is written as“TreeMap::new”, we can sort the Map entries according to the ascending order of the key field. Furthermore, to sort the value field of the Map, it is preferred switching to non-Stream approach.

在本文中,本黄鸭会举一个GUI章节的、较为综合性的例子。在前文的例子中,我们的用户界面的计数器非常基础,只能加一或者减一,外加预防了一下“0 - 1 = -1”这种情况。而本文中的calculator能求两个数的和。

首先,在CalculatorMain类中编写main函数,并创建Model, View, and Controller的实例。

三个GUI的重要组成部分的情况如下所示:

在前文的例子中,我们把Model的object reference作为参数传递给了View,但是这里却没有。那么,View和Model之间不能直接通信,即便是Model中计算出了两个数的和,也没有办法直接告诉View,让它来负责显示运算结果。同时,View和Model之间还是可以通过Controller来间接通信的。所以,不论是否把Model的object reference作为参数传递给View,GUI都是可以工作的,可以根据个人喜好来选择。

Model类中有一个attribute,名字叫做calculationValue,用于存放两数相加的结果。这个值应该要显示在用户界面上。

Methods一共有两个,一个是getter,名字叫做getCalculationValue(),可以取得attribute的值;另外一个是addTwoNumbers(),接收两个数据作为参数,然后把这两个数相加,最后赋值给attribute。

在View类中,先创建了好多用户界面上显示的控件,作为attributes。先是写firstNumber的输入框,再是加号,接着是写secondNumber的输入框,“Calculate”按钮,最后是显示计算结果的框子。

在前文中,本黄鸭说过View类的constructor可以有几项艰巨的任务:

在这个constructor中,艰巨的任务基本上都完成了。我们还可以再补充一个窗口的标题,或者选用复杂的控件布局方式。

本段代码的前三个methods都是从用户界面上获取数值,最后一个是把计算的和写到用户界面上去。

addCalculateListener() method给“calculateButton”增加了一个监听器,而监听到的事件的处理,编写在Controller类中。

displayErrorMessage() method能弹出一个显示error message的对话框。

下面是本例的重点,Controller类的代码:

Controller类收到的两个参数分别是View and Model的object references,所以,constructor的第一个任务是把它们存放到Controller类的attributes中去。

这个类现在有一个重大任务,就是:要么实现View and Model之间的间接通信,要么像boss一样管理好这两个类。在Constructor的最后一行,在theView上面加了一个监听器,调用的addCalculateListener()函数已经定义在View类中了,功能是给“calculateButton”加监听器。所以,关键点在于addCalculateListener()的参数,类型是自创CalculateListener类。

CalculateListener类可以定义在Controller类中,作为一个inner class;也可以像其他普通的类一样,新建一个.java文件。

当View类的calculateButton有监听到用户操作时,CalculateListener类的actionPerformed()函数会被执行。这个类有两个attributes,分别记录被加数和加数。

有风险的代码全部都编写在try block中,包括从界面上读取被加数和加数的值,两数相加的运算,还有把运算结果登到用户界面上去。举一个例子,在用户没有输入加数的情况下,从界面上取值就会产生run time Exception。

如果try block的运行中产生了Exception,且类型是NumberFormatException的子类,那么会执行catch block,不仅会在command interface中打出错误信息,而且还会在用户界面中显示规定的字符串。

以上就是Controller类的全部内容。像这样的、用Controller类协调View and Model类的做法是最主流的。

欢迎使用本黄鸭编写的小程序~

微信公众号二维码:

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181116G1FGVD00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券