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类的做法是最主流的。
欢迎使用本黄鸭编写的小程序~
微信公众号二维码:
领取专属 10元无门槛券
私享最新 技术干货