《xx学校图书馆管理系统.pdf》由会员分享,可在线阅读,更多相关《xx学校图书馆管理系统.pdf(65页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、页脚下载后可删除,如有侵权请告知删除!开发背景和需求分析 例 001 图书馆管理系统 1.1 开发背景 高校拥有一个小型图书馆,为全校师生提供一个阅读、学习的空间。近年来,随着生源不断扩大,图书馆的规模也随之扩大,图书数量也相应地大量增加,有关图书的各种信息成倍增加。面对如此庞大的信息量,校领导决定使用一套合理、有效、标准、实用的图书馆管理系统,对校内图书资料进展统一、集中的管理。笔者受该高校的委托,开发一个图书馆管理系统,开发宗旨是实现图书管理的系统化、标准化和自动化,达成图书资料集中、统一管理的目标。1.2 需求分析 图书馆管理系统是图书馆管理工作中不可缺少的局部,对于图书馆的管理者和使用
2、者来说都非常重要,但长期以来,人们使用传统的手工方式或性能较低的图书馆管理系统管理图书馆的日常事务,操作流程比拟繁琐,效率相当低。而一个成功的图书馆管理系统应提供快速的图书信息检索功能、快捷的图书借阅、归还流程,为管理者与读者提供充足的信息和快捷的数据处理手段。笔者通过对一些典型图书馆管理系统的考察,从读者与图书馆管理员的角度出发,本着以读者借书、还书快捷、方便的原那么,要求本系统应具有以下特点。具有良好的系统性能,友好的用户界面。较高的处理效率,便于使用和维护。采用成熟技术开发,使系统具有较高的技术水平和较长的生命周期。系统尽可能简化图书馆管理员的重复工作,提高工作效率。简化数据查询、统计难
3、度。系统设计 视频 001 系统功能概述 例 001 图书馆管理系统 1.1 系统目标 根据以上的需求分析以及与用户的沟通,该系统应到达以下目标。界面设计友好、美观。数据存储平安、可靠。信息分类清晰、准确。强大的查询功能,保证数据查询的灵活性。操作简单易用、界面清晰大方。系统平安、稳定。页脚下载后可删除,如有侵权请告知删除!开发技术先进、功能完备、扩展性强。占用资源少、对硬件要求低。提供灵活、方便的权限设置功能,使整个系统的管理分工明确。1.2 系统功能构造 图书馆管理系统分为 4 大功能模块,分别为“根底数据维护、“图书借阅管理、“新书订购管理、“系统维护。本系统各个局部及其包括的具体功能模
4、块如图 1 所示。图错误!未定义书签。图书馆管理系统功能构造 1.3 系统流程图 图书馆管理系统的系统流程如图 2 所示。图书馆管理新书订购管理图书借阅管理新书订购验收新书图书还书管理图书借书管理图书查询读者信息管理更改密码图书信息管理基础数据维护图书类别管理系统维护用户管理页脚下载后可删除,如有侵权请告知删除!图 2 图书馆管理系统流程图 1.4 系统预览 图书馆管理系统由多个程序界面组成,下面仅列出几个典型界面。读者相关信息添加界面如图 3 所示,该界面用于将读者相关信息添加至数据表中;读者信息修改与删除界面如图 4 所示,该界面用于展示读者相关信息,并且提供了修改与删除功管理员基础数据维
5、护新书订购管理读者相关信息订购相关信息图书类别相关信息图书馆管理系统管理员登录读者信息管理图书类别管理图书信息管理图书相关信息读者图书借阅图书归还图书查询新书订购验收新书系统维护管理更改密码用户管理用户添加用户修改与删除操作员相关信息读者添加读者修改与删除图书类别添加类别修改图书添加图书修改读者信息录入图书借阅管理图书相关信息页脚下载后可删除,如有侵权请告知删除!能。图 3 读者相关信息添加界面 图 4 读者信息修改与删除界面 新书订购管理界面如图 5 所示,主要实现新书订购功能。图书验收界面如图 6 所示,主要实现新书验收功能。页脚下载后可删除,如有侵权请告知删除!图 5 新书订购管理界面
6、图 6 图书验收界面 1.5 构建开发环境 在开发图书馆管理系统时,需要具备下面的开发环境。操作系统:Windows 2003。Java 开发包:。页脚下载后可删除,如有侵权请告知删除!数据库:SQL Server 2000。开发工具:。1.6 文件夹组织构造 在编写代码之前,可以将系统中可能用到的文件夹先创立出来,这样不但方便以后的开发工作,也可以标准系统的整体架构。笔者在开发图书馆管理系统时,设计了如图 7 所示的文件夹架构图。在开发时将所创立的文件保存在相应的文件夹中即可。图 7 图书馆管理系统文件夹组织构造 数据库设计 视频 002 数据库设计 视频 003 创立工程 例 001 图书
7、馆管理系统 1.1 数据库分析 SQL Server 2000 具有很强的完整性与可伸缩性,具有较低的价格比与性能比,考虑到本系统的稳定性与可靠性以及开发程序与用户需求,笔者决定在设计该系统时选择 SQL Server 2000 数据库来满足系统的需求。1.2 数据库概念设计 根据以上对系统所作的需求分析、系统设计,规划出本系统中使用的数据库实体分别为图书信息实体、图书分类实体、图书订购实体、读者信息实体、操作员信息实体、图书借阅信息实体、库存信息实体。其中图书信息实体与图书订购实体、图书分类实体、图书订购实体、图书借阅信息实体、库存信息实体都具有关系,而读者信息实体与图书借阅信息实体同样具有
8、关系。下面将介绍几个关键实体的 E-R 图。图书信息实体 页脚下载后可删除,如有侵权请告知删除!图书信息实体包括图书编号、图书类别编号、书名、作者、译者、出版社、价格、出版时间等属性。其中图书编号为图书信息实体的主键,图书类别编号为图书信息实体的外键,与图书类别实体具有外键关系。图书信息实体的 E-R 图如图 8 所示。图 8 图书信息实体 E-R 图 读者信息实体 读者信息实体包括条形码、姓名、性别、年龄、押金、生日、职业、证件类型、办证日期、最大借书数量、证件号码等属性。读者条形码作为本实体的唯一标识。其中,在性别属性标识信息中,“1代表此读者为男性,“2代表此读者为女性;最大借书数量属性
9、设置默认值为 3;而在证件属性标识信息中,“0代表身份证,“1代表军人证,“2代表学生证,“3代表工作证。读者信息实体的 E-R 图如图 9 所示。图 9 读者信息实体 E-R 图 图书借阅信息实体 图书借阅信息实体包括编号、图书编号、读者编号、操作员编号、是否归还、借阅日期、归还日期等属性。编号作为图书借阅信息实体的唯一标识,它包括两个外键,分别为图书编号与读者编号,图书借阅信息实体以这两个外键与图书信息实体、读者信息实体建立了关系。图书借阅信息实体的 E-R 图如图 10 所示。图 10 图书借阅信息实体 E-R 图 图书分类实体 图书分类实体包括编号、类别名称等属性。图书分类实体与图书信
10、息实体以图书类别编图书编号类别编号书名作者译者出版社价格出版时间读者条形码姓名性别年龄最大借书数量办证日期证件号码电话押金生日职业证件类型图书借阅编号读者编号操作员编号图书编号归还日期借阅日期是否归还页脚下载后可删除,如有侵权请告知删除!号建立了关系。图书分类实体的 E-R 图如图 11 所示。图书订购实体 图书订购实体主要包括图书编号、订购日期、订购数量、操作员、是否验收和折扣等属性。图书订购实体以图书编号与图书信息实体建立了关系。图书订购实体的 E-R 图如图 12所示。图 11 图书分类实体 E-R 图 图 12 图书订购实体 E-R 图 操作员信息实体 操作员信息实体主要包括编号、姓名
11、、性别、年龄、身份证号、工作日期、是否为管理员和密码等属性。其中,性别属性信息中“1代表男性,“2代表女性;是否为管理员属性信息中“0代表当前用户不是管理员,“1代表当前用户是管理员。操作员信息实体的 E-R 图如图 13 所示。图 13 操作员信息实体 E-R 图 库存信息实体 库存信息实体主要包括编号、库存数量等属性。库存信息实体以库存编号与图书信息实体建立了关系。库存信息实体的 E-R 图如图 14 所示。图书订购图书编号是否验收订购数量订购日期折扣操作员操作员编号姓名性别工作日期身份证号电话年龄是否为管理员密码页脚下载后可删除,如有侵权请告知删除!图 14 库存信息实体 E-R 图 1
12、.3 使用 PowerDesigner 建模 在数据库概念设计中已经分析了本系统中主要的数据库实体对象,通过这些实体可以得出数据表构造的根本模型,最终这些实体将被创立成数据表,形成完整的数据构造。笔者使用 PowerDesigner 软件对数据进展建模操作,创立完成的数据库模型如图 15 所示。库存编号库存数量 FK_TB_BOOKI_REFERENCE_TB_BOOKT FK_TB_BORRO_REFERENCE_TB_OPERA FK_TB_BORRO_REFERENCE_TB_BOOKI FK_TB_ORDER_REFERENCE_TB_BOOKI FK_TB_STOCK_REFEREN
13、CE_TB_BOOKI FK_TB_BORRO_REFERENCE_TB_READE tb_stockpile ISBN amount varchar(13)int tb_reader name sex age identityCard date maxNum tel keepMoney zj zy ISBN bztime varchar(10)varchar(2)int varchar(30)datetime int varchar(50)money int varchar(50)varchar(13)datetime tb_order ISBN date number operator c
14、heckAndAccept zk varchar(13)datetime int varchar(6)int float tb_operator id name sex age identityCard workdate tel admin password int varchar(12)varchar(2)int varchar(30)datetime varchar(50)bit varchar(10)tb_borrow id bookISBN operatorId readerISBN isback borrowDate backDate varchar(20)varchar(13)in
15、t varchar(13)int datetime datetime tb_bookType id typeName days fk int varchar(20)int float tb_bookInfo ISBN typeId bookname writer translator publisher date price varchar(13)int varchar(40)varchar(21)varchar(30)varchar(50)smalldatetime money 页脚下载后可删除,如有侵权请告知删除!图 15 图书馆管理系统的数据库模型 公共模块设计 视频 004 编写公共类
16、 例 001 图书馆管理系统 在开发过程中,经常会用到一些公共模块,如数据库连接及操作的类、限制文本框输入长度的类以及描述组合框索引与内容的类等,因此在开发系统前首先需要设计这些公共模块。下面将具体介绍图书馆管理系统中公共模块的设计过程。1.1 数据库连接及操作类的编写 数据库连接及操作类通常包括连接数据库的方法 getConnection()、执行查询语句的方法executeQuery()、执行更新操作的方法 executeUpdate()、关闭数据库连接的方法 close()。下面将详细介绍如何编写图书馆管理系统中的数据库连接及操作的类。步骤如下:1指定类保存的包,并导入所需的类包,本例将
17、其保存到包中。关键代码如下:package;/指定类的包名称 import;/导入进展数据库连接时所使用的 java.sql.Connection 类 import;/导入进展数据库连接时所使用的 java.sql.DriverManager 类 import;/导入进展数据表查询时所使用的 java.sql.ResultSet 类 import;/导入进展数据库操作时捕捉异常使用的 java.sql.SQLException 类 注意:包语句以关键字 package 后面紧跟一个包名称,然后以分号“;完毕;包语句必须出现在 import 语句之前;一个.java 文件只能有一个包语句。2在类
18、的构造方法中创立数据库连接操作。在此类中首先定义数据库连接驱动包名、数据库连接路径、数据库连接用户名、密码等静态变量,然后在构造函数中实现数据库连接操作。在数据库连接代码中需要添加 trycatch 关键字,捕捉数据库连接时可能抛出的异常。关键代码如下:/定义驱动包名称 protected static String dbClassName=com.microsoft.jdbc.sqlserver.SQLServerDriver;protected static String dbUrl=jdbc:microsoft:sqlserver:/localhost:1433;+DatabaseNam
19、e=db_library;SelectMethod=Cursor;/定义数据库连接路径 protected static String dbUser=sa;/定义数据库连接用户名 protected static String dbPwd=;/定义数据库连接密码 protected static String second=null;页脚下载后可删除,如有侵权请告知删除!private static Connection conn=null;/定义一个数据库连接 private Dao()try /捕捉数据库连接异常 if(conn=null)/如果连接为空 Class.forName(dbC
20、lassName).newInstance();/装载 SQL Server 驱动 conn=DriverManager.getConnection(dbUrl,dbUser,dbPwd);/获取数据库连接 else /如果连接不为空 return;/返回 catch(Exception ee)ee.printStackTrace();/捕捉数据库连接异常 3创立执行查询语句的方法 executeQuery,其返回值为 ResultSet 结果集。首先需要初始化 Dao 对象,调用构造函数,从而获取数据库连接。有一点值得注意,就是在创立数据库连接之前首先判断数据库连接是否为空,如果为空再创立数
21、据库连接,防止造成程序资源的浪费。executeQuery 方法的代码如下:private static ResultSet executeQuery(String sql)try /捕捉数据库操作异常 if(conn=null)/数据库连接如果为空 new Dao();return conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,).executeQuery(sql);/返回一个ResultSet结果集 catch(SQLException e)e.printStackTrace();/捕捉异常 return null;finally
22、 页脚下载后可删除,如有侵权请告知删除!调用构造函数创立数据库连接。:常量允许记录指针向前或向后移动,且当 ResultSet 对象变动记录指针时,会影响记录指针的位置。这种类型的设置使结果集受到其他用户所作更改的影响。例如当一个用户正在浏览记录时,其他用户的操作使数据库中的数据发生了变化,这时当前用户所获取的记录集中的数据也会同步发生改变。:这种类型的设置支持对 ResultSet 的动态更新。4创立执行更新操作的方法 executeUpdate(),它的返回值为 int 型的整数,此返回值代表数据表更新操作是否成功,返回 1 代表成功,返回-1 代表没有成功。executeUpdate()
23、方法的关键代码如下:private static int executeUpdate(String sql)try /捕捉数据库操作异常 if(conn=null)/如果数据库连接为空 new Dao();/获取数据库连接 return conn.createStatement().executeUpdate(sql);/进展数据库更新操作 catch(SQLException e)System.out.println(e.getMessage();/打印捕捉的异常 return-1;/返回-1 finally 5 为了防止运行程序时资源的浪费,优化工程运行速度,需要在完成数据库操作后,关闭数
24、据库连接,所以笔者在类中创立了关闭数据库连接的方法 close()。为了使数据库连接在程序完毕后确定会被关闭,在 close()方法中参加了 finally 字段,在 finally 块中将数据库连接置空。关键代码如下:public static void close()try /捕捉异常 conn.close();/关闭数据库连页脚下载后可删除,如有侵权请告知删除!接 catch(SQLException e)e.printStackTrace();/捕捉异常 finally conn=null;/在最终执行块中将数据库连接置空 1.2 MenuActions 类的编写 通常激活同一个命令有
25、多种方式,用户可以通过工具栏中按钮、菜单项选择择特定的功能。在本系统中,最常用的命令就是弹出内部窗体,笔者将本系统中需要弹出的内部窗体命令统一放入 MenuActions 类中,这样触发任何一种组件事件时,都会按照统一的方式处理。Swing 包提供了一个非常有用的机制,用来封装命令,并将其连接到多个事件源,这种机制就是 Action 接口。Action 接口有如下方法:public void actionPerformed(ActionEvent e)public Object getValue(String key)public void putValue(String key,Object
26、 value)public boolean isEnabled()public void setEnabled(boolean b)public void addPropertyChangeListener(PropertyChangeListener listener)public void removePropertyChangeListener(PropertyChangeListener listener)其中第一个方法在实现 ActionListener 接口的程序中经常看到,实际上 Action 接口扩展了 ActionListener 接口。getValue()与 putValu
27、e()方法用来存储与提取动作对象的预定义名称与值。例如:action.putValue(Action.SMALL_ICON,new ImageIcon(*.gif);/将图标存储到动作对象中 表 1 列举了几种常用的动作对象的预定义名称。表 1 动作对象的预定义名称 名 称 值 NAME 名称,显示在按钮或菜单上 SMALL_ICON 小图标,显示在按钮或菜单上 SHORT_DESCRIPTION 简单提示说明,当鼠标放在按钮或菜单上出现提示 LONG_DESCRIPTION 详细提示说明 setEnabled()方法用于开启或禁用动作对象,isEnabled()方法用于检查动作是否启用。实现
28、 Action 接口需要将接口中的所有方法都实现,所以在通常情况下都使用实现该接口的 AbstractAction 类,本系统中的 MenuActions 类正是继承了 AbstractAction 类,在MenuActions 类中只要重写 AbstractAction 类中的 actionPerformed()方法即可。下面以系统中的“更改密码菜单项为例说明 MenuActions 类的编写。以下代码是在MenuActions 类中创立一个内部类,这个内部类用于创立菜单栏中“更改密码菜单项的动作页脚下载后可删除,如有侵权请告知删除!对象,在此类的构造函数中创立组件的提示说明,在 actio
29、nPerformed()方法执行“更改密码窗体的弹出操作。关键代码如下:private static class PasswordModiAction extends AbstractAction PasswordModiAction()putValue(Action.NAME,更改密码);/将菜单项名称设置为“更改密码 putValue(Action.LONG_DESCRIPTION,修改当前用户密码);putValue(Action.SHORT_DESCRIPTION,更换密码);/在“更改密码菜单项显示的提示文字 /putValue(Action.SMALL_ICON,CreatecdI
30、con.add(bookAddtb.jpg);/将图标存储到动作对象中 /setEnabled(false);/使动作禁用 public void actionPerformed(ActionEvent e)if(!frames.containsKey(更改密码)|frames.get(更改密码).isClosed()GengGaiMiMa iframe=new GengGaiMiMa();/初始化更改密码内部窗体 frames.put(更改密码,iframe);Library.addIFame(frames.get(更改密码);/将内部窗体添加到外部窗体中 将此内部类的对象作为 MenuAc
31、tions 类的成员变量,然后再使用 static 定义一个静态区域进展初始化。类在被加载时,首先执行 static 定义的静态区域内部的代码,且只会被执行一次。关键代码如下:public static PasswordModiAction MODIFY_PASSWORD;/修改密码窗体动作 static MODIFY_PASSWORD=new PasswordModiAction();/初始化修改密码内部类对象 同理,菜单栏中其他菜单项与子菜单中的菜单项也是以一样方式被封装到 MenuActions类中。当某个组件需要使用这个动作对象时,以按钮为例,可以使用如下代码实现:JButton bu
32、tton=new JButton(MenuActions.MODIFY_PASSWORD);页脚下载后可删除,如有侵权请告知删除!1.3 限制文本框长度类的编写 在 Swing 语言创立的窗体中,当 JTextField 组件创立时,可以指定文本框的宽度。例如:JPanel panel=new JPanel();/创立面板 JTextField textField=new JTextField(20);/创立文本框 panel.add(textField);/将文本框添加到面板中 但在 JTextField 的构造器中设定的宽度并不是用户能输入的字符个数上限,用户可以在文本框中输入一个更长的字
33、符串,此时需要限制用户输入字符串的长度,笔者创立了限制文本框输入长度的类。创立此类的步骤如下:1创立类,此类继承 PlainDocument 类。关键代码如下:public class MyDocument extends PlainDocument 2在类中创立两个构造函数,其中一个是有参数的,另一个是无参数的。关键代码如下:public MyDocument(int newMaxLength)/设置文本框的最大长度 super();/执行父类构造方法 maxLength=newMaxLength;/将参数赋予类成员变量 public MyDocument()/无参的构造函数 this(10
34、);/将数值 10 赋予类成员变量 3重载父类方法 insertString(),在此方法中限定文本框允许输入字符串长度。关键代码如下:public void insertString(int offset,String str,AttributeSet a)throws BadLocationException if(getLength()+str.length()maxLength)/这里假定限制长度为10 return;/返回 else super.insertString(offset,str,a);页脚下载后可删除,如有侵权请告知删除!4在程序设计中,当需要限制用户输入字符串长度时,
35、可以使用如下代码。JTextField textField=new JTextField(请输入13位书号,13);/初始化文本框 textField.setDocument(new MyDocument(13);/设置“书号文本框最大输入值为 13 位 1.4 描述组合框索引与内容类的编写 在程序编写的过程中,经常会遇到组合框组件的应用。有时要在窗体中的组合框中显示具体内容,通常需要在数据库中存储此组合框的索引值,这时便需要使用一种数据构造将组合框中的内容与索引值联系在一起。形式是比拟好的选择,可以使用 Map 接口中的 put()方法将索引值与具体内容放入集合中,当得到索引值时获取具体内容
36、可以使用 Map 接口中的get(key)方法。描述组合框索引与内容类的编写步骤如下:1创立组合框组件的索引值与其所对应的内容的类,这个类中不仅包含代表组合框索引的成员变量id和代表组合框内容的成员变量name,还包括这两个成员变量的setXXX()、getXXX()方法。关键代码如下:package com.wsy.JComPz;public class Item public String id;/组合框索引值 public String name;/组合框内容 public String getId()/id对应的 getXXX()方法 return id;public void set
37、Id(String id)/id对应的 setXXX()方法 this.id=id;public String getName()/name对应的 getXXX()方法 return name;public void setName(String name)/name对应的 setXXX()方法 this.name=name;public String toString()/重写 Object类中的toString()方法 return getName();页脚下载后可删除,如有侵权请告知删除!id:表示组合框中索引值的变量。name:表示组合框中具体内容的变量。2创立类,使用 Map 关联组
38、合框的索引与组合框的具体内容。这里以图书类别编号与图书类别创立组合框为例,首先在此类中初始化 Map 集合,取图书类别相关内容,将图书类别相关内容放入 Item 类中;然后将图书类别编号与图书类别名称放入 Map 集合中,可以使用 put()方法;最后返回类型为 Map 的集合。关键代码如下:package com.wsy.JComPz;public class MapPz static Map map=new HashMap();/初始化 Map 接口 public static Map getMap()List list=Dao.selectBookCategory();/获取图书类别相关
39、内容 for(int i=0;i list.size();i+)/循环操作 BookType booktype=(BookType)list.get(i);/取得集合中的值 Item item=new Item();/初始化 Item 对象 item.setId(booktype.getId();/将图书类别编号放入 Item 类中 item.setName(booktype.getTypeName();/将图书类别名称放入 Item 类中 map.put(item.getId(),item);/将图书类别编号与 item 对象放入 map return map;/返回集合 3上述代码中用到了
40、中的 selectBookCategory()方法,此方法用于查询图书类别相关信息,首先将数据库查询的相关信息放入 JavaBean 中,然后将 JavaBean 对象添加到 list 集合中,最终将结果以 List 形式返回。关键代码如下:public static List selectBookCategory()List list=new ArrayList();/初始化 List 对象 String sql=select*from tb_bookType;/查询图书类别表 SQL 语句 ResultSet rs=Dao.executeQuery(sql);/执行 SQL 语句,页脚下载
41、后可删除,如有侵权请告知删除!返回 ResultSet 对象 try while(rs.next()/循环结果集 BookType bookType=new BookType();/初始化 BookType 对象 bookType.setId(rs.getString(id);/将数据库中查询 id 值赋予到 JavaBean 中 /将数据库中查询typeName值赋予到JavaBean中 bookType.setTypeName(rs.getString(typeName);bookType.setDays(rs.getString(days);/将数据库中查询 days 值赋予到 Java
42、Bean中 bookType.setFk(rs.getString(fk);/将数据库中查询fk值赋予到 JavaBean 中 list.add(bookType);/将 JavaBean 对象添加到 list 中 catch(Exception e)e.printStackTrace();/捕捉异常 Dao.close();/关闭数据库连接 return list;/将集合返回 sql:查询 tb_bookType图书类别表的全部内容。rs:执行 SQL 语句后返回的 ResultSet 结果集。bookType:实例化 BookType 类对象。1.5 在 JLable 上添加图片类的编写
43、 为了美化窗体,通常需要在窗体上添加图片。一般情况下使用如下方式添加图片:在窗体上添加 Jpanel。在 JPanel 上添加 Jlable。将图片初始化为 ImageIcon 对象。使用 JLabel.setIcon(ImageIcon)代码实现在窗体上添加图片功能。在这里笔者将上述操作封装在公共类中,命名为类,在此类中定义一个返回 ImageIcon类对象的方法,此方法以当前图片的文件名称为参数初始化一个 ImageIcon 类对象。关键代码如下:package com.wsy.util;页脚下载后可删除,如有侵权请告知删除!public class CreatecdIcon public
44、 static ImageIcon add(String ImageName)/返回 ImageIcon 类型的对象 URL IconUrl=Library.class.getResource(/+ImageName);/当前图片的路径 ImageIcon icon=new ImageIcon(IconUrl);/将路径封装到 ImageIcon 对象中 return icon;/返回 icon 对象 说明:Library.class.getResource(/1.jpg)指代的图片为工程名称下的 res 文件下的图片,实际上“/指代的路径为工程名称中的 res 文件。当需要在 JLable
45、中添加图片时,可以使用如下代码。final JLabel headLogo=new JLabel();/创立 Jlable 对象/使用CreadedIcon类中的add()方法返回一个ImageIcon对象 ImageIcon bookModiAndDelIcon=CreatecdIcon.add(bookModiAndDel.jpg);headLogo.setIcon(bookModiAndDelIcon);/设置 Jlable 图片 主窗体设计 视频 005 主窗体设计 例 001 图书馆管理系统 1.1 主窗体概述 管理员通过“系统登录模块的验证后,可以登录到图书馆管理系统的主窗体。系统
46、主窗体主要包括菜单栏、工具栏。用户在菜单栏中单击任一菜单项即可执行相应的功能;工具栏为用户提供了经常使用的功能按钮。主窗体运行效果如图 1 所示。页脚下载后可删除,如有侵权请告知删除!图 1 图书馆管理系统主窗体的运行效果 1.2 主窗体技术分析 系统主窗体主要包括菜单栏与工具栏。单击窗体顶端的菜单栏中的某一菜单项,可以翻开下拉菜单,其中包含菜单项与子菜单项。当用户单击下拉菜单中某一菜单项时,窗体中所有的菜单都会被关闭。图 2 展示了一个典型的菜单栏。图 2 主窗体的菜单栏 在主窗体的设计中,需要创立菜单栏与工具栏,此时用到了 JMenuBar 类与 JToolBar类来创立菜单栏与工具栏。菜
47、单栏的创立比拟简单,使用 JMenuBar 的构造函数初始化菜单栏即可。一般情况下将菜单栏显示在框架顶部。例如:JMenuBar menuBar=new JMenuBar();/创立菜单栏 frame.setJMenu=new JMenu(menuBar);/将菜单栏放入页脚下载后可删除,如有侵权请告知删除!顶层框架 对于每个菜单,需要创立一个对象,实际上就是菜单项名称。例如:JMenu editMenu=new JMenu(图书类别管理);/在菜单栏中创立顶层菜单 最后将顶层菜单添加到菜单栏中,可以使用 JMenuBar 类的 add()方法进展添加。例如:menuBar.add(editM
48、enu);/将顶层菜单添加到菜单栏中 可以在顶层菜单中添加菜单项、分割符与子菜单。其中菜单项可以使用 JMenuItem 类的构造函数进展初始化,然后使用 JMenuBar 类的 add()方法进展添加;分割符可以使用JMenuBar 类的 addSeparator()方法进展添加;子菜单栏实质上也是一个菜单栏,与顶层菜单栏创立方式一样,可以使用 JMenuBar 类的 add()方法将子菜单项添加到顶层菜单中。例如:JMenuItem exit=new JMenuItem(退出);/在菜单栏中创立菜单项 editMenu.add(exit);/将菜单项添加到顶层菜单中 editMenu.ad
49、dSeparator();/添加分割符 JMenu bookTypeAdd=new JMenu(图书添加);/创立子菜单 editMenu.add(bookTypeAdd);/在顶层菜单中添加子菜单 当用户选择一个菜单时,会引发一个动作事件,需要为每个菜单项添加监听器,重写ActionListener 接口中的 actionPerformed()方法,在此方法中为菜单栏添加业务逻辑。例如:exit.addActionListener(new ActionListener public void actionPerformed(final ActionEvent e)/实现 ActionList
50、ener 接口中的 actionPerformed()方法 );注意:这里为菜单项添加监听事件的代码使用了匿名内部类的形式,其优点是可以简化编码,而且在内部类中可以轻易使用外部类定义的局部变量,否那么需要将这些局部变量声明为 final 类型的变量;而其缺点是程序的可读性较差,作为初学者可以不必使用匿名内部类形式创立组件事件。通常情况下,菜单项触发命令通过实现 Action 接口即可。这里笔者设计了公共类,它继承了 AbstractAction 类,由于 AbstractAction 类实现了 Action 接口,所以继承 AbstractAction类就等于实现了 Action 接口,因此这