齐齐哈尔大学毕业设计(论文)
第4章 系统的详细设计与测试
4.1 公共模块设计
在开发过程中,经常会用到一些公共模块,如数据库连接及操作的类、限制文本框输入长度的类以及描述组合框索引与内容的类等,因此,在开发系统前首先需要设计这些公共模块。下面将具体介绍图书管理系统中公共模块的数据过程。
4.1.1 数据库的链接及操作类的编写
数据库连接及操作类通常包括连接数据库的方法getConnection()、执行查询语句的方法executeQuery()、执行更新操作的方法executeUpdate()、关闭数据库链接的方法close()。下面将详细介绍如何编写图书管理系统中的数据库连接及操作的类Dao.java。步骤如下:
1. 指定类dao.java保存的包,并导入所需的包,本例将其保存到com.wsy.dao包中。 2. 在dao.java类的构造方法中创建数据库连接操作。在此类中首先定义数据库连接驱动包名、数据库连接路径、数据库连接用户名、密码等静态变量,然后在构造函数中实现数据库连接操作。在数据库连接代码中需要添加try…catch关键字,捕捉数据库连接时可能抛出的异常。
3. 创建执行查询语句的方法executeQuery(),其返回值为ResultSet()结果集。首先需要初始化Dao对象,调用构造函数,从而获取数据库连接。有一点值得注意,就是在创建数据库连接之前首先判断数据库连接是否为空,如果为空再创建数据库连接,避免造成程序资源的浪费。
4. 创建执行更新操作的方法executeUpdate(),它的返回值为int型的整数,此返回值代表数据表更新操作是否成功,返回值为1代表成功,返回值为-1代表没有成功。
5. 为了避免运行程序时资源的浪费,优化项目运行速度,需要在完成数据库操作后,关闭数据库连接,所以在Dao.java类中创建了关闭数据库连接的方法close()。为了使数据库连接在程序结束后确定会被关闭,在close()方法中加入了finally()字段,在finally块中将数据库连接置空。
4.1.2 MenuActions类的编写
通常激活同一个命令有多种方法,用户可以通过工具栏中按钮、菜单选择特定的功能。在本系统中,最常用的命令就是弹出内部窗体,将本系统中需要弹出的内部窗体命令统一放入MenuActions类中,主要触发任何一种组件事件时,都会按照统一的方式处理[10]。
13 13
齐齐哈尔大学毕业设计(论文)
Swing包提供了一个非常有用的机制,用来封装命令,并将其连接到多个事件源,这种机制就是Action接口。Action接口有如下方法:
1. puclic void actionPerformed(ActionEvent e) 2. public Object getValue(String key)
3. public void putValue(String key, Object value) 4. public boolean isEnabled()
5. public void setEnabled(boolean b)
6. public void addPropertyChangeListener(PropertyChangeListener listener) 7. public void removePropertyChangeListener(PropertyChangeListener lsn)
其中第一个方法用来实现ActionListener的接口程序,实际上Action接口扩展了ActionListener接口。getValue()与putValue()方法用来存储与提取动作对象的预定义名称与值。
下表列举了几种常用的动作对象的预定义名称。
表4.1 动作对象表
名 称 NAME SMAIL_ICON SHORT_DESCRIPTION LONG_DESCRIPTION
值
名称,显示在按钮或菜单上 小图标,显示在按钮或菜单上
简单提示说明,当鼠标放在按钮或菜单上出现提示
详细提示说明
setEnabled()方法用于开启或禁止动作对象,isEnabled()方法用于检查动作是否启用。 实现Action接口需要将接口中的所有方法都实现,所以在通常情况下都是使用实现该接口的AbstractAction类,本系统中的MenuActions类继承了AbstractAction类,在MenuActions类中只要重写AbstractAction类中的actionPerformed()方法。
在系统中的“更改密码”菜单项采用了MenuActions类的编写。在MenuActions类中创建一个内部类,这个内部类用于创建菜单栏中“更改密码”菜单项的动作对象,在此类的构造函数中创建组件的提示组件提示说明,在actionPerformed()方法执行“更改密码”窗体的弹出操作。
将此内部类的对象作为MenuActions类的成员变量,然后再使用static定义一个静态区域进行初始化。类在被加载时,首先执行static定义的静态区域内部的代码,且只会被执行一次。
同理,菜单栏中其他菜单项与子菜单中的菜单项也是以相同方式被封装到MenuActions类中。
4.1.3 限制文本框长度类的编写
在Swing语句创建的窗体中,当JTxetField组件创建时,可以指定文本框的宽度。 但当JTextField的构造器中设定的宽度并不是用户能输入的字符个数上限,用户可以在
14 14
齐齐哈尔大学毕业设计(论文)
文本框中输入一个更长的字符串,此时需要限制用户输入字符串的长度,故创建了限制文本框输入长度的类MyDocument.java。创建此类的具体步骤如下:
1. 创建MyDocument.java类,此类继承PlainDocument类。
2. 在MyDocument.java类中创建两个构造函数,其中一个是有参数的,另一个是无参数的。
3. 重载父类方法inserStrng(),在此方法中限定文本框允许输入字符串长度。
4.1.4 描述组合框索引与内容类的编写
在程序编写的过程中,经常会遇到组合框组件的应用。有时要在窗体的组合框中显示具体内容,通常需要在数据库中存储此组合框的索引值,这时便需要使用一种数据结构将组合框中的内容与索引值联系在一起。Java.util.Map形式是比较好的选择,可以使用Map接口中的put()方法将索引值与具体内容放入集合中,当得到索引值时获取具体内容可以使用Map接口中的get(key)方法。描述组合框索引与内容类的编写步骤如下:
1. 创建组合框组件的索引值与其所对应的内容的Item.java类,这个类中不仅包含代表组合框索引的成员变量id和代表组合框内容的成员变量name,还包括着两个成员变量的setXXX()、getXXX()方法。
2. 创建MapPz.java类,使用Map关联组合框的索引与组合框的具体内容。这里以图书类别编号与图书类别创建组合框为例,首先在此类中初始化Map集合,获取图书类别相关内容,将图书类别相关内容放入Item类中;然后将图书类别编号与图书类别名称放入Map集合中,可以使用put()方法;最后返回类型为Map的集合。
4.1.5 在JLable上添加图片类的编写
为了美化窗体,通常需要在窗体上添加图片。一般情况下使用如方式下添加图片: 1. 在窗体上添加JPanel 2. 在JPanel上添加JLable 3. 将图片初始化为ImageIcon对象
4. 使用JLable.setIcon(ImageIcon)代码实现在窗体上添加图片功能
将上述操作封装在公共类中,命名为CreatecdIcon.java类,在此类中定义一个返回ImageIcon类对象的方法,此方法以当前图片的文件名称为参数初始化一个ImageIcon类对象。
4.2 主窗体的设计
4.2.1 主窗体概述
管理员通过“系统登录”模块的验证后,可以登录到图书管理系统的主窗体。系统主窗体主要包括菜单栏、工具栏。用户在菜单栏中单击任一菜单栏执行相应的功能;工
15 15
齐齐哈尔大学毕业设计(论文)
具栏为用户提供了经常使用的功能按钮。
图4-1 主窗体界面图
4.2.2 主窗体技术分析
系统主窗体主要包括菜单栏与工具栏。
单击窗体顶端的菜单栏中的某一菜单项,可以打开下拉菜单,其中包含菜单项与子菜单项。当用户单击下拉菜单中某一菜单项时,窗体中所有的菜单都会被关闭。
在主窗体的设计中,需要创建菜单栏与工具栏,此时用到了JMenuBar类与JToolBar类来创建菜单栏和工具栏。
1. 菜单栏的创建比较简单,使用JMenuBar的构造函数初始化菜单栏,对于每个菜单,需要创建一个对象,就是菜单项名称,最后将顶层菜单添加到菜单栏中,可以使用JMenuBar类的add()方法进行添加。
在顶层菜单中添加菜单项、分隔符与子菜单。其中菜单项可以使用JMenuItem类的构造函数进行初始化,然后使用JMenuBar类的add()方法进行添加;分隔符可以使用JMenuBar类的addSeparator()方法进行添加[11];子菜单栏实质上也是一个菜单栏,与顶层菜单栏创建方式相同,可以使用JMenuBar类的add()方法将子菜单项添加到顶层菜单中。
当用户选择一个菜单时,会引发一个动作事件,需要为每个菜单项添加监听器,重写ActionListener接口中的actionPerformed()方法,在此方法中为菜单栏添加业务逻辑。
16 16