面向对象的编程-Application 35

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,再调用这个函数。

欲知后事如何,且听下回分解。

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

微信公众号二维码:

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

扫码关注云+社区

领取腾讯云代金券