《Java 高级应用开发》课程
作业(三)
课题名称: 网络聊天程序的设计与实现
计算机应用技术
计算机应用 ZK0901
专
班
学
姓
成
业:
级:
号:
名:
绩:
完成时间:二○一○ 年 十二月 二十五 日
一、课题设计目的
1、进一步掌握 GUI 图形用户界面设计的方法,以及事件处理的步骤;
2、进一步掌握线程的创建与调度;
3、进一步熟悉对 Java 的 IO 技术的应用;
4、能够利用数据库访问技术完成对数据的添加、删除、修改和查询处理;
5、掌握 Socket 网络通信技术。
二、课题的描述和要求
本次课题要求运用 JAVA 语言完成一个基于网络通信的聊天程序,能够实现 QQ 的简
单功能。其主要由以下几个部分构成:
1.登录界面
2、用户注册界面
3、个人信息修改界面
1
4、增加好友分组界面
5、寻找添加好友界面
6、好友列表界面
2
7、聊天界面
三、课题设计的步骤
3.1 数据库分析与设计
任务一:建立 E-R 模型
3
根据用户需求,该聊天项目主要涉及用户、好友分组、聊天记录等实体,其实体之
间关系模型图如下:
任务二:将 E-R 图转换为关系模式,并描述表结构
任务三:完成数据库、表及表之间关系的建立
3.2 窗体设计与窗体关系的建立
任务一:确定各个窗体类的类名,以及这些窗体之间的调用关系。经过分析该聊天
程序的窗体间关系如下图所示:
LoginFrame
登录窗体
RegFrame
注册窗体
ListFrame
主窗体
UpdateFrame
修改信息窗体
UpdatePassword
修改密码窗体
FoundFriend
查找添加好友窗体
addGroup
添加分组窗体
chatFrame
聊天窗体
思考:当用户登录成功后进入主窗体 ListFrame 时怎么知道是谁?进入修改信息和密码
窗体时怎么知道修改谁的信息?添加好友或者分组的时候是为谁增加?
任务二:完成各个窗体类的定义(特别注意窗体的关闭方式)。
步骤 1:根据系统需求,分析出窗体关闭时的操作。其关闭窗体后的操作如下所述:
1、关闭登录窗体:退出应用程序;
2、关闭注册窗体:返回到登录窗体,并且释放注册窗体资源;
3、关闭主窗体:退出应用程序;
4、关闭修改信息、密码窗体,以及添加好友、分组和聊天窗体:都应该是返回
到主窗体,并且将这些窗口资源释放。
步骤 2:完成各个窗体类的定义。每个窗体主要代码如下:
1、登录窗体代码
import javax.swing.*;import java.awt.*;
import java.awt.event.*;import java.sql.*;
public class LoginFrame extends JFrame {
Box bv1,bv2,bv,bv3;
JLabel b1,b2,b3,b4;
JTextField userName,server,port;
4
JPasswordField pwd;
JButton login,reg,set,save;
JPanel p1,p2,p3,p4;
LoginFrame(String s){//构造方法
super(s);
this.setBounds(200,200,240,120);
this.setResizable(false);
bv=Box.createVerticalBox();
p2=new JPanel();
bv3=Box.createHorizontalBox();
bv1=Box.createVerticalBox();
b1=new JLabel("用户号:");
bv1.add(b1);
b2=new JLabel("密 码:");
bv1.add(b2);
bv3.add(bv1);
bv2=Box.createVerticalBox();
userName=new JTextField(16);
bv2.add(userName);
pwd=new JPasswordField(16);
pwd.setEchoChar('*');
bv2.add(pwd);
bv3.add(bv2);
p2.add(bv3);
bv.add(p2);
p1=new JPanel();
login=new JButton("登录");
p1.add(login);
reg=new JButton("注册");
p1.add(reg);
set=new JButton("设置");
p1.add(set);
bv.add(p1);
p3=new JPanel();
b3=new JLabel("服务器:");
p3.add(b3);
server=new JTextField(12);
server.setText("127.0.0.1");
p3.add(server);
bv.add(p3);
p4=new JPanel();
b4=new JLabel("端口:");
p4.add(b4);
port=new JTextField(10);
port.setText("5555");
p4.add(port);
5
save=new JButton("保存");
p4.add(save);
bv.add(p4);
this.add(bv);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
2、注册窗体代码如下:
import java.awt.*;import java.awt.event.*;
import javax.swing.*;import java.sql.*;
public class RegFrame extends JFrame {
JLabel b1=new JLabel("用户号:"),
b2=new JLabel("密码:"),
b7=new JLabel("确认:"),
b3=new JLabel("昵称:"),
b4=new JLabel("性别:"),
b5=new JLabel("城市:"),
b6=new JLabel("邮箱:");
JTextField userName=new JTextField(10),
nickName=new JTextField(10),
sex=new JTextField(10),
city=new JTextField(10),
email=new JTextField(10);
JPasswordField pwd=new JPasswordField(10),
qrpwd=new JPasswordField(10);
JButton regButton=new JButton("注册"),
exitButton=new JButton("退出");
RegFrame(String s){//构造方法
super(s);
this.setBounds(200,200,180,260);
this.setResizable(false);
this.setLayout(new FlowLayout());
this.add(b1); this.add(userName);
userName.setEnabled(false);//设置不允许对用户名进行编辑
this.add(b2); this.add(pwd);
pwd.setEchoChar('*');//设置密码显示的字符
this.add(b7); this.add(qrpwd);
qrpwd.setEchoChar('*');//设置密码显示的字符
this.add(b3); this.add(nickName);
this.add(b4); this.add(sex);
this.add(b5); this.add(city);
this.add(b6); this.add(email);
this.add(regButton);
this.validate();
this.add(exitButton);
6
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}
}
3、主窗体界面的代码(特别注意树创建的步骤)
import java.awt.*;import java.awt.event.*;
import java.sql.*;import javax.swing.*;
import javax.swing.event.*;import javax.swing.tree.*;
public class ListFrame extends JFrame {
String userName;//用来保存当前登录的用户账号,通过构造方法传入
JMenuBar mb=new JMenuBar();
JMenu m1=new JMenu("主菜单"),m2=new JMenu("系统设置");
JMenuItem m11=new JMenuItem("寻找好友"),
m12=new JMenuItem("添加分组"),
m21=new JMenuItem("个人资料"),
m22=new JMenuItem("基本设置"),
m14=new JMenuItem("修改密码"),
m15=new JMenuItem("帮助"),
m16=new JMenuItem("退出");
JTree tree;
DefaultTreeModel treeModel=null;
DefaultMutableTreeNode root;
DefaultMutableTreeNode selNode;//获取被选中的节点
JScrollPane sc;
ListFrame(String s,String userName){//构造方法
super(s);
this.userName=userName;//获得当前登录的用户账号
this.setBounds(400,80,200,500);
this.setResizable(false);
m1.add(m11);
m1.add(m12);
m1.addSeparator();
m2.add(m21);
m2.add(m22);
m1.add(m2);
m1.add(m14);
m1.addSeparator();
m1.add(m15);
m1.add(m16);
mb.add(m1);
this.setJMenuBar(mb);
//完成用户列表设计
root=new DefaultMutableTreeNode("好友列表");
treeModel=new DefaultTreeModel(root);
//设置好友分组
DefaultMutableTreeNode node1=new DefaultMutableTreeNode("我的好友");
7