Previously on OOP:
Controller class served as a coordinator between Model and View classes. And we have made a MVC calculator to compute the summation of two integers.
本文中仍然是MVC pattern的GUI的例子。在这个例子中,Model中存放了许多员工信息,信息的类型是Employee类。特殊的是,这个GUI有两个View classes,也就是有两个窗口。
(1)EmployeeEditViewclass:在这个窗口中可以编辑员工信息,对应的Controller类是EmployeeEditController。
(2)EmployeeDisplayView:在这个窗口中会显示员工信息,并及时反映用户在Edit View class中修改的信息。为了简化,我们规定这个类不支持任何用户交互,所以没有对应的Controller类。
下面,我们先在main函数中把MVC类的实例创建出来:
在本段代码中,EmployeeEditController的实例没有被创建,所以在EmployeeEditView类的代码中,必须有一个创建实例的过程。
另外,本例中的Model有一个method是addContactView(),功能是把EmployeeEditView和EmployeeDisplayView都加入到Model类中去。所以,本例不靠Controller来控制View类,而主要靠Model类。
最后,在RunMVCPattern类中,肯定还定义了一个函数,名叫createGui()。之所以判定在RunMVCPattern类中,是因为调用这个函数没有dotted notation,也就是默认dotted notation前面的object reference是this。下面是这个函数的定义:
先新建一个JFrame的实例,即空的窗口。然后把EmployeeEditView和EmployeeDisplayView的内容加入到新创建的窗口中。再设置窗口的标题,默认关闭动作,等等。最后让窗口画出来,能被用户看见。
addWindowListener()函数的目的是设置默认关闭窗口的动作,一般是在用户关闭窗口的时候,终止程序的执行。这个函数的参数是WindowCloseManager类的实例,而这个类编译器显示找不到,所以我们要自己定义一个,可以使用inner class或者ordinary class。比如:
接下来,我们要编写EmployeeEditView和EmployeeDisplayView这两个View classes。既然它们都是View classes,所以我们可以编写一个abstract class或者interface来作为它们的父类。
refreshEmployeeView()是EmployeeViewInterface中唯一的函数,默认是abstract的,即只有函数头没有函数体,也就所有EmployeeView的子类都必须重载这个函数。
本黄鸭决定先编写没有user interaction的EmployeeDisplayView类。
唯一的attribute的名称是display,类型是JTextArea,在用户界面上可以显示为一段字符串。
View类的constructor有好多项艰巨的任务,都编写在createGui()函数中。本段代码中的createGui()函数和main函数中调用的那个没有关系。
此外,还调用了setEditable()函数,使得EmployeeDisplayView不能被用户编辑。
因为EmployeeDisplayView必须及时反映用户在Edit View class中修改的信息,所以有了refreshEmployeeView()函数,功能是更新displayattribute的内容。可以每秒钟调用一次;或者是EmployeeEditView被用户修改了以后,马上通知Model,再调用这个函数。
欲知后事如何,且听下回分解。
欢迎使用本黄鸭编写的小程序~
微信公众号二维码:
领取专属 10元无门槛券
私享最新 技术干货