Java语言程序设计教学课程设计项目——蓝梦集团即时通讯(IM)系统实现(第3部分)
《J2EE系统架构和程序设计》课程设计实训项目——蓝梦网上商店系统概要设计说明书

《J2EE系统架构和程序设计》课程设计实训项目——蓝梦网上商店系统概要设计说明书1.1.1编写目的将软件系统需求转换为未来系统的设计,逐步开发强壮的系统构架,并使设计适合于实施环境,为提高性能而进行设计和为程序开发步骤配置提供指导。
因此,本设计说明书作为《蓝梦网上商店系统》项目开发的依据和规范,并作为开发任务及目标依据和规范系统开发操作,《蓝梦网上商店系统》网站的开发内容及达到的各项功能及性能指标以此设计说明书为准。
本设计文档描述了整个系统的架构以及业务逻辑实现时应遵循的步骤,文档的预期读者主要包括:项目管理人员、系统设计人员与程序编写人员、测试人员、用户手册编写人员、客户、系统维护人员和项目评审人员等。
1.1.2系统总体设计1、系统主要的特色(1)系统基于J2EE架构设计将界面表示、业务务逻辑和数据层相对分离,使系统结构更加合理;采用成熟的J2EE 架构,使系统具有较好的维护性。
(2)采用中间件的负载平衡、动态伸缩等功能为关键业务建立了最佳的运行环境,为应用提供了充分的扩展余地。
(3)以Browser(浏览器)为核心的客户端程序实现了真正意义上的“零维护”,从而使业务软件的更新、发布和维护更为容易。
(4)系统的外部接口采用XML数据交换格式降低系统间偶合度,确保数据交换与具体应用平台无关。
(5)系统采用个性化的权限管理和界面显示具体的用户只看到整个系统的一部分,即只有用户具有操作权限的模块,对该用户才是可见的,不具有操作权限的部分是不可见,因此,每个用户只看到整个界面树的一个子集,系统菜单动态生成。
2、系统运行环境(1)软件环境(2)硬件环境(3)开发环境1)服务器软件环境2)服务器硬件环境3)开发机器软件环境4)开发机器硬件环境3、系统功能层次结构4、系统中所应用的关键技术与算法(1)本系统采用JSP+JavaBeans实现JSP 即Java Server Pages,它是Serverlet的直接扩展,JSP框架的目标是将应用逻辑同表示分离,它旨在允许非JA V A开发人员用下列方式设计JSP 页面:1)HTML标记。
《J2EE系统架构和程序设计》课程设计实训项目——蓝梦集团网上求职招聘系统项目系统设计评审总结报告说明书

《J2EE系统架构和程序设计》课程设计实训项目——蓝梦集团网上求职招聘系统项目系统设计评审总结报告说明书1.1.1系统设计评审会议记录1、会议时间XX月XX日2、会议人员张三(组长),李四(组员),王五(组员)3、会议地点教学楼4064、会议目的本次设计和开发评审会议的目的是小组全体人员对软件设计的技术文档进行评价,以判断确定设计和开发能否实现软件产品预先定义的规格,同时通过评审标识出与规格和标准的偏差,它向管理部门提供充足的证据以证明:1)设计是否符合了其规格要求;2)设计是否满足相关法律、法规以及企业标准的要求;3)软件产品的更改得到了恰当地实施;4)软件产品的更改只对那些规格发生了更改的系统区域有影响,没有引入新的问题5、会议讨论范围会议讨论对软件设计和开发的原始设计以及设计与开发的更改进行评审。
6、角色和职责(1)主审人主审人是技术评审的指挥人员,负责评审活动的组织、结论、书面报告和问题跟踪,主审人由张三同志承担。
(2)评审专家评审专家应由满足要求的技术人员担任,负责向评审组成员提出自己的评审意见和建议。
评审专家是由李四、王五同志承担。
(3)质量保证人员由杨六同志承担。
(4)会议记录员由赵七同志承担。
(5)顾客和用户代表由章八、王九同志承担。
(6)相关领导和部门管理人员无。
7、评审时机在项目的详细设计文档出来后,由项目开发组长和技术总工共同组织本项目的设计评审会议,对项目的设计结果进一步理性地思考,对项目的设计结果(架构和类)进一步完善和重构,并考虑如何应用有关的设计模式(架构和编程实现等方面)优化系统的设计以最终达到系统的可扩展性、可维护性。
8、评审的基本要求(1)项目的设计评审会议在本次执行,不排除在项目开发过程中出现变动,再次召开评审会议的可能。
(2)评审结论应明确;(3)评审资料应及时归档。
9、评审依据(1)立项说明书,软件需求规格说明书,软件概要设计文档和软件详细设计文档。
(2)软件设计文档国家标准GB8567—88 中的相关规定。
《J2EE系统架构和程序设计》课程设计实训项目——带有即时通讯功能的BBS系统的界面设计说明书

《J2EE系统架构和程序设计》课程设计实训项目——带有即时通讯功能的BBS系统的界面设计说明书1.1.1用户界面设计规范1、概念和定义(1)用户界面又称人机界面,实现用户与计算机之间的通信,以控制计算机或进行用户和计算机之间的数据传送的系统部件。
(2)GUI即图形用户界面,一种可视化的用户界面,它使用图形界面代替正文界面。
2、用户群体假定——将使用本系统的用户定义为如下对浏览器或计算机的一般用法有一定了解,用户希望界面符合一般BBS风格,聊天系统符合现有即时聊天工具共性(特别是腾讯QQ聊天界面),对易用性、简洁性有比较高的要求。
3、用户界面设计原则本系统坚持图形用户界面(GUI)设计原则,界面直观、对用户透明:用户接触网站后对页面上对应的功能一目了然、不需要培训就可以方便使用本BBS系统。
此外,本系统采用传统BBS风格,易于用户操作。
页面风格以简洁为主。
其中系统的聊天功能页面风格坚持与现有通用即时聊天功能近似。
各功能需要直接在页面列出。
4、界面设计一致性的设计原则在本系统界面设计中的具体体现在界面设计中应该保持界面的一致性。
一致性既包括使用统一的界面元素、标准的控件,也包括使用相同的信息表现方法;如在字体、标签风格、颜色、术语、显示错误信息等方面确保一致。
(1)显示信息一致性标准1)标签提示:字体为不加重、Tahoma、黑色、蓝底或透明、无边框、右对齐、不带冒号、一般情况为12px;2)日期:正常字体、Tahoma、白底黑字、3-D lowered;3)对齐方法:左对齐:一般文字、单个数字、日期等右对齐:数字、时间、日期加时间。
4)界面风格支持多种分辨率。
5)字体缺省为Tahoma、12px、黑色6)底色缺省采用灰色这些信息的排列显示风格供参考, 在同一个应用系统中,如果这些信息的表现方式不一致,会使得用户分散注意力,最终会影响对本应用系统的使用效果,因此开发者应当注意在本应用系统中的各种表现形式的一致性。
Java语言程序设计的课程设计项目——应用Java网络技术实现的即时通迅IM项目的完整实现实例(第3部分)

1.1应用Java网络技术实现的即时通迅IM项目的完整实现实例(第3部分)1.1.1调整客户端程序的结构1、分离客户端主功能程序为两个不同的类——功能类(不包含main())和启动类(包含main())(1)为SocketClientInterface接口提供一个新的实现类(功能类),类名称为SocketClientImple(2)编程该类中的各个方法package com.px1987.imsystem.socketclient;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintStream;import .Socket;import .UnknownHostException;public class SocketClientImple implements SocketClientInterface {private String serverSocketListenerHostName="127.0.0.1";private int serverSocketListenerPort=3721;private Socket clientSocket=null;// private DataInputStream clientSocketInputStream=null;private BufferedReader clientSocketInputStream=null;private PrintStream clientSocketOutputStream=null;public SocketClientImple() {}@Overridepublic void closeAllStreamAndSocket() {try {clientSocketInputStream.close();} catch (IOException e1) {System.out.println("不能正确地关闭Socket输入流,可能是客户端程序出现了错误");}clientSocketOutputStream.close();try {clientSocket.close();} catch (IOException e) {System.out.println("不能正确地关闭Socket客户对象,可能是客户端程序出现了错误");}}public void connectToServer() {try {clientSocket=new Socket(serverSocketListenerHostName,serverSocketListenerPort);} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {System.out.println("不能正确地连接服务器,可能是服务器没有启动或者IP有错");}}@Overridepublic void getSocketInputAndOutputStream() {try {clientSocketInputStream=new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));} catch (IOException e) {System.out.println("不能正确地获得客户端的输入流,可能是服务器已经关闭");}try {clientSocketOutputStream=new PrintStream(clientSocket.getOutputStream());} catch (IOException e) {System.out.println("不能正确地获得客户端的输出流,可能是服务器已经关闭");}}boolean stopRequest=true;public void sendRequestAndGetResponseFromServer() {// DataInputStream keyBoardInputStream;BufferedReader keyBoardInputStream;String userInputTextFromKeyBoard=null;String someResultTextFromServer=null;while(stopRequest){//获得键盘输入System.out.print(":");keyBoardInputStream = new BufferedReader(new InputStreamReader(System.in));try {userInputTextFromKeyBoard = (keyBoardInputStream.readLine()).trim();} catch (IOException e) {e.printStackTrace();}//识别输入的字符串是否为“exit”if(!userInputTextFromKeyBoard.equals("exit")){clientSocketOutputStream.println(userInputTextFromKeyBoard);try {someResultTextFromServer = clientSocketInputStream.readLine();System.out.println("服务器返回来的信息:"+someResultTextFromServer);} catch (IOException e) {e.printStackTrace();}if(someResultTextFromServer!=null){System.out.println(someResultTextFromServer);}else{System.out.println("服务器已经关闭了,客户程序也自动退出");break;}}else{System.out.println("客户端程序正在退出!");break;}}}}2、修改IMSystemSocketClientApp类(1)不再需要实现SocketClientInterface接口public class IMSystemSocketClientApp implements SocketClientInterface {}(2)最后的代码如下package com.px1987.imsystem.socketclient;public class IMSystemSocketClientApp{public IMSystemSocketClientApp() {}public static void main(String[] args) {SocketClientInterface oneSocketClient=new SocketClientImple();try{oneSocketClient.connectToServer();oneSocketClient.getSocketInputAndOutputStream();oneSocketClient.sendRequestAndGetResponseFromServer();}finally{oneSocketClient.closeAllStreamAndSocket();}}}3、最后再测试现在的效果1.1.2调整服务器端程序的结构1、分离服务器端主功能程序为两个不同的类——功能类(不包含main())和启动类(包含main())(1)为IMSystemSocketServerInterface接口提供一个新的实现类,类名称为IMSystemSocketServerImple(2)编程该类的代码package com.px1987.imsystem.socketserver;import java.io.IOException;import .ServerSocket;import .Socket;import com.px1987.imsystem.thread.HandlerClientRequestByMultiThread;public class IMSystemSocketServerImple implements IMSystemSocketServerInterface { private int serverSocketListenerPort=3721; //Socket服务器所监听的端口号private ServerSocket oneServerSocket=null;public IMSystemSocketServerImple(){}@Overridepublic void createSocketServer() {try {oneServerSocket=new ServerSocket(serverSocketListenerPort);} catch (IOException e) {System.out.println("不能正确地创建服务器,可能是服务器已经启动了,不需要重复启动");}serverSocketListenerPort=oneServerSocket.getLocalPort();System.out.println("服务器正在"+serverSocketListenerPort+"端口进行监听");}private boolean isServerListening=true;@Overridepublic void listeningClientSocketRequest() {while(isServerListening){Socket requestClientSocket=null;try{requestClientSocket=oneServerSocket.accept(); //(2)//Accept()方法直到接收到用户的连接请求,才继续执行中断的执行程序}catch(IOException e){System.err.println("对端口"+serverSocketListenerPort+"的监听出现了错误");continue;}Thread oneThreadInstance=new HandlerClientRequestByMultiThread(requestClientSocket);oneThreadInstance.start();}}}2、修改IMSystemSocketServerApp启动类(1)不再实现IMSystemSocketServerInterface接口public class IMSystemSocketServerApp implements IMSystemSocketServerInterface{ }(2)最后的代码如下package com.px1987.imsystem.socketserver;public class IMSystemSocketServerApp{public IMSystemSocketServerApp() {}public static void main(String[] args) {IMSystemSocketServerInterface oneIMSystemSocketServerApp=new IMSystemSocketServerImple();oneIMSystemSocketServerApp.createSocketServer();oneIMSystemSocketServerApp.listeningClientSocketRequest();}}3、再测试现在的效果。
Java语言程序设计的课程设计项目——命令方式的蓝梦学院选课系统项目完整实现实例(第3部分)

1.1命令方式的蓝梦学院选课系统项目完整实现实例(第3部分)1.1.1系统编程学核心业务功能实现——编程学生课程信息管理类中的相关方法package com.px1987.course.service.imple;import java.util.Iterator;import java.util.Scanner;import java.util.Set;import com.px1987.course.dao.SelectCourseResultPO;import com.px1987.course.dao.DataBase;import com.px1987.course.dao.StudentInfoPO;import com.px1987.course.service.inter.CourseManageInter;public class CourseManageImple implements CourseManageInter {public CourseManageImple() {}@Overridepublic void addOneCourse() {/*** 识别选课的学生是否登录---如果没有登录,显示相关的错误并退出选课的过程*/if(DataBase.loginedStudentInfoPO == null){System.out.println("你没有登录本系统,将不能进行选课!\n");return;}/*** 如果登录过并且登录成功,显示出相关的课程信息并进行选择——包装键盘和创建键盘输入*/Scanner currentKeyBoard =null;currentKeyBoard=new Scanner(System.in);/*** 提示输入课程相关的信息,并获得所输入的课程相关信息*/System.out.println("课程名称:");String courseName = currentKeyBoard.nextLine();/*** 识别是否存在重复选课——首先获得当前正在选课的学生信息(从Session缓存中获得)以及所选的各个课程信息;* 如果存在重复的选择,则显示错误信息并退出保存的过程*/StudentInfoPO currentSelectedCourseStudentPO=DataBase.loginedStudentInfoPO;if(currentSelectedCourseStudentPO.allSelectedCourseInfo.containsKey(courseName)){ System.out.println(courseName+"课程已经选择了,不允许重复选择该课程!");return;}/*** 如果不存在重复的选择,则继续显示课程的其它信息并输入这些信息*/System.out.println("授课教师:");String teacherName = currentKeyBoard.nextLine();System.out.println("开课时间:");String courseTime = currentKeyBoard.nextLine();System.out.println("课程学分:");int courseCreit= currentKeyBoard.nextInt();/*** 将所获得学生所选择的各个课程信息包装(转换)到一个课程信息实体对象*/SelectCourseResultPO selectedOneCoursePO=new SelectCourseResultPO();selectedOneCoursePO.setCourseName(courseName);selectedOneCoursePO.setTeacherName(teacherName);selectedOneCoursePO.setCourseTime(courseTime);selectedOneCoursePO.setCourseCreit((byte)courseCreit);/*** 保存该学生的选课结果到该学生的选课结果列表中*/currentSelectedCourseStudentPO.allSelectedCourseInfo.put(courseName, selectedOneCoursePO);System.out.println(courseName+"课程已经选择完毕并添加到已选课程的列表中,请继续选其它课程!");}@Overridepublic void printAllSelectedCourse() {/*** 识别退选课的学生是否登录---如果没有登录,显示相关的错误并退出退选课的过程*/if(DataBase.loginedStudentInfoPO == null){System.out.println("你没有登录本系统,将不能打印已选课程清单!\n");return;}/*** 再识别是否选过课程(也就是识别选课清单是否为空)——首先从缓存中获得当前退选课的学生*/StudentInfoPO currentRemovedCourseStudentPO=DataBase.loginedStudentInfoPO;if(currentRemovedCourseStudentPO.allSelectedCourseInfo.isEmpty()){System.out.println("你没有选过任何的课程,将不能打印已选课程清单!\n");return;}System.out.println("课程名称"+"\t"+ "授课教师"+"\t\t"+ "上课时间"+"\t"+ "课程学分");/*** 从缓存中获得存储已选的所有课程的集合*/Map selectedCourseMap=currentRemovedCourseStudentPO.allSelectedCourseInfo;Set allCoureNameKey=selectedCourseMap.keySet();Iterator allCourseName=allCoureNameKey.iterator();while(allCourseName.hasNext()){String oneCourseName=(String)allCourseName.next();/*** 获得所选的某门课程的实际体对象*/SelectCourseResultPO selectedOneCoursePO=(SelectCourseResultPO)selectedCourseMap.get(oneCourseName);/*** 以行、列的表格形式显示输出所有的课程信息*/System.out.println(selectedOneCoursePO.getCourseName()+"\t"+selectedOneCoursePO.getTeacherName()+"\t\t"+selectedOneCoursePO.getCourseTime()+"\t"+selectedOneCoursePO.getCourseCreit());}}@Overridepublic void removeOneCourse() {/*** 识别退选课的学生是否登录---如果没有登录,显示相关的错误并退出退选课的过程*/if(DataBase.loginedStudentInfoPO == null){System.out.println("你没有登录本系统,将不能进行退选课!\n");return;}/*** 再识别是否选过课程(也就是识别选课清单是否为空)——首先从缓存中获得当前退选课的学生*/StudentInfoPO currentRemovedCourseStudentPO=DataBase.loginedStudentInfoPO;if(currentRemovedCourseStudentPO.allSelectedCourseInfo.isEmpty()){System.out.println("你没有选过任何的课程,将不能进行退选课!\n");return;}/*** 显示退选的课程信息清单界面,并等待该学生选择所要退选的课程,最后再获得所输入的退选课程的名称*/Scanner currentKeyBoard =null;currentKeyBoard=new Scanner(System.in);System.out.println("课程名称:");String courseName = currentKeyBoard.nextLine();/*** 识别所选择的待退选的课程是否已经选过,如果没有选过则显示错误信息并退出退选课程的过程*/if(!currentRemovedCourseStudentPO.allSelectedCourseInfo.containsKey(courseName)){System.out.println("你没有选过"+courseName+"课程,将不能对该课程退选!\n");return;}/*** 如果所选择的待退选的课程是否已经选过,则删除该课程,从而达到退选的效果*/currentRemovedCourseStudentPO.allSelectedCourseInfo.remove(courseName);System.out.println(courseName+"课程已经退选完毕!请继续选其它课程!");}}1.1.2将本项目进行发布打包和创建API文档1、发布打包D:\CourseManage.jar创建*.bat文件java -jar CourseManage.jar 执行该*.bat文件2、创建API文档改变标题文字:CourseManage的API文档。
J2EE课程设计实训教学示例项目《蓝梦教育集团即时通讯系统》(仿腾讯QQ)—构建出服务器端项目(第1部分)

J2EE课程设计实训教学示例项目《蓝梦教育集团即时通讯系统》(仿腾讯QQ)——构建出服务器端项目(第1/4部分)1.1.1构建出服务器端项目1、新建服务器端项目IMServerWebApp(1)项目名为IMServerWebApp,Context名称为/webimapp,并且选择J2EE的版本为J2EE5.0(2)将出现下面的结果2、在Web项目中添加JSTL标签库jstl.jar和standard.jar3、Commons-HTTPClient组件及有关的系统库文件Commons-httpclient-3.1.jar、commons-codec-1.3.jar和commons-logging.jar等系统库文件4、XML解析技术的系统库jdom5、添加与JDIC系统包有关的各个文件(1)与Java有关的系统类:jdic.jar和jdic_stub.jar(2)针对Windows系统平台下的系统库jdic.dll和tray.dll文件jdic.dll和tray.dll是针对Windows系统平台中的本地系统库,它们都要放在C:\\Windows 目录(Windows 2003操作系统)或者C:\\WINNT目录(Windows 2000操作系统)中。
这些文件包含jdic.jar 的Java 方法和本机操作系统方法之间的“桥接”方法。
(3)JDIC中的浏览器组件JDIC允许把用户主机中默认的Web浏览器嵌入到Java Swing的应用程序中,并且浏览器组件的API允许程序员在程序中编程浏览器的各种事件以及实现对历史记录的控制(向前、后退、刷新)等功能。
为此,需要将IeEmbed.exe或者MozEmbed.exe放到本地操作系统的工作目录中。
浏览器组件将立刻使用本机操作系统中的默认Web浏览器——它们通常是Internet Explorer或Mozilla等,但需要将JDIC系统库中的IeEmbed.exe或者MozEmbed.exe程序拷贝到本地操作系统的工作目录中——对于Windows系统则为C:\\Windows目录(Windows 2003操作系统)或者C:\\WINNT目录(Windows 2000操作系统)中。
《蓝梦教育集团即时通讯系统》(仿腾讯QQ)——信息主窗口类中的各个子面板和弹出式菜单程序类(第2部分)

J2EE课程设计实训教学示例项目《蓝梦教育集团即时通讯系统》(仿腾讯QQ)——完善客户端系统信息主窗口类中的各个子面板和弹出式菜单程序类(第2/2部分)1.1.1实现相关的弹出式菜单的功能1、FriendInfoTreeNodeSelfPopupMenu类(1)类名称为FriendInfoTreeNodeSelfPopupMenu,包名称为com.px1987.imsystem.client.frame.imsystemmainframe.tree,继承于ponent.SelfDefineJPopupMenu_ImageBar类(2)编程该类package com.px1987.imsystem.client.frame.imsystemmainframe.tree;import javax.swing.ImageIcon;import javax.swing.JCheckBoxMenuItem;import javax.swing.JMenuItem;import ponent.SelfDefineJCheckBoxMenuItem;import ponent.SelfDefineJMenuItem;import ponent.SelfDefineJPopupMenu_ImageBar;import com.px1987.imsystem.client.frame.IMSystemMainFrame;public class FriendInfoTreeNodeSelfPopupMenu extends SelfDefineJPopupMenu_ImageBar { private static final long serialVersionUID = -3719946677412611465L;private IMSystemMainFrame oneIMSystemMainFrame=null;public IMSystemMainFrame getOneIMSystemMainFrame() {return oneIMSystemMainFrame;}public void setOneIMSystemMainFrame(IMSystemMainFrame oneIMSystemMainFrame) { this.oneIMSystemMainFrame = oneIMSystemMainFrame;}private JMenuItem imSpaceMenuItem = null;private JMenuItem onePersonInfoMenuItem = null;private JMenuItem updateMyHeadImageMenuItem = null;private JCheckBoxMenuItem showMyHeadImageCheckBoxMenuItem = null;private JMenuItem netRecordMenuItem = null;private JMenuItem graftMenuItem =null;public FriendInfoTreeNodeSelfPopupMenu() {super();}public FriendInfoTreeNodeSelfPopupMenu(String label,IMSystemMainFrame oneIMSystemMainFrame) {super(label);this.oneIMSystemMainFrame=oneIMSystemMainFrame;createThisTreeNodeSelfPopupMenu();}public FriendInfoTreeNodeSelfPopupMenu(String label) {super(label);}public FriendInfoTreeNodeSelfPopupMenu(ImageIcon imageIcon) {super(imageIcon);}private void createThisTreeNodeSelfPopupMenu(){imSpaceMenuItem = new SelfDefineJMenuItem();imSpaceMenuItem.setText("IM 空间");imSpaceMenuItem.setIcon(newImageIcon(getClass().getResource("/images/treePopMenu/sefttree1.jpg")));this.add(imSpaceMenuItem);onePersonInfoMenuItem= new SelfDefineJMenuItem();onePersonInfoMenuItem.setText("个人资料");this.add(onePersonInfoMenuItem);updateMyHeadImageMenuItem = new SelfDefineJMenuItem();updateMyHeadImageMenuItem.setText("更改我的头像");this.add(updateMyHeadImageMenuItem);showMyHeadImageCheckBoxMenuItem = new SelfDefineJCheckBoxMenuItem();showMyHeadImageCheckBoxMenuItem.setSelected(true);showMyHeadImageCheckBoxMenuItem.setText("显示我的头像");this.add(showMyHeadImageCheckBoxMenuItem);netRecordMenuItem = new SelfDefineJMenuItem();netRecordMenuItem.setText("网络备完录");netRecordMenuItem.setIcon(newImageIcon(getClass().getResource("/images/treePopMenu/sefttree2.jpg")));this.add(netRecordMenuItem);graftMenuItem = new SelfDefineJMenuItem();graftMenuItem.setText("送礼许愿");graftMenuItem.setIcon(newImageIcon(getClass().getResource("/images/treePopMenu/sefttree3.jpg")));this.add(graftMenuItem);}}2、FriendInfoTreeNodePopupMenu类(1)类名称为FriendInfoTreeNodePopupMenu,包名称为com.px1987.imsystem.client.frame.imsystemmainframe.tree,继承于ponent.SelfDefineJPopupMenu_ImageBar类(2)编程该类package com.px1987.imsystem.client.frame.imsystemmainframe.tree;import javax.swing.ButtonGroup;import javax.swing.ImageIcon;import javax.swing.JCheckBoxMenuItem;import javax.swing.JMenu;import javax.swing.JMenuItem;import ponent.SelfDefineJCheckBoxMenuItem;import ponent.SelfDefineJMenu;import ponent.SelfDefineJMenuItem;import ponent.SelfDefineJPopupMenu_ImageBar;import com.px1987.imsystem.client.frame.IMSystemMainFrame;importcom.px1987.imsystem.client.frame.imsystemmainframe.treeevent.FriendInfoTreeNodePopupMe nu_ActionListenerEventHandler;import com.px1987.imsystem.client.util.IMSystemClientUtils;public class FriendInfoTreeNodePopupMenu extends SelfDefineJPopupMenu_ImageBar { private static final long serialVersionUID = 8215073581183947613L;private IMSystemMainFrame oneIMSystemMainFrame=null;private JMenu personHeadImageMenu = null;private JCheckBoxMenuItem bigHeadImageMenuItem = null;private JCheckBoxMenuItem smallHeadImageMenuItem =null;private JCheckBoxMenuItem standardHeadImageMenuItem = null;private JCheckBoxMenuItem showMyHeadImageMenuItem = null;private JMenu nameInfoShowMenu =null;private JCheckBoxMenuItem showAnnotationInfoMenuItem = null;private JCheckBoxMenuItem showLoveNameInfoMenuItem = null;private JMenu columnShowMenu = null;private JCheckBoxMenuItem singleShowMenuItem = null;private JCheckBoxMenuItem multiShowMenuItem = null;private JCheckBoxMenuItem showClearInfoMenuItem = null;private JCheckBoxMenuItem slideEffectMenuItem = null;private JMenu sortShowMenu = null;private JCheckBoxMenuItem sortByIDMenuItem = null;private JCheckBoxMenuItem sortByUpdateTimeMenuItem =null;private JCheckBoxMenuItem sortByNameMenuItem = null;private JMenuItem showOnLinePersonInfoMenuItem = null;private JCheckBoxMenuItem showNoKnownPersonGroupInfoMenuItem =null;private JCheckBoxMenuItem showBlockNameListMenuItem = null;private JMenuItem addNewGroupInfoMenuItem = null;private JMenuItem addNewFriendMenuItem = null;private JMenuItem renameMenuItem = null;private JMenuItem deleteThisGroupMenuItem = null;public FriendInfoTreeNodePopupMenu() {super();}public FriendInfoTreeNodePopupMenu(String label) {super(label);}public FriendInfoTreeNodePopupMenu(String label,IMSystemMainFrame oneIMSystemMainFrame) {super(label);this.oneIMSystemMainFrame=oneIMSystemMainFrame;createThisTreeNodePopupMenu();}public FriendInfoTreeNodePopupMenu(ImageIcon imageIcon) {super(imageIcon);}private void createThisTreeNodePopupMenu(){initThisTreeNodePopupMenu();createAllMenuAndMenuItemForThisPopup();}private void initThisTreeNodePopupMenu(){this.setBackground(IMSystemClientUtils.getNoSerializableVOInstance().getLoginFormBgColor());}private void createAllMenuAndMenuItemForThisPopup(){personHeadImageMenu = new SelfDefineJMenu();personHeadImageMenu.setText("头像显示方式");personHeadImageMenu.setIcon(new ImageIcon(getClass().getResource("/images/treePopMenu/headimage.jpg")));this.add(personHeadImageMenu);ButtonGroup oneButtonGroup=new ButtonGroup();bigHeadImageMenuItem = new SelfDefineJCheckBoxMenuItem();oneButtonGroup.add(bigHeadImageMenuItem);smallHeadImageMenuItem = new SelfDefineJCheckBoxMenuItem();oneButtonGroup.add(smallHeadImageMenuItem);standardHeadImageMenuItem = new SelfDefineJCheckBoxMenuItem();oneButtonGroup.add(standardHeadImageMenuItem);bigHeadImageMenuItem.setText("大头像");bigHeadImageMenuItem.addActionListener(newFriendInfoTreeNodePopupMenu_ActionListenerEventHandler(oneIMSystemMainFrame, "bigHeadImageMenuItem_onClick"));smallHeadImageMenuItem.setText("小头像");smallHeadImageMenuItem.addActionListener(newFriendInfoTreeNodePopupMenu_ActionListenerEventHandler(oneIMSystemMainFrame, "smallHeadImageMenuItem_onClick"));standardHeadImageMenuItem.setText("标准头像");standardHeadImageMenuItem.addActionListener(newFriendInfoTreeNodePopupMenu_ActionListenerEventHandler(oneIMSystemMainFrame, "standardHeadImageMenuItem_onClick"));showMyHeadImageMenuItem = new SelfDefineJCheckBoxMenuItem();showMyHeadImageMenuItem.setText("显示我的头像");showMyHeadImageMenuItem.setSelected(true);showMyHeadImageMenuItem.addActionListener(newFriendInfoTreeNodePopupMenu_ActionListenerEventHandler(oneIMSystemMainFrame, "showMyHeadImageMenuItem_onClick"));personHeadImageMenu.add(bigHeadImageMenuItem);personHeadImageMenu.add(smallHeadImageMenuItem);personHeadImageMenu.add(standardHeadImageMenuItem);personHeadImageMenu.addSeparator();personHeadImageMenu.add(showMyHeadImageMenuItem);nameInfoShowMenu = new SelfDefineJMenu();nameInfoShowMenu.setText("名称显示");this.add(nameInfoShowMenu);ButtonGroup twoButtonGroup=new ButtonGroup();showAnnotationInfoMenuItem = new SelfDefineJCheckBoxMenuItem();twoButtonGroup.add(showAnnotationInfoMenuItem);showLoveNameInfoMenuItem = new SelfDefineJCheckBoxMenuItem();twoButtonGroup.add(showLoveNameInfoMenuItem);showAnnotationInfoMenuItem.setText("显示备注");showAnnotationInfoMenuItem.setSelected(true);showAnnotationInfoMenuItem.addActionListener(newFriendInfoTreeNodePopupMenu_ActionListenerEventHandler(oneIMSystemMainFrame, "showAnnotationInfoMenuItem_onClick"));showLoveNameInfoMenuItem.setText("显示昵称");showLoveNameInfoMenuItem.addActionListener(newFriendInfoTreeNodePopupMenu_ActionListenerEventHandler(oneIMSystemMainFrame, "showLoveNameInfoMenuItem_onClick"));nameInfoShowMenu.add(showAnnotationInfoMenuItem);nameInfoShowMenu.add(showLoveNameInfoMenuItem);columnShowMenu = new SelfDefineJMenu();columnShowMenu.setText("列表显示");this.add(columnShowMenu);ButtonGroup threeButtonGroup = new ButtonGroup();singleShowMenuItem = new SelfDefineJCheckBoxMenuItem();threeButtonGroup.add(singleShowMenuItem);multiShowMenuItem = new SelfDefineJCheckBoxMenuItem();threeButtonGroup.add(multiShowMenuItem);singleShowMenuItem.setText("单列显示");singleShowMenuItem.setSelected(true);singleShowMenuItem.addActionListener(newFriendInfoTreeNodePopupMenu_ActionListenerEventHandler(oneIMSystemMainFrame, "singleShowMenuItem_onClick"));columnShowMenu.add(singleShowMenuItem);multiShowMenuItem.setText("多列平铺");multiShowMenuItem.addActionListener(newFriendInfoTreeNodePopupMenu_ActionListenerEventHandler(oneIMSystemMainFrame, "multiShowMenuItem_onClick"));columnShowMenu.add(multiShowMenuItem);columnShowMenu.addSeparator();showClearInfoMenuItem = new SelfDefineJCheckBoxMenuItem();showClearInfoMenuItem.setText("显示清爽资料");showClearInfoMenuItem.addActionListener(newFriendInfoTreeNodePopupMenu_ActionListenerEventHandler(oneIMSystemMainFrame, "ShowClearInfoMenuItem_onClick"));columnShowMenu.add(showClearInfoMenuItem);slideEffectMenuItem = new SelfDefineJCheckBoxMenuItem();slideEffectMenuItem.setText("滑动效果");slideEffectMenuItem.addActionListener(newFriendInfoTreeNodePopupMenu_ActionListenerEventHandler(oneIMSystemMainFrame, "slideEffectMenuItem_onClick"));columnShowMenu.addSeparator();columnShowMenu.add(slideEffectMenuItem);this.addSeparator();sortShowMenu = new SelfDefineJMenu();sortShowMenu.setText("排序显示");this.add(sortShowMenu);ButtonGroup fourButtonGroup = new ButtonGroup();sortByIDMenuItem = new SelfDefineJCheckBoxMenuItem();fourButtonGroup.add(sortByIDMenuItem);sortByUpdateTimeMenuItem = new SelfDefineJCheckBoxMenuItem();fourButtonGroup.add(sortByUpdateTimeMenuItem);sortByNameMenuItem = new SelfDefineJCheckBoxMenuItem();fourButtonGroup.add(sortByNameMenuItem);sortByIDMenuItem.setText("按身份标识排序");sortByUpdateTimeMenuItem.setText("按服务更新排序");sortByNameMenuItem.setText("按名称排序");sortShowMenu.add(sortByIDMenuItem);sortShowMenu.add(sortByUpdateTimeMenuItem);sortShowMenu.add(sortByNameMenuItem);this.addSeparator();showOnLinePersonInfoMenuItem = new SelfDefineJMenuItem();showOnLinePersonInfoMenuItem.setText("显示在线联系人");this.add(showOnLinePersonInfoMenuItem);this.addSeparator();showNoKnownPersonGroupInfoMenuItem = new SelfDefineJCheckBoxMenuItem();showNoKnownPersonGroupInfoMenuItem.setText("显示陌生人分组");showNoKnownPersonGroupInfoMenuItem.addActionListener(newFriendInfoTreeNodePopupMenu_ActionListenerEventHandler(oneIMSystemMainFrame, "showNoKnownPersonGroupInfoMenuItem_onClick"));this.add(showNoKnownPersonGroupInfoMenuItem);showBlockNameListMenuItem = new SelfDefineJCheckBoxMenuItem();showBlockNameListMenuItem.setText("显示黑名单");showBlockNameListMenuItem.addActionListener(newFriendInfoTreeNodePopupMenu_ActionListenerEventHandler(oneIMSystemMainFrame, "showBlockNameListMenuItem_onClick"));this.add(showBlockNameListMenuItem);this.addSeparator();addNewGroupInfoMenuItem = new SelfDefineJMenuItem();addNewGroupInfoMenuItem.setText("添加分组");addNewGroupInfoMenuItem.addActionListener(newFriendInfoTreeNodePopupMenu_ActionListenerEventHandler(oneIMSystemMainFrame, "addNewGroupInfoMenuItem_onClick"));this.add(addNewGroupInfoMenuItem);addNewFriendMenuItem = new SelfDefineJMenuItem();addNewFriendMenuItem.setText("添加联系人");addNewFriendMenuItem.setIcon(new ImageIcon(getClass().getResource("/images/treePopMenu/addFriend.jpg")));addNewFriendMenuItem.addActionListener(new FriendInfoTreeNodePopupMenu_ActionListenerEventHandler(oneIMSystemMainFrame, "addNewFriendMenuItem_onClick"));this.add(addNewFriendMenuItem);this.addSeparator();renameMenuItem = new SelfDefineJMenuItem();renameMenuItem.setText("重命名");renameMenuItem.addActionListener(newFriendInfoTreeNodePopupMenu_ActionListenerEventHandler(oneIMSystemMainFrame, "renameMenuItem_onClick"));deleteThisGroupMenuItem = new SelfDefineJMenuItem();deleteThisGroupMenuItem.setText("删除该组");deleteThisGroupMenuItem.setIcon(new ImageIcon(getClass().getResource("/images/treePopMenu/deleteGroup.jpg")));deleteThisGroupMenuItem.addActionListener(new FriendInfoTreeNodePopupMenu_ActionListenerEventHandler(oneIMSystemMainFrame, "deleteThisGroupMenuItem_onClick"));this.add(renameMenuItem);this.add(deleteThisGroupMenuItem);}public JMenuItem getDeleteThisGroupMenuItem() {return deleteThisGroupMenuItem;}public JMenuItem getRenameMenuItem() {return renameMenuItem;}public JMenuItem getAddNewGroupInfoMenuItem() {return addNewGroupInfoMenuItem;}}3、FriendInfoTreeNodePopupMenu_byClickOut类(1)类名称为FriendInfoTreeNodePopupMenu_byClickOut,包名称为com.px1987.imsystem.client.frame.imsystemmainframe.tree,继承于ponent.SelfDefineJPopupMenu_ImageBar类(2)编程该类package com.px1987.imsystem.client.frame.imsystemmainframe.tree;import javax.swing.ButtonGroup;import javax.swing.ImageIcon;import javax.swing.JCheckBoxMenuItem;import javax.swing.JMenu;import javax.swing.JMenuItem;import ponent.SelfDefineJCheckBoxMenuItem;import ponent.SelfDefineJMenu;import ponent.SelfDefineJMenuItem;import ponent.SelfDefineJPopupMenu_ImageBar;import com.px1987.imsystem.client.frame.IMSystemMainFrame;importcom.px1987.imsystem.client.frame.imsystemmainframe.event.IMSystemMainFrame_ActionList enerEventHandler;public class FriendInfoTreeNodePopupMenu_byClickOut extends SelfDefineJPopupMenu_ImageBar {private static final long serialVersionUID = -8871613980569893992L;private IMSystemMainFrame oneIMSystemMainFrame=null;private JMenu personHeadImageMenu_byClickOut = null;private JCheckBoxMenuItem bigHeadImageMenuItem_byClickOut = null;private JCheckBoxMenuItem smallHeadImageMenuItem_byClickOut = null;private JCheckBoxMenuItem standardHeadImageMenuItem_byClickOut = null;private JCheckBoxMenuItem showMyHeadImageMenuItem_byClickOut = null;private JMenu nameInfoShowMenu_byClickOut = null;private JCheckBoxMenuItem showAnnotationInfoMenuItem_byClickOut = null;private JCheckBoxMenuItem showLoveNameInfoMenuItem_byClickOut = null;private JMenu columnShowMenu_byClickOut = null;private JCheckBoxMenuItem singleShowMenuItem_byClickOut = null;private JCheckBoxMenuItem multiShowMenuItem_byClickOut =null;private JCheckBoxMenuItem ShowClearInfoMenuItem_byClickOut = null;private JCheckBoxMenuItem slideEffectMenuItem_byClickOut = null;private JMenu sortShowMenu_byClickOut = new SelfDefineJMenu();private JCheckBoxMenuItem sortByIDMenuItem_byClickOut = null;private JCheckBoxMenuItem sortByUpdateTimeMenuItem_byClickOut = null;private JCheckBoxMenuItem sortByNameMenuItem_byClickOut = null;private JMenuItem showOnLinePersonInfoMenuItem_byClickOut = null;private JCheckBoxMenuItem showNoKnownPersonGroupInfoMenuItem_byClickOut =null;private JCheckBoxMenuItem showBlockNameListMenuItem_byClickOut = null;public FriendInfoTreeNodePopupMenu_byClickOut() {super();}public FriendInfoTreeNodePopupMenu_byClickOut(String label) {super(label);}public FriendInfoTreeNodePopupMenu_byClickOut(String label,IMSystemMainFrame oneIMSystemMainFrame) {super(label);this.oneIMSystemMainFrame=oneIMSystemMainFrame;createThisTreeNodePopupMenu_byClickOut();}public FriendInfoTreeNodePopupMenu_byClickOut(ImageIcon imageIcon) { super(imageIcon);}private void createThisTreeNodePopupMenu_byClickOut(){personHeadImageMenu_byClickOut = new SelfDefineJMenu();personHeadImageMenu_byClickOut.setText("头像显示方式");personHeadImageMenu_byClickOut.setIcon(new ImageIcon(getClass().getResource("/images/treePopMenu/headimage.jpg")));this.add(personHeadImageMenu_byClickOut);ButtonGroup oneButtonGroup=new ButtonGroup();bigHeadImageMenuItem_byClickOut = new SelfDefineJCheckBoxMenuItem();oneButtonGroup.add(bigHeadImageMenuItem_byClickOut);smallHeadImageMenuItem_byClickOut = new SelfDefineJCheckBoxMenuItem();oneButtonGroup.add(smallHeadImageMenuItem_byClickOut);standardHeadImageMenuItem_byClickOut = new SelfDefineJCheckBoxMenuItem();oneButtonGroup.add(standardHeadImageMenuItem_byClickOut);bigHeadImageMenuItem_byClickOut.setText("大头像");bigHeadImageMenuItem_byClickOut.addActionListener(newIMSystemMainFrame_ActionListenerEventHandler(oneIMSystemMainFrame,"bigHeadImageMenuItem_onClick"));smallHeadImageMenuItem_byClickOut.setText("小头像");smallHeadImageMenuItem_byClickOut.addActionListener(newIMSystemMainFrame_ActionListenerEventHandler(oneIMSystemMainFrame,"smallHeadImageMenuItem_onClick"));standardHeadImageMenuItem_byClickOut.setText("标准头像");standardHeadImageMenuItem_byClickOut.addActionListener(newIMSystemMainFrame_ActionListenerEventHandler(oneIMSystemMainFrame,"standardHeadImageMenuItem_onClick"));showMyHeadImageMenuItem_byClickOut = new SelfDefineJCheckBoxMenuItem();showMyHeadImageMenuItem_byClickOut.setText("显示我的头像");showMyHeadImageMenuItem_byClickOut.setSelected(true);showMyHeadImageMenuItem_byClickOut.addActionListener(newIMSystemMainFrame_ActionListenerEventHandler(oneIMSystemMainFrame,"showMyHeadImageMenuItem_onClick"));personHeadImageMenu_byClickOut.add(bigHeadImageMenuItem_byClickOut);personHeadImageMenu_byClickOut.add(smallHeadImageMenuItem_byClickOut);personHeadImageMenu_byClickOut.add(standardHeadImageMenuItem_byClickOut);personHeadImageMenu_byClickOut.addSeparator();personHeadImageMenu_byClickOut.add(showMyHeadImageMenuItem_byClickOut);nameInfoShowMenu_byClickOut = new SelfDefineJMenu();nameInfoShowMenu_byClickOut.setText("名称显示");this.add(nameInfoShowMenu_byClickOut);ButtonGroup twoButtonGroup=new ButtonGroup();showAnnotationInfoMenuItem_byClickOut = new SelfDefineJCheckBoxMenuItem();showAnnotationInfoMenuItem_byClickOut.setText("显示备注");showAnnotationInfoMenuItem_byClickOut.setSelected(true);showAnnotationInfoMenuItem_byClickOut.addActionListener(newIMSystemMainFrame_ActionListenerEventHandler(oneIMSystemMainFrame,"showAnnotationInfoMenuItem_onClick"));twoButtonGroup.add(showAnnotationInfoMenuItem_byClickOut);showLoveNameInfoMenuItem_byClickOut = new SelfDefineJCheckBoxMenuItem();twoButtonGroup.add(showLoveNameInfoMenuItem_byClickOut);showLoveNameInfoMenuItem_byClickOut.setText("显示昵称");showLoveNameInfoMenuItem_byClickOut.addActionListener(newIMSystemMainFrame_ActionListenerEventHandler(oneIMSystemMainFrame,"showLoveNameInfoMenuItem_onClick"));nameInfoShowMenu_byClickOut.add(showAnnotationInfoMenuItem_byClickOut);nameInfoShowMenu_byClickOut.add(showLoveNameInfoMenuItem_byClickOut);columnShowMenu_byClickOut = new SelfDefineJMenu();columnShowMenu_byClickOut.setText("列表显示");this.add(columnShowMenu_byClickOut);ButtonGroup threeButtonGroup = new ButtonGroup();singleShowMenuItem_byClickOut = new SelfDefineJCheckBoxMenuItem();threeButtonGroup.add(singleShowMenuItem_byClickOut);multiShowMenuItem_byClickOut = new SelfDefineJCheckBoxMenuItem();threeButtonGroup.add(multiShowMenuItem_byClickOut);singleShowMenuItem_byClickOut.setText("单列显示");singleShowMenuItem_byClickOut.setSelected(true);singleShowMenuItem_byClickOut.addActionListener(newIMSystemMainFrame_ActionListenerEventHandler(oneIMSystemMainFrame,"singleShowMenuItem_onClick"));columnShowMenu_byClickOut.add(singleShowMenuItem_byClickOut);multiShowMenuItem_byClickOut.setText("多列平铺");multiShowMenuItem_byClickOut.addActionListener(newIMSystemMainFrame_ActionListenerEventHandler(oneIMSystemMainFrame,"multiShowMenuItem_onClick"));columnShowMenu_byClickOut.add(multiShowMenuItem_byClickOut);columnShowMenu_byClickOut.addSeparator();ShowClearInfoMenuItem_byClickOut = new SelfDefineJCheckBoxMenuItem();ShowClearInfoMenuItem_byClickOut.setText("显示清爽资料");ShowClearInfoMenuItem_byClickOut.addActionListener(newIMSystemMainFrame_ActionListenerEventHandler(oneIMSystemMainFrame,"ShowClearInfoMenuItem_onClick"));columnShowMenu_byClickOut.add(ShowClearInfoMenuItem_byClickOut);slideEffectMenuItem_byClickOut = new SelfDefineJCheckBoxMenuItem();slideEffectMenuItem_byClickOut.setText("滑动效果");slideEffectMenuItem_byClickOut.addActionListener(newIMSystemMainFrame_ActionListenerEventHandler(oneIMSystemMainFrame,"slideEffectMenuItem_onClick"));columnShowMenu_byClickOut.addSeparator();columnShowMenu_byClickOut.add(slideEffectMenuItem_byClickOut);this.addSeparator();sortShowMenu_byClickOut.setText("排序显示");this.add(sortShowMenu_byClickOut);ButtonGroup fourButtonGroup = new ButtonGroup();sortByIDMenuItem_byClickOut = new SelfDefineJCheckBoxMenuItem();fourButtonGroup.add(sortByIDMenuItem_byClickOut);sortByUpdateTimeMenuItem_byClickOut = new SelfDefineJCheckBoxMenuItem();fourButtonGroup.add(sortByUpdateTimeMenuItem_byClickOut);sortByNameMenuItem_byClickOut = new SelfDefineJCheckBoxMenuItem();fourButtonGroup.add(sortByNameMenuItem_byClickOut);sortByIDMenuItem_byClickOut.setText("按身份标识排序");sortByUpdateTimeMenuItem_byClickOut.setText("按服务更新排序");sortByNameMenuItem_byClickOut.setText("按名称排序");sortShowMenu_byClickOut.add(sortByIDMenuItem_byClickOut);sortShowMenu_byClickOut.add(sortByUpdateTimeMenuItem_byClickOut);sortShowMenu_byClickOut.add(sortByNameMenuItem_byClickOut);this.addSeparator();showOnLinePersonInfoMenuItem_byClickOut = new SelfDefineJMenuItem();showOnLinePersonInfoMenuItem_byClickOut.setText("显示在线联系人");this.add(showOnLinePersonInfoMenuItem_byClickOut);this.addSeparator();showNoKnownPersonGroupInfoMenuItem_byClickOut = new SelfDefineJCheckBoxMenuItem();showNoKnownPersonGroupInfoMenuItem_byClickOut.setText("显示陌生人分组");showNoKnownPersonGroupInfoMenuItem_byClickOut.addActionListener(newIMSystemMainFrame_ActionListenerEventHandler(oneIMSystemMainFrame,"showNoKnownPersonGroupInfoMenuItem_onClick"));this.add(showNoKnownPersonGroupInfoMenuItem_byClickOut);showBlockNameListMenuItem_byClickOut = new SelfDefineJCheckBoxMenuItem();showBlockNameListMenuItem_byClickOut.setText("显示黑名单");showBlockNameListMenuItem_byClickOut.addActionListener(newIMSystemMainFrame_ActionListenerEventHandler(oneIMSystemMainFrame,"showBlockNameListMenuItem_onClick"));this.add(showBlockNameListMenuItem_byClickOut);}}4、FriendInfoTreeNodeSendMessagePopupMenu类(1)类名称为FriendInfoTreeNodeSendMessagePopupMenu,包名称为com.px1987.imsystem.client.frame.imsystemmainframe.tree,继承于ponent.SelfDefineJPopupMenu_ImageBar类(2)编程该类package com.px1987.imsystem.client.frame.imsystemmainframe.tree;import javax.swing.ImageIcon;import javax.swing.JMenu;import javax.swing.JMenuItem;import ponent.SelfDefineJMenu;import ponent.SelfDefineJMenuItem;import ponent.SelfDefineJPopupMenu_ImageBar;import com.px1987.imsystem.client.frame.IMSystemMainFrame;importcom.px1987.imsystem.client.frame.imsystemmainframe.treeevent.TreeNodeSendMessagePopup Menu_ActionListenerEventHandler;public class FriendInfoTreeNodeSendMessagePopupMenu extends SelfDefineJPopupMenu_ImageBar {private static final long serialVersionUID = 2935447048505581114L;private IMSystemMainFrame oneIMSystemMainFrame=null;private JMenuItem sendIMMessageToSomeOneMenuItem = null;private JMenuItem sendMessageByMobileMenuItem = null;private JMenuItem sendMailMenuItem = null;private JMenuItem sendFilesMenuItem = null;private JMenuItem talkMethodOneMenuItem =null;private JMenuItem talkMethodTwoMenuItem = null;private JMenuItem someOneFriendMenuItem = null;private JMenuItem moveToBlackListMenuItem = null;private JMenuItem deleteSomeOneFriendMenuItem = null;private JMenuItem noticeSomeOneMenuItem = null;private JMenuItem updateNameMenuItem = null;private JMenuItem setupPrivateMenuItem = null;private JMenuItem messageRecordMenuItem = null;private JMenuItem viewInfoMenuItem =null;public FriendInfoTreeNodeSendMessagePopupMenu() {super();}public FriendInfoTreeNodeSendMessagePopupMenu(String label) {super(label);}public FriendInfoTreeNodeSendMessagePopupMenu(String label,IMSystemMainFrame oneIMSystemMainFrame) {super(label);this.oneIMSystemMainFrame=oneIMSystemMainFrame;createThisTreeNodeSendMessagePopupMenu();}public FriendInfoTreeNodeSendMessagePopupMenu(ImageIcon imageIcon) { super(imageIcon);}private void createThisTreeNodeSendMessagePopupMenu(){sendIMMessageToSomeOneMenuItem = new SelfDefineJMenuItem();sendIMMessageToSomeOneMenuItem.setIcon(new ImageIcon(getClass().getResource( "/images/chatFrameImage/popUpMenu/3.jpg")));sendIMMessageToSomeOneMenuItem.setText("发送即时消息");sendIMMessageToSomeOneMenuItem.addActionListener(newTreeNodeSendMessagePopupMenu_ActionListenerEventHandler(oneIMSystemMainFrame, "sendIMMessageToSomeOneMenuItem_onClick"));this.add(sendIMMessageToSomeOneMenuItem);sendMessageByMobileMenuItem = new SelfDefineJMenuItem();sendMessageByMobileMenuItem.setText("发送手机信息");sendMessageByMobileMenuItem.setIcon(new ImageIcon(getClass().getResource("/images/chatFrameImage/popUpMenu/4.jpg")));this.add(sendMessageByMobileMenuItem);sendMailMenuItem = new SelfDefineJMenuItem();sendMailMenuItem.setText("发送电子邮件");this.add(sendMailMenuItem);talkMethodOneMenuItem = new SelfDefineJMenuItem(); talkMethodOneMenuItem.setText("交谈方式一");JMenu talkByVideoMenu = new SelfDefineJMenu();talkByVideoMenu.setText("影音交谈");talkByVideoMenu.add(talkMethodOneMenuItem); talkMethodTwoMenuItem = new SelfDefineJMenuItem(); talkMethodTwoMenuItem.setText("交谈方式二");talkByVideoMenu.add(talkMethodTwoMenuItem);this.add(talkByVideoMenu);sendFilesMenuItem = new SelfDefineJMenuItem();sendFilesMenuItem.setText("发送文件");this.add(sendFilesMenuItem);this.addSeparator();someOneFriendMenuItem = new SelfDefineJMenuItem(); someOneFriendMenuItem.setText("朋友");JMenu removeSomeOneMenu = new SelfDefineJMenu(); removeSomeOneMenu.setText("移动联系人至"); removeSomeOneMenu.setIcon(new ImageIcon(getClass().getResource("/images/chatFrameImage/popUpMenu/5.jpg"))); removeSomeOneMenu.add(someOneFriendMenuItem);this.add(removeSomeOneMenu);moveToBlackListMenuItem = new SelfDefineJMenuItem(); moveToBlackListMenuItem.setText("移至黑名单");this.add(moveToBlackListMenuItem); deleteSomeOneFriendMenuItem = new SelfDefineJMenuItem(); deleteSomeOneFriendMenuItem.setText("删除好友"); deleteSomeOneFriendMenuItem.setIcon(new ImageIcon(getClass().getResource( "/images/chatFrameImage/popUpMenu/6.jpg")));。
课程设计实训示例项目《蓝梦教育集团即时通讯系统》(仿腾讯QQ)——构建出客户端登录主窗口类(第1部分)

J2EE课程设计实训教学示例项目《蓝梦教育集团即时通讯系统》(仿腾讯QQ)——构建出客户端登录主窗口类(第1部分)1.1.1构建出客户端登录主窗口类IMLoginMainFrame1、客户端的实用工具类(1)类名称为IMSystemClientUtils,包名称为com.px1987.imsystem.client.util(2)编程该类package com.px1987.imsystem.client.util;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import .URISyntaxException;import .URL;import java.util.HashMap;import java.util.List;import java.util.Map;import javax.swing.JOptionPane;import mons.httpclient.HttpClient;import mons.httpclient.HttpStatus;import ValuePair;import mons.httpclient.methods.PostMethod;import com.px1987.imsystem.client.constant.IMSystemClientAppConstant; import com.px1987.imsystem.client.exception.IMSystemException;import com.px1987.imsystem.client.frame.IMLoginMainFrame;import SystemInfoVO;import com.px1987.imsystem.client.vobject.NoSerializableVO;import erLoginOnLineInfoVO;import erInfoBaseVO;public class IMSystemClientUtils {private static HttpClient oneCommonsHttpClientInstance=null;private static NetSystemInfoVO oneNetSystemInfoVOInstance=null;private static NoSerializableVO oneNoSerializableVOInstance=null;private static UserLoginOnLineInfoVO oneUserLoginInfoVOInstance=null;private static Map<String,List<UserInfoBaseVO>> returnAllFriendsInfoVO=null;public static Map<String,List<UserInfoBaseVO>> getReturnAllFriendsInfoVO() { return IMSystemClientUtils.returnAllFriendsInfoVO;}public static void setReturnAllFriendsInfoVO(Map<String,List<UserInfoBaseVO>> returnAllFriendsInfoVO) {IMSystemClientUtils.returnAllFriendsInfoVO = returnAllFriendsInfoVO;}private IMSystemClientUtils() {}public static synchronized HttpClient getCommonsHttpClientInstance(){ if(oneCommonsHttpClientInstance==null){oneCommonsHttpClientInstance=new HttpClient();}return oneCommonsHttpClientInstance;}public static synchronized NetSystemInfoVO getNetSystemInfoVOInstance(){ if(oneNetSystemInfoVOInstance==null){oneNetSystemInfoVOInstance=new NetSystemInfoVO();}return oneNetSystemInfoVOInstance;}public static synchronized void setNetSystemInfoVOInstance(NetSystemInfoVO oneNetSystemInfoVO){oneNetSystemInfoVOInstance=oneNetSystemInfoVO;}public static synchronized NoSerializableVO getNoSerializableVOInstance(){ if(oneNoSerializableVOInstance==null){oneNoSerializableVOInstance=new NoSerializableVO();}return oneNoSerializableVOInstance;}public static synchronized UserLoginOnLineInfoVO getUserLoginOnLineInfoVOInstance(){if(oneUserLoginInfoVOInstance==null){oneUserLoginInfoVOInstance=new UserLoginOnLineInfoVO();}return oneUserLoginInfoVOInstance;}public static synchronized void setUserLoginOnLineInfoVOInstance(UserLoginOnLineInfoVO oneUserLoginInfoVO){ oneUserLoginInfoVOInstance=oneUserLoginInfoVO;}//************************************************************************** public static void exitIMLoginMainFrame(IMLoginMainFrame oneIMLoginMainFrame){try {IMSystemClientUtils.sendCloseFrameMessageToServer(); //向服务器发送在线注销的消息} catch (IMSystemException exception) {exception.printStackTrace();System.out.println("在IMSystemClientUtils类中的出现了IMSystemException异常错误,错误信息为:" +exception.getMessage());}oneIMLoginMainFrame.dispose(); //不仅要关闭主窗口、而且也还要退出系统程序System.exit(0);}public static void sendCloseFrameMessageToServer() throws IMSystemException{HttpClient oneHttpClient = null;oneHttpClient = IMSystemClientUtils.getCommonsHttpClientInstance();String targetURL = NetSystemUtil.getWebAppContextURL() + "/userInfoManageServlet.action";PostMethod onePostMethod = new PostMethod(targetURL);onePostMethod.addRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=gb2312"); //设置传输字符集,如果需要传输中文这需要设置为中文字符集NameValuePair request_Action = new NameValuePair("action",newInteger(IMSystemClientAppConstant.HttpClientUserInfoRequest_logOutOnLineStatus ).toString());onePostMethod.setRequestBody(new NameValuePair[] {request_Action});try {oneHttpClient.executeMethod(onePostMethod);} catch (IOException ex) {throw new IMSystemException("在IMSystemClientUtils类中的sendCloseFrameMessageToServer方法出现了IOException异常");}onePostMethod.releaseConnection();return;}public static boolean testNetConnectionSetupStatus(String webAppContextURL) throwsIMSystemException {Boolean returnTestResult = null;HttpClient oneHttpClient = null;oneHttpClient = IMSystemClientUtils.getCommonsHttpClientInstance();String targetURL = webAppContextURL +"/imWebServiceUtileServlet.action";PostMethod onePostMethod = new PostMethod(targetURL);onePostMethod.addRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=gb2312"); //设置传输字符集,如果需要传输中文这需要设置为中文字符集NameValuePair request_Action = new NameValuePair("action",new Integer(IMSystemClientAppConstant.HttpClientUserInfoRequest_testNetConnectionSetupStatus).toString());onePostMethod.setRequestBody(new NameValuePair[] {request_Action});try {oneHttpClient.executeMethod(onePostMethod);} catch (IOException ex) {returnTestResult=new Boolean(false);throw new IMSystemException("在IMSystemClientUtils类中的testNetConnectionSetupStatus方法出现了IOException异常");}if (onePostMethod.getStatusCode() != HttpStatus.SC_OK) { //出现响应异常时,直接关闭http连接onePostMethod.releaseConnection();return false;}InputStream oneInputStream = null;try {oneInputStream = onePostMethod.getResponseBodyAsStream();ObjectInputStream oneObjectInputStream = new ObjectInputStream(oneInputStream);returnTestResult = (Boolean) oneObjectInputStream.readObject(); //获得服务器端返回的在线用户总数的对象} catch (IOException ex1) {returnTestResult=new Boolean(false);throw new IMSystemException("在IMSystemClientUtils类中的testNetConnectionSetupStatus方法出现了IOException异常");} catch (ClassNotFoundException ex) {returnTestResult=new Boolean(false);throw new IMSystemException("在IMSystemClientUtils类中的testNetConnectionSetupStatus方法出现了ClassNotFoundException异常");}onePostMethod.releaseConnection();return returnTestResult.booleanValue();}public static String getSerializableFileName(){return "/systemConfig.dat"; // 直接放在classes目录下}public static void setAllVOInSerializableFile(URL TargetFileURL) { // 该方法为对用户所做的各种配置进行序列化操作——利用序列化技术保存两个VO Map<String,Object> oneMap = new HashMap<String,Object>();oneMap.put("oneUserLoginInfoVOKey",IMSystemClientUtils.getUserLoginOnLineInfoVOInstance());oneMap.put("oneNetSystemInfoVOKey",IMSystemClientUtils.getNetSystemInfoVOInstance());/*file.separator : 文件分隔符, Windows环境下为“\",Unix环境下为“/”;user.home :用户主目录;java.home :Java实时运行环境的安装目录;java.ext.dirs :JDK的安装目录; :操作系统名称; :用户登录名称;os.version :操作系统版本;path.separator :当前操作系统的路径分隔符;user.dir :当前用户程序所在目录。
《蓝梦教育集团即时通讯系统》(仿腾讯QQ)——构建出客户端登录主窗口有关的各个对话框程序类(第5部分)

J2EE课程设计实训教学示例项目《蓝梦教育集团即时通讯系统》(仿腾讯QQ)——构建出客户端登录主窗口有关的各个对话框程序类(第5部分)12、添加好友信息的对话框FindNewFriendAndGroupDialog的事件处理类(1)类名称为FindNewFriendAndGroupDialog_ActionListenerEventHandler,实现java.awt.event.ActionListener接口,包名称为com.px1987.imsystem.client.dialog.eventpackage com.px1987.imsystem.client.dialog.event;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import ng.reflect.InvocationTargetException;import ng.reflect.Method;import java.util.Iterator;import java.util.List;import com.px1987.imsystem.client.dialog.FindNewFriendAndGroupDialog;import com.px1987.imsystem.client.exception.IMSystemException;import erInfoBaseVO;public class FindNewFriendAndGroupDialog_ActionListenerEventHandler implements ActionListener {private FindNewFriendAndGroupDialog eventSourceContainer = null;private String eventHandlerMethodName = null;public FindNewFriendAndGroupDialog_ActionListenerEventHandler() {super();}publicFindNewFriendAndGroupDialog_ActionListenerEventHandler(FindNewFriendAndGroupDialog eventSourceContainer,String eventHandlerMethodName) {super();this.eventSourceContainer = eventSourceContainer;this.eventHandlerMethodName = eventHandlerMethodName;}@SuppressWarnings("unchecked")public void actionPerformed(ActionEvent actionEventObject) {Class currentEventHandlerClass = this.getClass();Method eventHandlerMmethod = null;try { //获得事件处理方法eventHandlerMmethod = currentEventHandlerClass.getMethod(this.eventHandlerMethodName, new Class[] {actionEventObject.getClass()});} catch (SecurityException exception) {exception.printStackTrace();System.out.println("出现了SecurityException异常错误,错误信息为:" +exception.getMessage());} catch (NoSuchMethodException exception) {exception.printStackTrace();System.out.println("出现了NoSuchMethodException异常错误,错误信息为:" +exception.getMessage());}try { //调用指定的事件处理方法eventHandlerMmethod.invoke(this, new Object[] {actionEventObject});} catch (InvocationTargetException exception) {exception.printStackTrace();System.out.println("出现了InvocationTargetException异常错误,错误信息为:" + exception.getMessage());} catch (IllegalArgumentException exception) {exception.printStackTrace();System.out.println("出现了IllegalArgumentException异常错误,错误信息为:" + exception.getMessage());} catch (IllegalAccessException exception) {exception.printStackTrace();System.out.println("出现了IllegalAccessException异常错误,错误信息为:" +exception.getMessage());}}public void cancelButton_onClick(ActionEvent e) {eventSourceContainer.dispose();}public void addFriendButton_onClick(ActionEvent e) {}public void closeButton_onClick(ActionEvent e) {eventSourceContainer.dispose();}public void previousButton_onClick(ActionEvent e) {//下面的代码是动态除掉原来的“查找结果”两个面板eventSourceContainer.getFindTabbedPane().remove(eventSourceContainer.getFindFriendResultP anel());eventSourceContainer.getContentPanel().remove(eventSourceContainer.getFindResultButtonPan el());//下面的代码是动态地添加“查找表单”的面板eventSourceContainer.getFindTabbedPane().add(eventSourceContainer.getFindFriendPanel(), "查找联系人", 0); //添加到第一个位置处eventSourceContainer.getFindTabbedPane().setSelectedComponent(eventSourceContainer.getFin dFriendPanel()); //选中该面板eventSourceContainer.getContentPanel().add(eventSourceContainer.getButtonPanel(), java.awt.BorderLayout.SOUTH);//动态更新和显示eventSourceContainer.invalidate();eventSourceContainer.repaint();eventSourceContainer.validate();}public void findButton_onClick(ActionEvent e) {String userID=eventSourceContainer.getUserIDTextField().getText(); //获得输入的帐号String userAliaoName=eventSourceContainer.getFriendUserNameTextField().getText(); //获得输入的昵称List<UserInfoBaseVO> allFriendInfoInList=null;try {allFriendInfoInList=eventSourceContainer.getOneHttpClientFindFriendInfoRequest().doReturnFriendInfo(userID, eventSourceContainer.getSearchUserInfoType(),userAliaoName);} catch (IMSystemException exception) {exception.printStackTrace();System.out.println("出现了OASystemException异常错误,错误信息为:" +exception.getMessage());}eventSourceContainer.findResultPanelInit();//下面的代码实现将allFriendInfoInList集合中的数据导入到二维数组中eventSourceContainer.getFindFriendResultPanel().setTableData(newObject[allFriendInfoInList.size()][3]);Iterator<UserInfoBaseVO> allItems=allFriendInfoInList.iterator();int index=0;while(allItems.hasNext()){UserInfoBaseVO oneFindFriendInfoVO=(UserInfoBaseVO)allItems.next(); eventSourceContainer.getFindFriendResultPanel().getTableData()[index][0]=oneFindFriendInfo VO.getUserIMCode();eventSourceContainer.getFindFriendResultPanel().getTableData()[index][1]=oneFindFriendInfo VO.getUserAliaoName();eventSourceContainer.getFindFriendResultPanel().getTableData()[index][2]=oneFindFriendInfo VO.getUserComeFrom();index++;}eventSourceContainer.getFindFriendResultPanel().createFindFriendResultJTable(); //创建出查询结果的表格//下面的代码是动态除掉原来的“查找表单”两个面板eventSourceContainer.getFindTabbedPane().remove(eventSourceContainer.getFindFriendPanel() );eventSourceContainer.getContentPanel().remove(eventSourceContainer.getButtonPanel());//下面的代码是动态地添加“查找结果”的面板eventSourceContainer.getFindTabbedPane().add(eventSourceContainer.getFindFriendResultPane l(), "查找联系人",0); //添加到第一个位置处eventSourceContainer.getFindTabbedPane().setSelectedComponent(eventSourceContainer.getFin dFriendResultPanel()); //选中该面板eventSourceContainer.getContentPanel().add(eventSourceContainer.getFindResultButtonPanel(),java.awt.BorderLayout.SOUTH);//动态更新和显示eventSourceContainer.invalidate();eventSourceContainer.repaint();eventSourceContainer.validate();}}(2)类名称为FindNewFriendAndGroupDialog_ItemListenerEventHandler,实现java.awt.event.ActionListener接口,包名称为com.px1987.imsystem.client.dialog.eventpackage com.px1987.imsystem.client.dialog.event;import java.awt.event.ItemEvent;import java.awt.event.ItemListener;import ng.reflect.InvocationTargetException;import ng.reflect.Method;import com.px1987.imsystem.client.constant.IMSystemClientAppConstant;import com.px1987.imsystem.client.dialog.FindNewFriendAndGroupDialog;public class FindNewFriendAndGroupDialog_ItemListenerEventHandler implements ItemListener {private FindNewFriendAndGroupDialog eventSourceContainer = null;private String eventHandlerMethodName = null;public FindNewFriendAndGroupDialog_ItemListenerEventHandler() {super();}publicFindNewFriendAndGroupDialog_ItemListenerEventHandler(FindNewFriendAndGroupDialogeventSourceContainer, String eventHandlerMethodName) { super();this.eventSourceContainer = eventSourceContainer;this.eventHandlerMethodName = eventHandlerMethodName;}@SuppressWarnings("unchecked")public void itemStateChanged(ItemEvent itemEventObject) {Class currentEventHandlerClass = this.getClass();Method eventHandlerMmethod = null;try { //获得事件处理方法eventHandlerMmethod = currentEventHandlerClass.getMethod(this.eventHandlerMethodName, new Class[] {itemEventObject.getClass()});} catch (SecurityException exception) {exception.printStackTrace();System.out.println("出现了SecurityException异常错误,错误信息为:" +exception.getMessage());} catch (NoSuchMethodException exception) {exception.printStackTrace();System.out.println("出现了NoSuchMethodException异常错误,错误信息为:"+ exception.getMessage());}try { //调用指定的事件处理方法eventHandlerMmethod.invoke(this, new Object[] {itemEventObject});} catch (InvocationTargetException exception) {exception.printStackTrace();System.out.println("出现了InvocationTargetException异常错误,错误信息为:" + exception.getMessage());} catch (IllegalArgumentException exception) {exception.printStackTrace();System.out.println("出现了IllegalArgumentException异常错误,错误信息为:" + exception.getMessage());} catch (IllegalAccessException exception) {exception.printStackTrace();System.out.println("出现了IllegalAccessException异常错误,错误信息为:" +exception.getMessage());}}public void findExactRadioButton_itemStateChanged(ItemEvent e) {if (eventSourceContainer.getFindExactRadioButton().isSelected()) {eventSourceContainer.setSearchUserInfoType(IMSystemClientAppConstant.SearchUserInfoType_findExactRadioButton);}}public void findByConditionRadioButton_itemStateChanged(ItemEvent e) {if (eventSourceContainer.getFindByConditionRadioButton().isSelected()) {eventSourceContainer.setSearchUserInfoType(IMSystemClientAppConstant.SearchUserInfoType_findByConditionRadioButton);}}}13、设置聊天信息主窗口内聊天信息文字的字体对话类(1)类名称为FontChooserDialog,实现java.awt.event.ActionListener接口,包名称为com.px1987.imsystem.client.dialog,继承于javax.swing.JDialog类(2)编程该类的代码package com.px1987.imsystem.client.dialog;import java.awt.GraphicsEnvironment;import javax.swing.JDialog;import javax.swing.JFrame;import javax.swing.ListModel;import java.awt.Font;import javax.swing.JPanel;import java.awt.Rectangle;import javax.swing.JScrollPane;import javax.swing.BorderFactory;import javax.swing.border.TitledBorder;import java.awt.Color;import javax.swing.JList;import javax.swing.JLabel;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import javax.swing.JTextField;import javax.swing.border.BevelBorder;import javax.swing.border.SoftBevelBorder; import javax.swing.JButton;import javax.swing.SwingConstants;public class FontChooserDialog extends JDialog { private static final long serialVersionUID = 1L;/*** 界面设计需要* */private JPanel jPanel = null;private JScrollPane jScrollPane = null;private JPanel jPanel1 = null;private JLabel jLabel = null;private JLabel jLabel1 = null;private JLabel jLabel2 = null;private JTextField fontNameText = null;private JTextField fontItalicText = null;private JTextField fontSizeText = null;private JList fontNameList = null;private JList fontItalicList = null;private JList fontSizeList = null;private JPanel jPanel2 = null;private JButton okButton = null;private JButton regitButton = null;private JButton cancleButton = null;private JScrollPane jScrollPane1 = null;private JScrollPane jScrollPane2 = null;private JScrollPane jScrollPane3 = null;private static JLabel fontStyle = null;/*** 对话框内广告文字的默认字体变量* */private Font defaultFontInThisDialog = new Font("宋体", Font.PLAIN, 12);/*** 字体对话框示例标签的默认字体变量* */private Font fontExampleLabelDefaultFont = new Font("宋体", Font.PLAIN, 12); /*** 以防止事件重复调用或不必要的更改,定义两个boolean变量分别* 为:fontNameList和fontSizeList判断* 等于true则循环调用,false则不* */private boolean nameJuge = true;private boolean sizeJuge = true;public FontChooserDialog(){this(null);}public FontChooserDialog(JFrame jframe){this(jframe,true);}public FontChooserDialog(JFrame jframe,boolean boo){ this(jframe,boo,null);}public FontChooserDialog(JFrame jframe,boolean boo,Font font){ super(jframe,boo);initialize();initializeFont(font);this.setLocationRelativeTo(jframe);}private void initialize() {this.setContentPane(getJPanel());this.setFont(defaultFontInThisDialog);this.setBounds(new Rectangle(0, 0, 430, 335));this.setTitle("字体选择对话框");this.addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent e) {closeWindow();}});}private JPanel getJPanel() {if (jPanel == null) {jPanel = new JPanel();jPanel.setLayout(null);jPanel.setFont(new Font("Dialog", Font.PLAIN, 12));jPanel.add(getJPanel1(), null);jPanel.add(getJPanel2(), null);jPanel.add(getOkButton(), null);jPanel.add(getRegitButton(), null);jPanel.add(getCancleButton(), null);}return jPanel;}private JScrollPane getJScrollPane() {if (jScrollPane == null) {fontStyle = new JLabel();fontStyle.setText("你好!天生我才必有用!Hello World!");fontStyle.setFont(defaultFontInThisDialog);fontStyle.setHorizontalAlignment(SwingConstants.CENTER);fontStyle.setHorizontalTextPosition(SwingConstants.CENTER);jScrollPane = new JScrollPane();jScrollPane.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));jScrollPane.setViewportView(fontStyle);jScrollPane.setBounds(new Rectangle(5, 20, 400, 60));}return jScrollPane;}private JPanel getJPanel1() {if (jPanel1 == null) {jLabel2 = new JLabel();jLabel2.setBounds(new Rectangle(285, 5, 120, 15));jLabel2.setFont(defaultFontInThisDialog);jLabel2.setText("大小:");jLabel1 = new JLabel();jLabel1.setBounds(new Rectangle(160, 5, 120, 15));jLabel1.setFont(defaultFontInThisDialog);jLabel1.setText("字型:");jLabel = new JLabel();jLabel.setBounds(new Rectangle(5, 5, 150, 15));jLabel.setDisplayedMnemonic(KeyEvent.VK_UNDEFINED);jLabel.setFont(defaultFontInThisDialog);jLabel.setText("字体:");jPanel1 = new JPanel();jPanel1.setLayout(null);jPanel1.setBounds(new Rectangle(5, 5, 410, 175));jPanel1.setBorder(new SoftBevelBorder(SoftBevelBorder.LOWERED));jPanel1.add(jLabel, null);jPanel1.add(jLabel1, null);jPanel1.add(jLabel2, null);jPanel1.add(getFontNameText(), null);jPanel1.add(getFontItalicText(), null);jPanel1.add(getFontSizeText(), null);jPanel1.add(getJScrollPane1(), null);jPanel1.add(getJScrollPane2(), null);jPanel1.add(getJScrollPane3(), null);}return jPanel1;}private JTextField getFontNameText() {if (fontNameText == null) {fontNameText = new JTextField();fontNameText.setBounds(new Rectangle(5, 25, 150, 20));fontNameText.setFont(defaultFontInThisDialog);fontNameText.addKeyListener(new KeyAdapter(){public void keyTyped(KeyEvent e) {String oldText = fontNameText.getText();String newText = "";if("".equals(fontNameText.getSelectedText()) && null == fontNameText.getSelectedText()){newText = fontNameText.getText()+e.getKeyChar();}else{newText = oldText.substring(0,fontNameText.getSelectionStart())+e.getKeyChar()+oldText.substring(fontN ameText.getSelectionEnd());}nameJuge = false;fontNameList.setSelectedValue(getLateIndex(fontNameList,newText),true);nameJuge = true;}});}return fontNameText;}private JTextField getFontItalicText() {if (fontItalicText == null) {fontItalicText = new JTextField();fontItalicText.setBounds(new Rectangle(160, 25, 120, 20));fontItalicText.setFont(defaultFontInThisDialog);fontItalicText.setEnabled(false);}return fontItalicText;}private JTextField getFontSizeText() {if (fontSizeText == null) {fontSizeText = new JTextField();fontSizeText.setBounds(new Rectangle(285, 25, 120, 20));fontSizeText.setFont(defaultFontInThisDialog);fontSizeText.setColumns(4);fontSizeText.addKeyListener(new KeyAdapter(){public void keyTyped(KeyEvent e) {String oldText = fontSizeText.getText();String newText = "";if("".equals(fontSizeText.getSelectedText()) && null == fontSizeText.getSelectedText()){newText = fontSizeText.getText()+e.getKeyChar();}else{newText = oldText.substring(0,fontSizeText.getSelectionStart())+e.getKeyChar()+oldText.substring(fontSize Text.getSelectionEnd());}sizeJuge = false;fontSizeList.setSelectedValue(getLateIndex(fontSizeList,newText),true);if(newText.matches("(\\d)+")){fontStyle.setFont(newFont(fontStyle.getFont().getFontName(),fontStyle.getFont().getStyle(),Integer.parseInt(newText)) );}sizeJuge = true;}});}return fontSizeText;}private JList getFontNameList() {if (fontNameList == null) {fontNameList = new JList(GraphicsEnvironment.getLocalGraphicsEnvironment() .getAvailableFontFamilyNames());fontNameList.setFont(defaultFontInThisDialog);fontNameList.addListSelectionListener(new javax.swing.event.ListSelectionListener() {public void valueChanged(javax.swing.event.ListSelectionEvent e) {if(nameJuge){fontNameText.setText(fontNameList.getSelectedValue().toString());}fontStyle.setFont(newFont(fontNameList.getSelectedValue().toString(),fontStyle.getFont().getStyle(),fontStyle.getFont ().getSize()));}});}return fontNameList;}private JList getFontItalicList() {if (fontItalicList == null) {fontItalicList = new JList(new String[]{"Plain", "Bold", "Italic","Bold Italic"});fontItalicList.setFont(defaultFontInThisDialog);fontItalicList.addListSelectionListener(new javax.swing.event.ListSelectionListener() {public void valueChanged(javax.swing.event.ListSelectionEvent e) {fontItalicText.setText(fontItalicList.getSelectedValue().toString());fontStyle.setFont(newFont(fontStyle.getFont().getFontName(),fontItalicList.getSelectedIndex(),fontStyle.getFont().get Size()));}});}return fontItalicList;}private JList getFontSizeList() {if (fontSizeList == null) {fontSizeList = new JList(new String[]{"3", "4", "5", "6", "7", "8", "9", "10","11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "22","24", "27", "30", "34", "39", "45", "51", "60"});fontSizeList.setFont(defaultFontInThisDialog);fontSizeList.addListSelectionListener(new javax.swing.event.ListSelectionListener() {public void valueChanged(javax.swing.event.ListSelectionEvent e) {if(sizeJuge){fontSizeText.setText(fontSizeList.getSelectedValue().toString());}fontStyle.setFont(newFont(fontStyle.getFont().getFontName(),fontStyle.getFont().getStyle(),Integer.parseInt(fontSizeL ist.getSelectedValue().toString())));}});}return fontSizeList;}private JPanel getJPanel2() {if (jPanel2 == null) {jPanel2 = new JPanel();jPanel2.setLayout(null);jPanel2.setBounds(new Rectangle(3, 180, 414, 90));jPanel2.setBorder(BorderFactory.createTitledBorder(null, "效果预览",TitledBorder.DEFAULT_JUSTIFICATION,TitledBorder.DEFAULT_POSITION,defaultFontInThisDialog,new Color(51, 51, 51)));jPanel2.add(getJScrollPane(), null);}return jPanel2;}private JButton getOkButton() {if (okButton == null) {okButton = new JButton();okButton.setBounds(new Rectangle(215, 275, 60, 20));okButton.setFont(defaultFontInThisDialog);okButton.setText("确定");okButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) {closeWindow();}});}return okButton;}private JButton getRegitButton() {if (regitButton == null) {regitButton = new JButton();regitButton.setBounds(new Rectangle(285, 275, 60, 20));regitButton.setFont(defaultFontInThisDialog);regitButton.setText("重置");regitButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) {initializeFont(null);}});}return regitButton;}private JButton getCancleButton() {if (cancleButton == null) {cancleButton = new JButton();cancleButton.setBounds(new Rectangle(355, 275, 60, 20));cancleButton.setFont(defaultFontInThisDialog);cancleButton.setText("取消");cancleButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) {closeWindow();}});}return cancleButton;}private JScrollPane getJScrollPane1() {if (jScrollPane1 == null) {jScrollPane1 = new JScrollPane();jScrollPane1.setBounds(new Rectangle(5, 50, 150, 120));jScrollPane1.setViewportView(getFontNameList());}return jScrollPane1;}private JScrollPane getJScrollPane2() {if (jScrollPane2 == null) {jScrollPane2 = new JScrollPane();jScrollPane2.setBounds(new Rectangle(160, 50, 120, 120));jScrollPane2.setViewportView(getFontItalicList());}return jScrollPane2;}private JScrollPane getJScrollPane3() {if (jScrollPane3 == null) {jScrollPane3 = new JScrollPane();jScrollPane3.setBounds(new Rectangle(285, 50, 120, 120));jScrollPane3.setViewportView(getFontSizeList());}return jScrollPane3;}/*** 默认的字体初始化方法* */private void initializeFont(Font font){if(font!=null){fontExampleLabelDefaultFont = font;fontStyle.setFont(fontExampleLabelDefaultFont);}fontStyle.setFont(fontExampleLabelDefaultFont);fontNameList.setSelectedValue(fontExampleLabelDefaultFont.getFontName(), true);fontSizeList.setSelectedValue(newInteger(fontExampleLabelDefaultFont.getSize()).toString(), true);fontItalicList.setSelectedIndex(fontExampleLabelDefaultFont.getStyle());}/*** 判断里给定的值最近的索引* */private Object getLateIndex(JList jlist,String str){ListModel list = jlist.getModel();if(str.matches("(\\d)+")){for(int i = list.getSize()-1;i>=0;i--){if(Integer.parseInt(list.getElementAt(i).toString())<=Integer.parseInt(str)){return list.getElementAt(i);}}}else {for(int i = list.getSize()-2;i>=0;i--){if(pareToIgnoreCase(list.getElementAt(i).toString())==0){return list.getElementAt(i);}else if(pareToIgnoreCase(list.getElementAt(i).toString())>0){return list.getElementAt(i+1);}}}return list.getElementAt(0);}/*** 窗体关闭方法!* */private void closeWindow(){this.setVisible(false);}public Font getUserSelectFontInThisDialog(){return fontStyle.getFont();}}。
课程设计实训项目《蓝梦教育集团即时通讯系统》(仿腾讯QQ)——构建出客户端项目和共用功能类(第1部分)

J2EE课程设计实训教学示例项目《蓝梦教育集团即时通讯系统》(仿腾讯QQ)——构建出客户端项目和共用功能类(第1部分)1.1.1构建出客户端项目和引用第三方系统库文件1、构建出客户端项目SwingGUIIMApp——添加一个Java应用程序项目,项目名称为SwingGUIIMApp2、引用第三方系统库文件(1)引用服务器端的JDIC等系统库文件jdic.jar和jdic_stub.jar包文件(2)引用服务器端的Apache Common HttpClient等系统库文件commons-httpclient-3.1和commons-codec-1.3包文件(3)引用服务器端的Apache Validate等系统库文件commons-validator.jar和jakarta-oro.jar 包文件(4)引用服务器端的利用JDom技术实现的XML解析的系统库文件jdom.jar包文件(5)引用服务器端的利用Common 日志记录处理的功能实现的系统库文件commons-logging.jar包文件1.1.2构建出客户端项目中的共用功能类1、在该项目中添加一个名称为IMSystemException的自定义异常类(1)包名称为com.px1987.imsystem.client.exception,并且从ng.Exception继承(2)代码如下package com.px1987.imsystem.client.exception; public class IMSystemException extends Exception { private static final long serialVersionUID = 1L;public IMSystemException() {}public IMSystemException(String message) {super(message);}public IMSystemException(Throwable cause) {super(cause);}public IMSystemException(String message, Throwable cause) {super(message, cause);}}2、在项目中新建一个存放图像文件的目录images和拷贝图像文件(1)新建一个存放图像文件的目录images(2)然后将客户端程序中所需要的各个图像文件拷贝到对应的文件目录中,最后为下面的状态。
J2EE 课程设计项目——蓝梦集团客户关系管理系统(CRM)实现

J2EE 课程设计项目——蓝梦集团客户关系管理系统(CRM)实现1.1.1蓝梦集团客户关系管理系统(CRM)实现中所应该遵守的基本要求1、对数据访问层编程实现的基本要求(1)尽量在SQL语句中少用IN操作符虽然用IN操作符写拼接出的SQL语句清晰易懂,但由于性能低下——主要是由于用IN 的SQL语句至少多了一个转换过程。
因此尽量在系统开发中不应用该操作符,必要时可以用EXISTS方案代替。
(2)对NOT IN操作也不推荐使用,可以用NOT EXISTS或外连接方案代替,因为前者不能够使用表中的索引。
(3)由于不等于操作符是永远不会用到索引的,因此对它处理只会产生全表扫描。
可以用相同功能的操作运算符代替。
(4)由于UNION在进行表链接后会筛选掉重复的记录,在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果,因此在数据量相当庞大时,会很费时,因此可以用UNION ALL的形式代替UNION,节省大量排序筛选的时间。
(5)当存在索引的时候,尽量使用比较准确的大于小于操作符。
如:尽量使用A>=3而不用A>2,因为前者可以直接定位到等于3的记录,而后者要先定位到等于2的记录再进行比较筛选。
2、对系统中的业务服务层和数据访问层充分应用单元测试单元测试是在软件开发过程中要进行的低级别的测试活动,在单元测试活动中,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。
单元测试不仅仅是作为无错编码一种辅助手段在一次性的开发过程中使用,单元测试也必须还应该是可重复的,无论是在软件修改,或是移植到新的运行环境的过程中。
图4.1为项目中的数据库连接组件的单元测试的结果局部截图。
图4.1项目中的数据库连接组件的单元测试的结果局部截图单元测试是由程序员自己来完成,最终受益的也是程序员自己。
程序员有责任编写功能代码,同时也就有责任为自己的代码编写单元测试用例——验证对应的功能代码的行为和系统所期望的保持一致。
J2EE 课程设计项目《蓝梦集团客户关系管理系统(CRM)系统》实现项目中的数据库连接功能及测试

J2EE 课程设计项目《蓝梦集团客户关系管理系统(CRM)系统》实现项目中的数据库连接功能及测试1.1.1实现项目中的数据库连接功能1、设计数据库连接组件-----ConnectDBInterface接口(1)添加接口接口的名称为ConnectDBInterface,包名称为com.px1987.webcrm.dao.inter(2)设计该接口中的成员方法(3)在项目中新增一个自定义的异常类——统一异常处理2、为ConnectDBInterface接口提供一个实现类(1)类名称为MySQLConnectDBBean,包名称为com.px1987.webcrm.dao.imple,并且实现ConnectDBInterface接口(2)编程该类package com.px1987.webcrm.dao.imple;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import java.util.logging.Level;import java.util.logging.Logger;import com.px1987.webcrm.config.SystemConfigInfo;import com.px1987.webcrm.dao.inter.ConnectDBInterface;import com.px1987.webcrm.exception.WebCRMException;public class MySQLConnectDBBean implements ConnectDBInterface {private static String JDBC_DBDriver_ClassName =null;private static String JDBC_DSN_URL = null;private static String JDBC_dbUserName=null;private static String JDBC_dbUserPassWord=null;private java.sql.Connection jdbcDBConnection = null;private static Logger logger = Logger.getLogger(MySQLConnectDBBean.class.getName());static{/** 利用SystemConfigInfo实现从属性文件中获得与数据库相关的连接信息*/JDBC_DBDriver_ClassName = SystemConfigInfo.getProperty("JDBC_DBDriver_ClassName");JDBC_DSN_URL = SystemConfigInfo.getProperty("JDBC_DSN_URL");JDBC_dbUserName = SystemConfigInfo.getProperty("JDBC_dbUserName");JDBC_dbUserPassWord = SystemConfigInfo.getProperty("JDBC_dbUserPassWord");try{Class.forName(JDBC_DBDriver_ClassName);}catch (ng.ClassNotFoundException e){ //在此先不考虑异常处理logger.log(, "不能正确地加载JDBC驱动程序"+e.getMessage());}}public MySQLConnectDBBean() {}public void initDBConnection() throws WebCRMException{try{jdbcDBConnection = DriverManager.getConnection(JDBC_DSN_URL,JDBC_dbUserName,JDBC_dbUserPassWord);}catch (java.sql.SQLException e) {logger.log(, e.getMessage());throw new WebCRMException("不能正确地连接数据库并且出现SQLException");}catch (NullPointerException e){logger.log(, e.getMessage());throw new WebCRMException("不能正确地连接数据库并且出现NullPointerException");}}public void closeDBCon() throws WebCRMException {if(jdbcDBConnection==null){return;}try { //注意:要识别是否为重复调用,否则会出现数据库连接已经关闭的状况jdbcDBConnection.close();jdbcDBConnection = null;}catch (SQLException e){logger.log(, e.getMessage());throw new WebCRMException("不能正确地关闭数据库连接");}}public Connection getConnection() throws WebCRMException {initDBConnection();return jdbcDBConnection;}public boolean isDBConnectionClose(){return (jdbcDBConnection==null)?true:false;}}(3)JDK中提供的日志记录功能Logger可以利用日志记录来代替System.out.println()打印输出。
课程设计任务书--即时聊天系统

《JAVA程序设计》课程设计任务书--即时聊天系统一、课程设计任务与目的本课程设计要求学生对《即时聊天系统》进行分析、设计及编程实现。
要求该系统实现服务器端和客户端功能,可以在企业内部网络和互联网上运行。
可以和好友进行交流,信息即时发送,即时回复,传输文件等功能。
界面友好。
本课程设计对课程设计项目已经作了较为详细的分析及相关知识讲解,通过课程设计,促使学生专业技能得到综合训练,让学生了解软件开发基本技术和工作过程。
同时,本课程设计中将会让学生了解JAVA程序设计中一些高级技术。
通过本系统的开发,同学门要了解软件开发的整个过程,掌握软件开发的基本方法,提前培养同学们从事软件行业应具备的基本素质和能力,为以后的学习作一个铺垫。
二、系统开发步骤软件开发一般有以下步骤:1. 问题定义2. 可行性研究3. 需求分析4. 总体设计5. 详细设计6. 编码及单元测试7. 综合测试8. 软件维护其中1、2、3步可以整合为调研分析阶段,4、5、6、7步可以整合为项目实施阶段。
根据本次课程设计的实际情况,我们着重进行系统设计和编码实施。
该阶段主要工作有:1.系统结构的总体设计决定系统的总体结构,包括整个系统分哪些部分,各部分之间有什么联系以及已确定的需求对这些组成部分如何分配等方面。
2.数据结构定义定义软件处理的对象——类,定义数据处理流程。
3.详细设计对各功能模块的功能定义,说明模块之间的调用关系与接口(参数)。
4.编码及调试根据详细设计的要求,按照统一的要求和编码规范,用JAVA语言编码实现,同时负责每个模块的独立调试。
5.综合测试软件开发的后期是软件装配和综合测试。
软件测试一般有专业的测试人员,同时通过发布使用试用版(体验版)等方式让用户体验、测试。
在多次测试改进后,才正式发布。
三、系统功能需求描述1.客户端注册新用户功能。
2.客户登录功能。
3.添加/删除好友功能。
4.消息收发功能。
5.好友上下线提示。
6.用户基本信息管理。
J2EE课程设计实训教学示例项目《蓝梦教育集团即时通讯系统》(仿腾讯QQ)—构建出服务器端项目(第2部分)

J2EE课程设计实训教学示例项目《蓝梦教育集团即时通讯系统》(仿腾讯QQ)——构建出服务器端项目(第2/4部分)5、利用SAX技术实现的对系统中的公告信息的XML文件进行解析的功能实现(1)XMLInformationConfig接口,包名称为com.px1987.imsystem.server.xmlparse.interpackage com.px1987.imsystem.server.xmlparse.inter;import com.px1987.imsystem.server.exception.IMSystemException;public interface XMLInformationConfig {public void xmlInit(String configFilePathAndName) throws IMSystemException;}(2)该接口的实现类SAXInformationConfig,并且继承于org.xml.sax.helpers.DefaultHandler 类(3)编程该类中的功能实现代码package com.px1987.imsystem.server.xmlparse.imple;import java.io.File;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;import com.px1987.imsystem.server.exception.IMSystemException;import com.px1987.imsystem.server.xmlparse.inter.XMLInformationConfig;public class SAXInformationConfig extends DefaultHandler implements XMLInformationConfig{private String marqueeText = "";public String getMarqueeText(){return marqueeText;}public SAXInformationConfig(){}/*** 读取配置文件信息,并设置相关参数。
J2EE课程设计实训教学示例项目《蓝梦教育集团即时通讯系统》(仿腾讯QQ)

J2EE课程设计实训教学示例项目《蓝梦教育集团即时通讯系统》(仿腾讯QQ)1、即时通讯项目介绍,(1)即时通讯系统是一种集声音、文字、图像的低成本高效率的综合型的“通讯平台”即时通讯(IM系统,Instant Messaging)正以其实时性、跨平台性、低成本和高效性,逐渐改变人们在学习和工作中的沟通与交流的方式。
(2)即时通讯工具的种类1)个人即时通讯:满足人们交友、聊天、通讯和娱乐等需求,如腾讯QQ,UC朗玛,网易泡泡,IMU等。
2)企业即时通讯:满足企业日常办公交流的需要而开发,如微软的MSN、腾讯RTX、TM和雅虎通等。
3)商务即时通讯:为了满足某个商务活动和交易的需要而开发,如淘宝的旺旺、阿里巴巴的“贸易通”。
电子商务IM软件与大众IM软件最大的不同在于商机搜索和商机精准匹配上。
4)特殊即时通讯:满足特殊人群的需要或具有特殊功能的需要而开发的。
(3)企业即时通讯系统利用企业即时通讯可以建立一个以自身公司为核心的即时通讯平台,创造新型办公沟通模式,提升办公效率,降低企业通信费用,增强企业内部沟通能力,改善企业与客户之间的沟通渠道。
用户可以直接用邮箱、IM号和手机号登录,提供即时通讯等方面的功能。
2、蓝梦教育集团即时通讯系统著名教育企业蓝梦教育集团(Blue Dream Group),为了能够在中国迅速地开展与教育产品和IT技能培训有关的各个方面的业务、并期望能够取得比较好的效益和提高各项教育产品的质量以迎接新的挑战,需要全面地提升本土化的信息化项目建设的进度、拟计划开发出蓝梦教育集团即时通讯系统提高企业内部的工作效率。
同时也期望通过IM系统中的语音和视频交互、文件传输、屏幕抓取、远程协助等功能增强师生之间的沟通效率和提高教学效果。
如下为蓝梦教育集团即时通讯系统客户端程序的主界面示例图。
3、为什么要选择此IM系统项目作为实训教学(1)IM系统是比较流行的企业通讯项目企业即时通讯系统是目前企业内部员工之间、企业与外界之间通讯的主要工具,并能够打破地域的限制。
Java语言程序设计教学课程设计项目——蓝梦集团即时通讯(IM)系统设计

1.1Java语言程序设计教学课程设计项目——蓝梦集团即时通讯(IM)系统设计1、何谓“设计”“理性地思考、并且找到最佳的解决方案”!2、如何实现IM的设计(1)分层——系统架构设计(2)分块——系统模块设计(3)分类功能——系统类设计(决定某个类中应该有哪些方法、类之间的关系)3、IM的系统架构设计——采用UML的包图表现(1)决定系统采用C/S还是B/S方案——采用C/S方案(2)分层的体现——分为客户端和服务器端(3)采用什么技术实现IM采用什么的技术平台——还是J2EE ?采用什么的框架技术和具体的技术——Struts?(适宜Web)、Spring、Hibernate、Jdom、JDBC等(4)本项目分层实现的UML包图的结果(5)本项目分层编程实现的结果IMSystem_Client、IMSystem_Server4、IM客户的系统模块设计——采用UML的组件图表现(1)本系统的主要功能连接服务器、关闭连接、获得用户信息、发送和接收文本消息、消息日志管理(保存、查询、删除等)、好友(用户)管理(保存、查询、删除等)、发送和接收文件(程序)。
(2)模块设计中主要考虑的问题及设计结果决定在某个层中应该有哪些“功能类”。
(3)IM客户的模块设计结果连接服务器的功能类——完成或者承担“连接服务器、关闭连接”等职责发送的消息信息管理功能类——完成或者承担“获得用户信息、发送和接收文本消息”等职责消息日志信息管理功能类——完成或者承担“消息日志信息的保存、查询、删除”等职责好友(用户)管理功能类——完成或者承担“好友信息的保存、查询、删除”等职责发送和接收文件(程序)功能类——完成或者承担“文件的发送和接收”等职责(4)UML组件图——“关系太紧密”(也就是“藕合度高”)?(6)依据“依赖倒置原则(面向接口)”优化各个组件之间的关系——不希望产生相互依赖5、IM客户端的系统类设计——采用UML的类图表现(1)各个功能类的设计1)决定某个具体的类中的成员(方法和属性)2)决定各个类之间的关系和关系的形式(2)本项目的客户端的局部类图。
课程设计项目《蓝梦教育集团即时通讯系统》(仿腾讯QQ)——完善客户端聊天信息主窗口程序类(第1部分)

J2EE课程设计实训教学示例项目《蓝梦教育集团即时通讯系统》(仿腾讯QQ)——完善客户端聊天信息主窗口程序类(第2部分)1.1.1熟悉了解JTextPane类1、JEditorPane和JTextPane类JEditorPane可以显示HTML和RTF文档,而且它还将激活另一种事件,即HyperlinkEvent。
当鼠标进入、离开或点击一个超链接时,就会激活此事件的子类型事件。
而JTextPane是JEditorPane的子类,它无所不能,可以在同一个组件中显示多种字体和多种样式,还提供对光标(插入记号)、加亮、嵌入图像和其它高级特性的支持。
2、在JTextPane中常用到属性类SimpleAttributeSet和StyleConstant(1)SimpleAttributeSet类属性的变化原本是利用AttributeSet接口来处理的,但是这个接口中包含了太多的方法,若是我们直接实现AttributeSet接口那就需要实作此接口中的所有的方法,这对编写程序来说并不是一个很理想的做法。
而java另外提供了SimpleAttributeSet类,实现了AttributeSet接口。
因此,只要我们直接使用SimpleAttributeSet类就能具备AttributeSet接口的所有功能,而不用一个个的编写AttributeSet中的方法。
(2)StyleConstant类StyleConstant类则是提供AttributeSet类许多常用的属性键值(Attribute Key)和方法来设置或取得JTextPane内容的状态。
在StyleConstant类中包含了许多的常用的属性设置,包括本文与边界空白区段设置、文字字体/大小/类型设置、背景颜色设置等。
SimpleAttributeSet属性集需要利用StyleConstants类中的静态方法来处理。
例如,要创建一组指定红色的属性,可采用如下做法:SimpleAttributeSet redstyle = new SimpleAttributeSet();StyleConstants.setForeground(redstyle, Color.red);为了向文档中增加一些红色的文本,只需将文本和属性传递给文档的insertString()方法,如下所示:document.insertString(6,"Some red text", redstyle):insertString的第一个实参是文本的偏移量。
J2EE课程设计实训教学项目《蓝梦教育集团即时通讯系统》(仿腾讯QQ)——完善消息管理主窗口功能实现程序类

J2EE课程设计实训教学示例项目《蓝梦教育集团即时通讯系统》(仿腾讯QQ)——完善消息管理主窗口功能实现程序类1.1.1完善消息管理主窗口类中的各个事件类1、MessageManageMainFrame_ActionListenerEventHandler类(1)类名称为MessageManageMainFrame_ActionListenerEventHandler,包名称为com.px1987.imsystem.client.frame.messagemanageframe.event,实现java.awt.event.ActionListener接口(2)编程该类package com.px1987.imsystem.client.frame.messagemanageframe.event;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import ng.reflect.InvocationTargetException;import ng.reflect.Method;import com.px1987.imsystem.client.frame.MessageManageMainFrame;public class MessageManageMainFrame_ActionListenerEventHandler implements ActionListener {private MessageManageMainFrame eventSourceContainer = null;public MessageManageMainFrame getEventSourceContainer() {return eventSourceContainer;}public void setEventSourceContainer(MessageManageMainFrame eventSourceContainer) { this.eventSourceContainer = eventSourceContainer;}private String eventHandlerMethodName = null;public MessageManageMainFrame_ActionListenerEventHandler() {super();}publicMessageManageMainFrame_ActionListenerEventHandler(MessageManageMainFrame eventSourceContainer,String eventHandlerMethodName) {super();this.eventSourceContainer = eventSourceContainer;this.eventHandlerMethodName = eventHandlerMethodName;}@SuppressWarnings("unchecked")public void actionPerformed(ActionEvent actionEventObject) {Class currentEventHandlerClass = this.getClass();Method eventHandlerMmethod = null;try { //获得事件处理方法eventHandlerMmethod = currentEventHandlerClass.getMethod(this.eventHandlerMethodName, new Class[] {actionEventObject.getClass()});} catch (SecurityException exception) {exception.printStackTrace();System.out.println("出现了SecurityException异常错误,错误信息为:" +exception.getMessage());} catch (NoSuchMethodException exception) {exception.printStackTrace();System.out.println("出现了NoSuchMethodException异常错误,错误信息为:" + exception.getMessage());}try { //调用指定的事件处理方法eventHandlerMmethod.invoke(this, new Object[] {actionEventObject});} catch (InvocationTargetException exception) {exception.printStackTrace();System.out.println("出现了InvocationTargetException异常错误,错误信息为:" + exception.getMessage());} catch (IllegalArgumentException exception) {exception.printStackTrace();System.out.println("出现了IllegalArgumentException异常错误,错误信息为:" + exception.getMessage());} catch (IllegalAccessException exception) {exception.printStackTrace();System.out.println("出现了IllegalAccessException异常错误,错误信息为:" +exception.getMessage());}}public void someOnePageJTextField_onClick(ActionEvent e) {}}2、MessageManageMainFrame_MouseListener_MouseClickedEventHandler类(1)类名称为MessageManageMainFrame_MouseListener_MouseClickedEventHandler,包名称为com.px1987.imsystem.client.frame.messagemanageframe.event,继承于java.awt.event.MouseAdapter类(2)编程该类package com.px1987.imsystem.client.frame.messagemanageframe.event;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import ng.reflect.InvocationTargetException;import ng.reflect.Method;import com.px1987.imsystem.client.frame.MessageManageMainFrame;public class MessageManageMainFrame_MouseListener_MouseClickedEventHandler extends MouseAdapter {private MessageManageMainFrame eventSourceContainer = null;public MessageManageMainFrame getEventSourceContainer() {return eventSourceContainer;}public void setEventSourceContainer(MessageManageMainFrame eventSourceContainer) { this.eventSourceContainer = eventSourceContainer;}private String eventHandlerMethodName = null;public MessageManageMainFrame_MouseListener_MouseClickedEventHandler() { super();}public MessageManageMainFrame_MouseListener_MouseClickedEventHandler( MessageManageMainFrameeventSourceContainer,String eventHandlerMethodName) {super();this.eventSourceContainer = eventSourceContainer;this.eventHandlerMethodName = eventHandlerMethodName;}public void mouseClicked(MouseEvent mouseEventObject) {mouseEventDelegate(mouseEventObject);}@SuppressWarnings("unchecked")public void mouseEventDelegate(MouseEvent mouseEventObject) {Class currentEventHandlerClass = this.getClass();Method eventHandlerMmethod = null;try { //获得事件处理方法eventHandlerMmethod = currentEventHandlerClass.getMethod(this.eventHandlerMethodName, new Class[] {mouseEventObject.getClass()});} catch (SecurityException exception) {exception.printStackTrace();System.out.println("出现了SecurityException异常错误,错误信息为:" +exception.getMessage());} catch (NoSuchMethodException exception) {exception.printStackTrace();System.out.println("出现了NoSuchMethodException异常错误,错误信息为:" + exception.getMessage());}try { //调用指定的事件处理方法eventHandlerMmethod.invoke(this, new Object[] {mouseEventObject});} catch (InvocationTargetException exception) {exception.printStackTrace();System.out.println("出现了InvocationTargetException异常错误,错误信息为:" + exception.getMessage());} catch (IllegalArgumentException exception) {exception.printStackTrace();System.out.println("出现了IllegalArgumentException异常错误,错误信息为:" + exception.getMessage());} catch (IllegalAccessException exception) {exception.printStackTrace();System.out.println("出现了IllegalAccessException异常错误,错误信息为:" + exception.getMessage());}}public void pullDownImageLabel_mouseClicked(MouseEvent e) {}public void deleteImageLabel_mouseClicked(MouseEvent e) {}public void refreshImageLabel_mouseClicked(MouseEvent e) {}public void positionLabel_mouseClicked(MouseEvent e) {}public void imfindImageLabel_mouseClicked(MouseEvent e) {}public void firstPageLabel_mouseClicked(MouseEvent e) {}public void previousPageLabel_mouseClicked(MouseEvent e) {}public void nextPageLabel_mouseClicked(MouseEvent e) {}public void lastPageLabel_mouseClicked(MouseEvent e) {}public void returnImageLabel_mouseClicked(MouseEvent e) {}}3、MessageManageMainFrame_WindowListener_WindowClosingEventHandler类(1)类名称为MessageManageMainFrame_WindowListener_WindowClosingEventHandler,包名称为com.px1987.imsystem.client.frame.messagemanageframe.event,继承于java.awt.event.WindowAdapter类(2)编程该类package com.px1987.imsystem.client.frame.messagemanageframe.event;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import ng.reflect.InvocationTargetException;import ng.reflect.Method;import com.px1987.imsystem.client.frame.MessageManageMainFrame;import com.px1987.imsystem.client.util.HttpClient_JDICUtils;public class MessageManageMainFrame_WindowListener_WindowClosingEventHandler extends WindowAdapter {private MessageManageMainFrame eventSourceContainer = null;private String eventHandlerMethodName = null;public MessageManageMainFrame_WindowListener_WindowClosingEventHandler() { super();}publicMessageManageMainFrame_WindowListener_WindowClosingEventHandler(MessageManageM ainFrameeventSourceContainer,String eventHandlerMethodName) {super();this.eventSourceContainer = eventSourceContainer;this.eventHandlerMethodName = eventHandlerMethodName;}public void windowClosing(WindowEvent windowEventObject) {windowEventDelegate(windowEventObject);}@SuppressWarnings("unchecked")public void windowEventDelegate(WindowEvent windowEventObject) {Class currentEventHandlerClass = this.getClass();Method eventHandlerMmethod = null;try { //获得事件处理方法eventHandlerMmethod = currentEventHandlerClass.getMethod(this.eventHandlerMethodName, new Class[] {windowEventObject.getClass()});} catch (SecurityException exception) {exception.printStackTrace();System.out.println("出现了SecurityException异常错误,错误信息为:" +exception.getMessage());} catch (NoSuchMethodException exception) {exception.printStackTrace();System.out.println("出现了NoSuchMethodException异常错误,错误信息为:" + exception.getMessage());}try { //调用指定的事件处理方法eventHandlerMmethod.invoke(this, new Object[] {windowEventObject});} catch (InvocationTargetException exception) {exception.printStackTrace();System.out.println("出现了InvocationTargetException异常错误,错误信息为:" +exception.getMessage());} catch (IllegalArgumentException exception) {exception.printStackTrace();System.out.println("出现了IllegalArgumentException异常错误,错误信息为:" + exception.getMessage());} catch (IllegalAccessException exception) {exception.printStackTrace();System.out.println("出现了IllegalAccessException异常错误,错误信息为:" +exception.getMessage());}}public void this_windowClosing(WindowEvent e) {eventSourceContainer.getOneIMSystemMainFrame().setLocationRelativeTo(null); // 将系统主窗口重新定位到屏幕的中间HttpClient_JDICUtils.setIsMessageManageMainFrame_Show(false);eventSourceContainer.dispose(); //仅关闭主窗口、但不退出系统程序}}1.1.2完善消息管理主窗口类中的各个子面板类1、UpNorthToolBarButtonPanel类(1)类名称为UpNorthToolBarButtonPanel,包名称为com.px1987.imsystem.client.frame.messagemanageframe,继承于javax.swing.JPanel类(2)编程该类package com.px1987.imsystem.client.frame.messagemanageframe;import java.awt.Cursor;import java.awt.FlowLayout;import youtManager;import java.util.Enumeration;import javax.swing.ImageIcon;import javax.swing.JComboBox;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JTree;import javax.swing.tree.TreeNode;import com.px1987.imsystem.client.frame.MessageManageMainFrame;importcom.px1987.imsystem.client.frame.messagemanageframe.event.MessageManageMainFrame_Mo useListener_MouseClickedEventHandler;import com.px1987.imsystem.client.util.IMSystemClientUtils;public class UpNorthToolBarButtonPanel extends JPanel {private static final long serialVersionUID = -7546540651613297087L;private JLabel inandOutImageabel =null;private JLabel pullDownImageLabel =null;private JLabel deleteImageLabel = null;private JLabel refreshImageLabel =null;private JLabel positionLabel =null;private JLabel findRangeLabel =null;private JComboBox allGroupNameComboBox = null;private JLabel findContentLabel = null;private JComboBox findContentComboBox =null;private JLabel imfindImageLabel = null;private MessageManageMainFrame oneMessageManageMainFrame=null;public MessageManageMainFrame getOneMessageManageMainFrame() {return oneMessageManageMainFrame;}public void setOneMessageManageMainFrame(MessageManageMainFrame oneMessageManageMainFrame) {this.oneMessageManageMainFrame = oneMessageManageMainFrame;}public UpNorthToolBarButtonPanel() {super();createThisToolBarButtonPanel();}public UpNorthToolBarButtonPanel(MessageManageMainFrame oneMessageManageMainFrame) {super();this.oneMessageManageMainFrame=oneMessageManageMainFrame;createThisToolBarButtonPanel();}public UpNorthToolBarButtonPanel(LayoutManager layout) {super(layout);createThisToolBarButtonPanel();}public UpNorthToolBarButtonPanel(boolean isDoubleBuffered) {super(isDoubleBuffered);createThisToolBarButtonPanel();}public UpNorthToolBarButtonPanel(LayoutManager layout,boolean isDoubleBuffered) {super(layout, isDoubleBuffered);createThisToolBarButtonPanel();}private void createThisToolBarButtonPanel(){initThisToolBarButtonPanel();createAllButtons_InToolbar();}private void initThisToolBarButtonPanel(){FlowLayout flowLayout1 = new FlowLayout();flowLayout1.setAlignment(FlowLayout.LEFT);this.setLayout(flowLayout1);this.setBackground(IMSystemClientUtils.getNoSerializableVOInstance().getLoginFormBgColor());}@SuppressWarnings("unchecked")private void createAllButtons_InToolbar(){inandOutImageabel = new JLabel();inandOutImageabel.setIcon(new ImageIcon(getClass().getResource("/images/messageManageFrame/inout.jpg")));inandOutImageabel.setText("导入和导出");this.add(inandOutImageabel);pullDownImageLabel = new JLabel();pullDownImageLabel.setIcon(new ImageIcon(getClass().getResource("/images/messageManageFrame/pulldown.jpg")));pullDownImageLabel.setCursor(new Cursor(Cursor.HAND_CURSOR)); //改变鼠标形状pullDownImageLabel.addMouseListener(newMessageManageMainFrame_MouseListener_MouseClickedEventHandler(oneMessageManageM ainFrame,"pullDownImageLabel_mouseClicked"));this.add(pullDownImageLabel);deleteImageLabel = new JLabel();deleteImageLabel.setCursor(new Cursor(Cursor.HAND_CURSOR)); //改变鼠标形状deleteImageLabel.addMouseListener(newMessageManageMainFrame_MouseListener_MouseClickedEventHandler(oneMessageManageM ainFrame,"deleteImageLabel_mouseClicked"));deleteImageLabel.setIcon(new ImageIcon(getClass().getResource("/images/messageManageFrame/delete.jpg")));this.add(deleteImageLabel);refreshImageLabel = new JLabel();refreshImageLabel.setCursor(new Cursor(Cursor.HAND_CURSOR)); //改变鼠标形状refreshImageLabel.addMouseListener(newMessageManageMainFrame_MouseListener_MouseClickedEventHandler(oneMessageManageM ainFrame,"refreshImageLabel_mouseClicked"));refreshImageLabel.setIcon(new ImageIcon(getClass().getResource("/images/messageManageFrame/refresh.jpg")));this.add(refreshImageLabel);positionLabel = new JLabel();positionLabel.setCursor(new Cursor(Cursor.HAND_CURSOR)); //改变鼠标形状positionLabel.addMouseListener(newMessageManageMainFrame_MouseListener_MouseClickedEventHandler(oneMessageManageM ainFrame,"positionLabel_mouseClicked"));positionLabel.setIcon(new ImageIcon(getClass().getResource("/images/messageManageFrame/position.jpg")));this.add(positionLabel);findRangeLabel = new JLabel();findRangeLabel.setText("查找范围:");this.add(findRangeLabel);//下面的代码是动态地获得系统主窗口中的消息树中的第一级节点的名称,然后再添加到allGroupNameComboBox中allGroupNameComboBox = new JComboBox();allGroupNameComboBox.addItem("所有分组");JTree centerJTree =oneMessageManageMainFrame.getOneIMSystemMainFrame().getCenterTreeScrollPanel().get CenterInfoTree();TreeNode root = (TreeNode) centerJTree.getModel().getRoot();for (Enumeration<TreeNode> e = root.children(); e.hasMoreElements(); ) {TreeNode someOneChildTreeNode = (TreeNode) e.nextElement();allGroupNameComboBox.addItem(someOneChildTreeNode.toString()); //获得某个节点的名称并添加到allGroupNameComboBox中}this.add(allGroupNameComboBox);findContentLabel = new JLabel();findContentLabel.setText("查找内容:");findContentComboBox = new JComboBox();findContentComboBox.setEditable(true);this.add(findContentLabel);this.add(findContentComboBox);imfindImageLabel = new JLabel();imfindImageLabel.setCursor(new Cursor(Cursor.HAND_CURSOR)); //改变鼠标形状imfindImageLabel.addMouseListener(newMessageManageMainFrame_MouseListener_MouseClickedEventHandler(oneMessageManageM ainFrame,"imfindImageLabel_mouseClicked"));imfindImageLabel.setIcon(new ImageIcon(getClass().getResource("/images/messageManageFrame/imFind.jpg")));imfindImageLabel.setText("立即查找");this.add(imfindImageLabel);}}2、LeftTreeMenuPanel类(1)类名称为LeftTreeMenuPanel,包名称为com.px1987.imsystem.client.frame.messagemanageframe,继承于javax.swing.JPanel类(2)编程该类package com.px1987.imsystem.client.frame.messagemanageframe; import java.awt.BorderLayout;import java.awt.Color;import java.awt.FlowLayout;import java.awt.Font;import youtManager;import javax.swing.ImageIcon;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTree;import javax.swing.tree.DefaultMutableTreeNode;import javax.swing.tree.DefaultTreeCellRenderer;import javax.swing.tree.MutableTreeNode;import com.px1987.imsystem.client.frame.MessageManageMainFrame;import com.px1987.imsystem.client.util.IMSystemClientUtils;public class LeftTreeMenuPanel extends JPanel {private static final long serialVersionUID = 9062656015695314552L;private JTree allGroupNameTree = null;private MessageManageMainFrame oneMessageManageMainFrame=null;private JScrollPane leftTreeScrollPane =null;public LeftTreeMenuPanel() {super();}public LeftTreeMenuPanel(MessageManageMainFrame oneMessageManageMainFrame) { super();this.oneMessageManageMainFrame=oneMessageManageMainFrame;creatAllGroupNameInfoTreeAndSetUpProperty();ceateThisLeftTreeMenuPanel();}public LeftTreeMenuPanel(LayoutManager layout) {super(layout);}public LeftTreeMenuPanel(boolean isDoubleBuffered) {super(isDoubleBuffered);}public LeftTreeMenuPanel(LayoutManager layout, boolean isDoubleBuffered) { super(layout, isDoubleBuffered);}/** 下面的creatAllGroupNameInfoTreeAndSetUpProperty方法是创建窗口左面的树形菜单*/public void creatAllGroupNameInfoTreeAndSetUpProperty() {DefaultMutableTreeNode allGroupNameInfoRoot = newDefaultMutableTreeNode(""); //由于不需要显示出树的根节点,因此不给出根节点的名称DefaultMutableTreeNode firstLevelTreeNode_allGroupName = newDefaultMutableTreeNode("所有分组");/** 下面的代码是获得系统主窗口中的中间消息树中的各个节点,然后再添加到“所有分组”的节点中*/JTree centerJTree =oneMessageManageMainFrame.getOneIMSystemMainFrame().getCenterTreeScrollPanel().get CenterInfoTree();MutableTreeNode centerJTree_RootNode = (MutableTreeNode) centerJTree.getModel().getRoot();firstLevelTreeNode_allGroupName.add(centerJTree_RootNode);DefaultMutableTreeNode firstLevelTreeNode_groupList = newDefaultMutableTreeNode("群列表");DefaultMutableTreeNode firstLevelTreeNode_groupList_one = newDefaultMutableTreeNode("");firstLevelTreeNode_groupList.add(firstLevelTreeNode_groupList_one);DefaultMutableTreeNode firstLevelTreeNode_mobileContacter = newDefaultMutableTreeNode("手机联系人");DefaultMutableTreeNode firstLevelTreeNode_mobileContacter_one = newDefaultMutableTreeNode("");firstLevelTreeNode_mobileContacter.add(firstLevelTreeNode_mobileContacter_one);DefaultMutableTreeNode firstLevelTreeNode_researchGroup = newDefaultMutableTreeNode("讨论组");DefaultMutableTreeNode firstLevelTreeNode_researchGroup_one = newDefaultMutableTreeNode("");firstLevelTreeNode_researchGroup.add(firstLevelTreeNode_researchGroup_one); DefaultMutableTreeNode firstLevelTreeNode_tempSession = new DefaultMutableTreeNode("临时会话");DefaultMutableTreeNode firstLevelTreeNode_tempSession_one = new DefaultMutableTreeNode("");firstLevelTreeNode_tempSession.add(firstLevelTreeNode_tempSession_one); DefaultMutableTreeNode firstLevelTreeNode_systemMessage = new DefaultMutableTreeNode("系统消息");DefaultMutableTreeNode boastMessageNode = new DefaultMutableTreeNode("广播消息");DefaultMutableTreeNode groupMessageNode = new DefaultMutableTreeNode("群系统消息");DefaultMutableTreeNode validatorMessageNode = new DefaultMutableTreeNode("验证消息");DefaultMutableTreeNode saleGoodsMessageNode = new DefaultMutableTreeNode("营销消息");firstLevelTreeNode_systemMessage.add(boastMessageNode); firstLevelTreeNode_systemMessage.add(groupMessageNode); firstLevelTreeNode_systemMessage.add(validatorMessageNode); firstLevelTreeNode_systemMessage.add(saleGoodsMessageNode); allGroupNameInfoRoot.add(firstLevelTreeNode_allGroupName); allGroupNameInfoRoot.add(firstLevelTreeNode_groupList); allGroupNameInfoRoot.add(firstLevelTreeNode_mobileContacter); allGroupNameInfoRoot.add(firstLevelTreeNode_researchGroup); allGroupNameInfoRoot.add(firstLevelTreeNode_tempSession); allGroupNameInfoRoot.add(firstLevelTreeNode_systemMessage);//下面的代码是对树进行各种形式的属性设置allGroupNameTree = new JTree(allGroupNameInfoRoot); allGroupNameTree.setRootVisible(false); //屏蔽不显示根节点allGroupNameTree.putClientProperty("JTree.lineStyle", "Angled"); //使其具有直角连线allGroupNameTree.putClientProperty("JTree.lineStyle", "Horizontal"); //使树的文件夹间具有水平分隔线DefaultTreeCellRenderer cellRenderer = (DefaultTreeCellRenderer)allGroupNameTree.getCellRenderer();cellRenderer.setFont(new java.awt.Font("宋体", Font.PLAIN, 12));cellRenderer.setOpenIcon(new ImageIcon(getClass().getResource("/images/treePopMenu/open.gif"))); //设置打开状态的图cellRenderer.setClosedIcon(new ImageIcon(getClass().getResource("/images/treePopMenu/close.gif"))); //设置关闭状态的图cellRenderer.setLeafIcon(new ImageIcon(getClass().getResource("/images/treePopMenu/file.jpg"))); //设置树中叶节点的图leftTreeScrollPane =new JScrollPane();cellRenderer.setBackgroundNonSelectionColor(leftTreeScrollPane.getBackground()); //设置节点选中或者未选中的颜色cellRenderer.setBackgroundSelectionColor(Color.yellow);cellRenderer.setBorderSelectionColor(Color.red);cellRenderer.setTextNonSelectionColor(Color.black);cellRenderer.setTextSelectionColor(Color.blue);}private void ceateThisLeftTreeMenuPanel(){this.setLayout(new BorderLayout());JLabel messageGroupLabel = new JLabel();messageGroupLabel.setText("消息分组");FlowLayout flowLayout2 = new FlowLayout();flowLayout2.setAlignment(FlowLayout.LEFT);JPanel leftUpLabelPanel = new JPanel();leftUpLabelPanel.setLayout(flowLayout2);leftUpLabelPanel.setBackground(IMSystemClientUtils.getNoSerializableVOInstance().getLoginButtonBgColor());leftUpLabelPanel.add(messageGroupLabel);this.add(leftUpLabelPanel, java.awt.BorderLayout.NORTH);leftTreeScrollPane.getViewport().add(allGroupNameTree);this.add(leftTreeScrollPane, java.awt.BorderLayout.CENTER);}}3、RightPanelForSearchResult类(1)类名称为RightPanelForSearchResult,包名称为com.px1987.imsystem.client.frame.messagemanageframe,继承于javax.swing.JPanel类(2)编程该类package com.px1987.imsystem.client.frame.messagemanageframe;import java.awt.BorderLayout;import java.awt.Cursor;import java.awt.FlowLayout;import youtManager;import javax.swing.ImageIcon;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTextField;import ponent.SelfDefineJLabel_SetupFont;import com.px1987.imsystem.client.frame.MessageManageMainFrame;importcom.px1987.imsystem.client.frame.messagemanageframe.event.MessageManageMainFrame_Act ionListenerEventHandler;importcom.px1987.imsystem.client.frame.messagemanageframe.event.MessageManageMainFrame_Mo useListener_MouseClickedEventHandler;import com.px1987.imsystem.client.util.IMSystemClientUtils;public class RightPanelForSearchResult extends JPanel {private static final long serialVersionUID = 6179128149190979439L;private MessageManageMainFrame oneMessageManageMainFrame=null;private RightSearchResultPanel rightSearchResultPanel =null;private JLabel returnImageLabel =null;private JLabel nextPageLabel = null;private JLabel pageCounterLabel =null;private JTextField someOnePageJTextField =null;private JLabel textLabel = null;private JLabel previousPageLabel = null;private JLabel firstPageLabel = null;private JLabel lastPageLabel = null;public RightPanelForSearchResult() {super();}public RightPanelForSearchResult(MessageManageMainFrame oneMessageManageMainFrame) {super();this.oneMessageManageMainFrame=oneMessageManageMainFrame;creatRightPanel_ForSearchResult();}public RightPanelForSearchResult(LayoutManager layout) {super(layout);}public RightPanelForSearchResult(boolean isDoubleBuffered) {super(isDoubleBuffered);}public RightPanelForSearchResult(LayoutManager layout,boolean isDoubleBuffered) {super(layout, isDoubleBuffered);}private void creatRightPanel_ForSearchResult(){initRightPanel();createRightUpPanel();createRightSearchResultPanel();createRightDownPanel();}private void initRightPanel(){this.setLayout(new BorderLayout());}private void createRightUpPanel(){JLabel searchResultLabel = new SelfDefineJLabel_SetupFont();searchResultLabel.setText("搜索的结果信息如下:");returnImageLabel = new SelfDefineJLabel_SetupFont();returnImageLabel.setText("返回");returnImageLabel.setCursor(new Cursor(Cursor.HAND_CURSOR)); //改变鼠标形状returnImageLabel.setIcon(new ImageIcon(getClass().getResource("/images/messageManageFrame/return.jpg")));returnImageLabel.addMouseListener(newMessageManageMainFrame_MouseListener_MouseClickedEventHandler(oneMessageManageM ainFrame,"returnImageLabel_mouseClicked"));JPanel rightUpPanel = new JPanel();rightUpPanel.setLayout(new BorderLayout());rightUpPanel.setBackground(IMSystemClientUtils.getNoSerializableVOInstance().getLoginButtonBgColor());rightUpPanel.add(searchResultLabel, java.awt.BorderLayout.CENTER);rightUpPanel.add(returnImageLabel, java.awt.BorderLayout.EAST);this.add(rightUpPanel, java.awt.BorderLayout.NORTH);}private void createRightSearchResultPanel(){JScrollPane rightCenterScrollPane = new JScrollPane();rightSearchResultPanel = new RightSearchResultPanel(oneMessageManageMainFrame);rightCenterScrollPane.getViewport().add(rightSearchResultPanel);this.add(rightCenterScrollPane, java.awt.BorderLayout.CENTER);}private void createRightDownPanel(){FlowLayout flowLayout3 = new FlowLayout();flowLayout3.setAlignment(FlowLayout.RIGHT);JPanel rightDownPanel = new JPanel();rightDownPanel.setLayout(flowLayout3);rightDownPanel.setBackground(IMSystemClientUtils.getNoSerializableVOInstance().getLoginButtonBgColor());nextPageLabel = new JLabel();nextPageLabel.setIcon(new ImageIcon(getClass().getResource("/images/messageManageFrame/nextPage.jpg")));nextPageLabel.setCursor(new Cursor(Cursor.HAND_CURSOR)); //改变鼠标形状nextPageLabel.addMouseListener(newMessageManageMainFrame_MouseListener_MouseClickedEventHandler(oneMessageManageM ainFrame,"nextPageLabel_mouseClicked"));pageCounterLabel = new JLabel();pageCounterLabel.setText("页/X页");textLabel = new JLabel();textLabel.setText("第");lastPageLabel = new JLabel();lastPageLabel.setIcon(new ImageIcon(getClass().getResource("/images/messageManageFrame/lastPage.jpg")));lastPageLabel.setCursor(new Cursor(Cursor.HAND_CURSOR)); //改变鼠标形状lastPageLabel.addMouseListener(newMessageManageMainFrame_MouseListener_MouseClickedEventHandler(oneMessageManageM ainFrame,"lastPageLabel_mouseClicked"));someOnePageJTextField = new JTextField();someOnePageJTextField.setColumns(5);someOnePageJTextField.addActionListener(newMessageManageMainFrame_ActionListenerEventHandler(oneMessageManageMainFrame,"som eOnePageJTextField_onClick"));firstPageLabel = new JLabel();firstPageLabel.setCursor(new Cursor(Cursor.HAND_CURSOR)); //改变鼠标形状firstPageLabel.setIcon(new ImageIcon(getClass().getResource("/images/messageManageFrame/firstPage.jpg")));firstPageLabel.addMouseListener(newMessageManageMainFrame_MouseListener_MouseClickedEventHandler(oneMessageManageM ainFrame,"firstPageLabel_mouseClicked"));previousPageLabel = new JLabel();previousPageLabel.setCursor(new Cursor(Cursor.HAND_CURSOR)); //改变鼠标形状previousPageLabel.setIcon(new ImageIcon(getClass().getResource("/images/messageManageFrame/previousPage.jpg")));previousPageLabel.addMouseListener(newMessageManageMainFrame_MouseListener_MouseClickedEventHandler(oneMessageManageM ainFrame,"previousPageLabel_mouseClicked"));rightDownPanel.add(firstPageLabel);rightDownPanel.add(previousPageLabel);rightDownPanel.add(textLabel);rightDownPanel.add(someOnePageJTextField);rightDownPanel.add(pageCounterLabel);rightDownPanel.add(nextPageLabel);rightDownPanel.add(lastPageLabel);this.add(rightDownPanel, java.awt.BorderLayout.SOUTH);}}4、RightSearchResultPanel类(1)类名称为RightSearchResultPanel,包名称为com.px1987.imsystem.client.frame.messagemanageframe,继承于javax.swing.JPanel类。
Java语言程序设计的课程设计项目——应用Java网络技术实现的即时通迅IM项目的完整实现实例(第1部分)

1.1应用Java网络技术实现的即时通迅IM项目的完整实现实例(第1部分)1.1.1构建出Socket客户端和服务器端项目1、本项目的客户端子系统项目IMSystem_Client(即时通迅的客户端)2、本项目的服务器端子系统项目IMSystem_Server1.1.2编程实现Socket客户端程序类1、了解JDK中的Socket类的定义(1)Socket类的定义(2)Socket类的构造方法为了使连接服务器的方式更灵活,Socket类不仅可以通过自身的构造方法连接服务器,而且也可以通过connect方法来连接数据库。
2、通过构造方法连接服务器可以通过Socket类中的6个重载构造方法以不同的方式连接服务器,这6个重载的构造方法典型的应用方法如下。
(1)public Socket(String host, int port)这是最常用的构造方法,在使用时只需要提供一个字符串类型的IP或域名以及一个整型的端口号即可。
在这个构造方法中可能会抛出两个错误:UnknownHostException和IOException。
发生第一个错误的原因是提供的host并不存在或不合法,而其它的错误被归为IO错误。
因此,这个构造方法的完整定义是public Socket(String host, int port) throws UnknownHostException, IOException (2)public Socket(InetAddress inetaddress, int port)这个构造方法和第一种构造方法类似,只是将字符串形式的host改为InetAddress对象类型了。
在这个构造方法中之所以要使用InetAddress类主要是因为考虑到在程序中可能需要使用Socket类多次连接同一个IP或域名,这样使用InetAddress类的效率比较高。
另外,在使用字符串类型的host连接服务器时,可能会发生两个错误,但使用InetAddress 对象来描述host,只会发生IOException错误,这是因为当你将IP或域名传给InetAddress 时,InetAddress会自动检查这个IP或域名,如果这个IP或域名无效,那么InetAddress 就会抛出UnknownHostException错误,而不会由Socket类的构造方法抛出。
《J2EE系统架构和程序设计》课程设计实训项目——蓝梦网上商店系统详细设计说明书

《J2EE系统架构和程序设计》课程设计实训项目——蓝梦网上商店系统详细设计说明书1.1.1引言1、编写目的编写此文档的主要目的,在于从整体上详细说明蓝梦网上商店系统的功能与处理模式,使项目开发人员和管理人员明确产品功能及解决方案,针对性地进行系统开发和测试、验收等工作,并为开发、编写代码提供详细的实现方案。
本设计说明书作为蓝梦网上商店系统项目开发的依据和规范,并作为开发任务及目标依据,蓝梦网上商店系统的开发内容及达到的各项功能及性能指标以此设计说明书为准。
在本设计说明书中将详细阐述系统设计方案,供前期开发者及后期维护者参考。
2、参考资料(1)J2EE项目实训Hibernate框架技术(21世纪高等学校实用软件工程教育规划教材)杨少波编著清华大学出版社 2008 年5月(2)J2EE项目实训Spring框架技术(21世纪高等学校实用软件工程教育规划教材)杨少波编著清华大学出版社 2008 年5月(3)J2EE项目实训UML及设计模式(21世纪高等学校实用软件工程教育规划教材)杨少波编著清华大学出版社 2008 年5月(4)J2EE项目实训Struts框架技术(21世纪高等学校实用软件工程教育规划教材)杨少波编著清华大学出版社2008 年10月(5)《JSP与数据库连接》刘瑞挺,高等教育出版社(6)《数据库原理与方法》郑若忠王鸿武,湖南科学技术出版社(7)《软件需求》(美)Karl E.Wiegers 著,刘伟琴刘洪涛译1.1.2模块命名规则1、模块汇总表提示:这里模块是指相对独立的软件设计单元,例如对象类、函数包等等。
2、模块关系图1.1.3子系统模块设计1、模块1——管理员管理商品模块管理商品,首要的是添加商品,因此,就要先来设计添加商品的界面。
根据数据库设计部分可知,商品信息包括两个数据表,一个是商品类型表My_GoodsType,一个是商品信息表My_Goods,在商品类型表中初始化了四条数据。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.1Java语言程序设计教学课程设计项目——蓝梦集团即时通讯(IM)系统实现(第3部分)5、系统中的数据包装的各种实体类模块(valueobject)(1)为什么要提供该模块将系统中的各种类型的数据封装(2)最终的结果(3)ClientInfoListObjects类的代码示例package com.px1987.imsystem.valueobject;import java.util.ArrayList;import java.util.List;public class ClientInfoListObjects {private static List allClientInfoListObjects =new ArrayList();public static List getAllClientInfoListObjects() {return ClientInfoListObjects.allClientInfoListObjects;}public static void setAllClientInfoListObjects(List allClientInfoListObjects) {ClientInfoListObjects.allClientInfoListObjects = allClientInfoListObjects;}public ClientInfoListObjects() {}}(4)ClientInfoVO类的代码示例package com.px1987.imsystem.valueobject;import java.io.Serializable;import .Socket;public class ClientInfoVO implements Serializable{private static final long serialVersionUID = 4746970053581666382L;String senderIPAddress=null;int senderPort=0;public int getSenderPort() {return senderPort;}public void setSenderPort(int senderPort) {this.senderPort = senderPort;}public String getSenderIPAddress() {return senderIPAddress;}public void setSenderIPAddress(String senderIPAddress) {this.senderIPAddress = senderIPAddress;}public String getUserID() {return userID;}public void setUserID(String userID) {erID = userID;}public String getUserName() {return userName;}public void setUserName(String userName) {erName = userName;}public String getUserPassWord() {return userPassWord;}public void setUserPassWord(String userPassWord) { erPassWord = userPassWord;}public String getUserPassWordNoMD5() {return userPassWordNoMD5;}public void setUserPassWordNoMD5(String userPassWordNoMD5) { erPassWordNoMD5 = userPassWordNoMD5;}public String getUserEmail() {return userEmail;}public void setUserEmail(String userEmail) {erEmail = userEmail;}public String getRegisterTime() {return registerTime;}public void setRegisterTime(String registerTime) { this.registerTime = registerTime;}public String getUserMobileCode() {return userMobileCode;}public void setUserMobileCode(String userMobileCode) { erMobileCode = userMobileCode;}public Integer getType_User_Admin() {return type_User_Admin;}public void setType_User_Admin(Integer type_User_Admin) { this.type_User_Admin = type_User_Admin;}public String getAliaoName() {return aliaoName;}public void setAliaoName(String aliaoName) {this.aliaoName = aliaoName;}public String getPassWordAsk() {return passWordAsk;}public void setPassWordAsk(String passWordAsk) { this.passWordAsk = passWordAsk;}public String getUserImage() {return userImage;}public void setUserImage(String userImage) {erImage = userImage;}public String getPassWordAnswer() {return passWordAnswer;}public void setPassWordAnswer(String passWordAnswer) { this.passWordAnswer = passWordAnswer;}public String getUserResume() {return userResume;}public void setUserResume(String userResume) {erResume = userResume;}public Socket getSomeOneClientSocket() {return someOneClientSocket;}public void setSomeOneClientSocket(Socket someOneClientSocket) { this.someOneClientSocket = someOneClientSocket;}public static long getSerialVersionUID() {return serialVersionUID;}private String userID;private String userName;private String userPassWord;private String userPassWordNoMD5;private String userEmail = null;private String registerTime;private String userMobileCode = null;private Integer type_User_Admin; //该成员主要是区分用户的类型-----注册用户(=1)还是管理员(=2)private String aliaoName;private String passWordAsk;private String userImage;private String passWordAnswer;private String userResume;Socket someOneClientSocket=null; //便于在服务器端实现“群发消息”功能public ClientInfoVO() {}}(5)MessageInfoListObjects类的代码示例LinkedList集合同样也不具有线程同步性,但由于LinkedList集合是一种双向链式结构,因此查找数据的效率比较低——要从第一个索引元素开始,此时可以应用ArrayList集合;但它的插入和删除操作的效率比较高,所以对插入和删除操作比较频繁的应用中应该选择它。
创建一个公共的全局“消息对象池”(TreeMap),因为它是要被多个线程访问的资源——必须设置为全局的,在TreeMap集合对象中再包装各个客户的消息信息的LinkedList对象;TreeMap集合不仅实现了Map接口、也实现了SortedMap接口。
TreeMap集合不仅可以保持成员元素的顺序,而且还可以排序成员元素。
HashMap集合有利于实现对集合中的成员元素进行插入、删除和定位元素等方面的操作,但如果需要根据键的自然顺序或开发人员自定义的顺序遍历集合中的各个成员元素,一般要采用TreeMap集合——因为TreeMap集合中所有的成员元素都保持着某种固定的顺序,而HashMap集合中的元素排列顺序是不固定的。
package com.px1987.imsystem.valueobject;import java.util.TreeMap;public class MessageInfoListObjects {private static TreeMap allMessageInfoLinkedListObjects =new TreeMap();public MessageInfoListObjects() {}public static TreeMap getAllMessageInfoLinkedListObjects() {return MessageInfoListObjects.allMessageInfoLinkedListObjects;//TreeMap集合也是非线程安全的集合}public static void setAllMessageInfoLinkedListObjects(TreeMap allMessageInfoLinkedListObjects) {MessageInfoListObjects.allMessageInfoLinkedListObjects =allMessageInfoLinkedListObjects;}}(6)MessageInfoVO类的代码示例package com.px1987.imsystem.valueobject;import java.io.Serializable;public class MessageInfoVO implements Serializable {private static final long serialVersionUID = -9180275501651541201L;String sendMessageInfoText=null;String senderIPAddress=null;String sendDateAndTime=null;String senderIDName=null;String receiveMessageInfoText=null;String receiveDateAndTime=null;String receiverIDName=null;String receiverIPAddress=null;String requestCommandText=null; //代表客户端请求的命令字符串public MessageInfoVO() {}public String getReceiverIDName() {return receiverIDName;}public void setReceiverIDName(String receiverIDName) { this.receiverIDName = receiverIDName;}public String getReceiverIPAddress() {return receiverIPAddress;}public void setReceiverIPAddress(String receiverIPAddress) { this.receiverIPAddress = receiverIPAddress;}public String getSendDateAndTime() {return sendDateAndTime;}public void setSendDateAndTime(String sendDateAndTime) { this.sendDateAndTime = sendDateAndTime;}public String getSenderIDName() {return senderIDName;}public void setSenderIDName(String senderIDName) {this.senderIDName = senderIDName;}public String getSenderIPAddress() {return senderIPAddress;}public void setSenderIPAddress(String senderIPAddress) { this.senderIPAddress = senderIPAddress;}public String getRequestCommandText() {return requestCommandText;}public void setRequestCommandText(String requestCommandText) { this.requestCommandText = requestCommandText;}public String getReceiveMessageInfoText() {return receiveMessageInfoText;}public void setReceiveMessageInfoText(String receiveMessageInfoText) { this.receiveMessageInfoText = receiveMessageInfoText;}public String getSendMessageInfoText() {return sendMessageInfoText;}public void setSendMessageInfoText(String sendMessageInfoText) { this.sendMessageInfoText = sendMessageInfoText;}public String getReceiveDateAndTime() {return receiveDateAndTime;}public void setReceiveDateAndTime(String receiveDateAndTime) {this.receiveDateAndTime = receiveDateAndTime;}}1.1.1蓝梦集团IM系统中的通用模块的具体实现1、系统工作参数的配置(config)的属性配置文件(1)工作参数的属性配置文件imSystemConfig.properties注意该文件应该要放在系统的classPath的路径下,为什么?请思考在Java中的文件定位方式和如何正确地定位文件?(2)目前在客户端子系统中的imSystemConfig.properties文件中的内容serverSocketListenerHostName=127.0.0.1serverSocketListenerPort=3721handlerLogInfoDelayMS=10000handlerLogInfoPeriodMS=10000(3)目前在服务端子系统中的imSystemConfig.properties文件中的内容(4)Eclipse自动将src目录中的文件拷贝到bin目录中(classPath目录)2、对配置参数教学解析的接口(1)添加ParseSystemConfigInterface接口理解为什么要“面向接口编程实现类”?请思考:接口的主要作用是什么?——“规范”和“功能要求”(2)ParseSystemConfigInterface接口的定义体package com.px1987.imsystem.config.inter;import com.px1987.imsystem.exception.OASystemException;public interface ParseSystemConfigInterface {public String getOneSystemConfigItem(String itemIDName);public void setOneSystemConfigItem(String itemIDName,String newValue);public void savePropertiesItem(String propertiesFileName) throws OASystemException;}3、ParseSystemConfigInterface接口的具体实现类(1)熟悉Java中的Properties类(2)属性文件解析实现类ParseSystemConfigImple_ByJavaPropertyFile(3)实现类的代码package com.px1987.imsystem.config.imple;import java.io.IOException;import java.io.InputStream;import java.util.Properties;import com.px1987.imsystem.config.inter.ParseSystemConfigInterface;public class ParseSystemConfigImple_ByJavaPropertyFile implements ParseSystemConfigInterface{private static Properties oneProperties=null; // “全局共享”的效果static{oneProperties=new Properties();InputStream propertiesFileStream=ParseSystemConfigImple_ByJavaPropertyFile.class.getResourceAsStream("/imSyst emConfig.properties");try {oneProperties.load(propertiesFileStream);} catch (IOException e) {System.out.println("在加载属性文件时程序出现了异常错误!");}}public ParseSystemConfigImple_ByJavaPropertyFile() {}public String getOneSystemConfigItem(String itemIDName) {return oneProperties.getProperty(itemIDName);}public void setOneSystemConfigItem(String itemIDName,String newValue) { oneProperties.setProperty(itemIDName,newValue);}public void savePropertiesItem(String propertiesFileName)throws OASystemException{OutputStream propertiesFileStream=null;try {propertiesFileStream = new FileOutputStream(propertiesFileName);} catch (FileNotFoundException e) {throw new OASystemException("在保存属性文件时程序出现了异常错误!");}try {oneProperties.store(propertiesFileStream, "这是修改后的属性文件内容");} catch (IOException e) {throw new OASystemException("在保存属性文件时程序出现了异常错误!");}}}(4)熟悉和了解java.util.Properties类的编程实现的方法1)首先依据当前类所在的classPath路径,加载(利用load方法)属性文件到内存中2)然后再从属性集合中获得指定属性名称的项目4、异常信息处理功能类(1)熟悉和了解在Java中自定义异常类的基本规则1)为什么要自定义异常类?——统一进行异常处理,提供更准确的错误信息(中文信息)2)如何定义自己的异常类?——从系统中的“某个异常类”进行继承,或者选择从Exception类进行继承(2)在项目中添加OASystemException类(3)OASystemException类的代码示例package com.px1987.imsystem.exception;public class OASystemException extends Exception {public OASystemException() {}public OASystemException(String message) {super(message);}public OASystemException(Throwable cause) {super(cause);}public OASystemException(String message, Throwable cause) { super(message, cause);}}5、异常日志信息保存功能模块(1)遵守“面向接口”的编程原则所有的功能类都应该要提供接口的实现(2)了解java.util.logger包的功能(3)java.util.logger.Logger类的主要功能说明(4)在项目中添加ExceptionLogInterface接口(5)接口ExceptionLogInterface的定义package com.px1987.imsystem.exceptionloginfo.inter; import com.px1987.imsystem.exception.OASystemException; public interface ExceptionLogInterface {public void logInfo(String logInfoText);}6、ExceptionLogInterface接口的实现类(1)控制台方式输出的实现类ExceptionLogImple_PrintToConsole(适用于开发过程中)利用JDK中的java.util.logging.Logger类实现在控制台中显示输出日志信息。