面向对象的编程-Application 36

Previously on OOP:

There are two View classes in one GUI. One is responsible for displaying employee information, and the other one is in charge of editing information. In the last article, we have introduced the program inEmployeeDisplayViewclass.

用户在EmployeeEditView class中,可以编辑Employee的信息:姓氏,名字,职位,组织。在attributes的声明之前,我们可以先定义一些常数,即含有“final”关键字的以下这些:

EmployeeEditView类是JPanel的子类,这就从侧面说明了一点:EmployeeEditView和EmployeeDisplayView的父类最好定义为Interface,而不是abstract class,因为一个类只能extends一个abstract class,但是却能implements好多Interfaces。

接下来是attributes的声明:

第一行声明了一个Controller类的实例,因为这个View是有user interaction的,所以有配套的Controller。只是在前文的好几个例子中,都是把View and Model的实例传到Controller类中去,然后用Controller来协调这几个类。从本例中可以看出,MVC pattern的任何一个component都能被加入到其他类中去,开发者可以根据实际情况自行选择。

第二行是四个labels,第三行是四个输入框,都是和员工信息有关的。

最后一行是两个buttons。如果用户点击“update”按钮,确认了员工信息的更新,那么EmployeeDisplayView应该会立即显示更新后的信息。另外,如果用户点击了“exit”按钮,程序的执行会被终止。

EmployeeEditView类的constructor有两种,第一种只接收Model类的实例的object reference作为参数;并且会另外创建一个对应的Controller类的实例。第二种既接收Model类,又接收Controller类的object reference。

本段代码创建了所有attributes的实例。

editPanel的布局是BoxLayout,指定在容器中的控件全部水平放置,和FlowLayout差不多。BoxLayout还可以让控件垂直放置,所以比FlowLayout稍微高级一点点。

然后,editPanel由两个部分组成:labelPaneland fieldPanel。它们两个的布局都是GridLayout,将整个容器划分成一定的行和一定的列,然后再指定控件放在某行某列上。

接着,和editPanel并列的还有一个controlPanel,它包含“update”和“exit”按钮,没有指明布局。另外,这两个按钮还被加上了监听器。

最后,整个EmployeeEditView窗口的布局是BorderLayout,中间区域是editPanel,下面区域是controlPanel。

本段代码中是getters and setters。

在用户点击关闭窗口的时候,程序的执行会被终止。

和EmployeeEditView类绑定的Controller是EmployeeEditController。

这个controller只有两个attributes,分别存放Model and View类的实例的object references。然后,constructor的任务就是给这两个attributes赋值。

当用户操作的来源是View类的“update”按钮时,调用本类的updateModel()函数,把Model类中的员工信息更新一下。当然,这里顺便把EmployeeDisplayView类一起更新以下也是可以的。

这个函数的核心是最后两行代码,用object reference调用Model类中的updateModel()函数,把四项员工信息作为参数传递过去。在调用之前,还会使用本类的isAlphabetic()函数检查一下姓氏和名字是否都由字母构成。

查找作为参数传递进来的input字符串中有没有0-9这10个数字中的任意一个。String类的indexOf()函数可以查找有没有某个字符,在查有此字符的情况下,会返回这个字符的index。如果找到了0-9数字中的任意一个,那么说明输入的姓氏或者名字并不完全由字母构成,也就是不是合法的姓名。

下面是Model中最重要的代码:

在判定员工信息的每一字段都非空之后,调用setters把Model类中的attributes的值改掉,再调用View类的refreshEmployeeView()函数,刷新一下EmployeeDisplayView类中的员工信息。

此外,Model类中存放的attributes有:

(1)员工信息的四个部字段

(2)View类的实例的object reference

有兴趣的宝宝们可以自己编一个完整的Model类~

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

微信公众号二维码:

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181121G1F5DG00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励