山寨qq java_JAVA入门到精通-第87讲-山寨QQ项目1-登录界面

/**

* 功能:QQ客户端登陆界面

*/

package com.qq.client.view;

import java.awt.Color;

import java.awt.Cursor;

import java.awt.FlowLayout;

import java.awt.GridLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.io.IOException;

import java.io.ObjectOutputStream;

import javax.swing.ImageIcon;

import javax.swing.JButton;

import javax.swing.JCheckBox;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JOptionPane;

import javax.swing.JPanel;

import javax.swing.JPasswordField;

import javax.swing.JTabbedPane;

import javax.swing.JTextField;

import javax.swing.UIManager;

import com.qq.client.model.QqClientUser;

import com.qq.client.tools.ManageClientConServerThread;

import com.qq.client.tools.ManageQqFriendList;

import com.qq.common.Message;

import com.qq.common.MessageType;

import com.qq.common.User;

public class QqClientLogin extends JFrame implements ActionListener{

//定义北部需要的组件

JLabel jbl1;

//定义中部需要的组件

//中部有三个JPanel,有一个叫选项卡窗口管理

JTabbedPane jtp;

JPanel jp2,jp3,jp4;

JLabel jp2_jbl1,jp2_jbl2,jp2_jbl3,jp2_jbl4;

JButton jp2_jb1;

JTextField jp2_jtf;

JPasswordField jp2_jpf;

JCheckBox jp2_jcb1,jp2_jcb2;

//定义南部需要的组件

JPanel jp1;

JButton jp1_jb1,jp1_jb2,jp1_jb3;

public static void main(String[] args) {

try {

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

} catch (Exception e) {

e.printStackTrace();

}

new QqClientLogin();

}

public void initNorthLayout(){

//处理北部

jbl1=new JLabel(new ImageIcon("image/qqview.jpg"));

}

public void initCenterLayout(){

//处理中部

jp2=new JPanel();

jp2.setLayout(null);

jp2_jbl1=new JLabel("QQ号码:");

jp2_jbl1.setBounds(30, 15, 60, 25);

jp2_jbl2=new JLabel("QQ密码:");

jp2_jbl2.setBounds(30, 50, 60, 25);

jp2_jbl3=new JLabel("忘记密码");

jp2_jbl3.setForeground(Color.blue);

jp2_jbl3.setBounds(260, 50, 80, 25);

jp2_jbl3.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));

jp2_jbl4=new JLabel("申请密码保护");

jp2_jbl4.setForeground(Color.blue);

jp2_jbl4.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));

jp2_jbl4.setBounds(250, 85, 100, 25);

jp2_jb1=new JButton("清除号码");

jp2_jb1.setBounds(245, 15, 80, 25);

jp2_jtf=new JTextField();

jp2_jtf.setBounds(80, 15, 150, 25);

jp2_jpf=new JPasswordField();

jp2_jpf.setBounds(80, 50, 150, 25);

jp2_jcb1=new JCheckBox("隐身登录");

jp2_jcb1.setBounds(75, 85, 80, 25);

jp2_jcb2=new JCheckBox("记住密码");

jp2_jcb2.setBounds(155, 85, 80, 25);

//把控制按顺序加入jp2

jp2.add(jp2_jbl1);

jp2.add(jp2_jtf);

jp2.add(jp2_jb1);

jp2.add(jp2_jbl2);

jp2.add(jp2_jpf);

jp2.add(jp2_jbl3);

jp2.add(jp2_jcb1);

jp2.add(jp2_jcb2);

jp2.add(jp2_jbl4);

//jp3,jp4

jp3=new JPanel();

jp4=new JPanel();

//创建选项卡窗口

jtp=new JTabbedPane();

jtp.add(jp2,"QQ号码");

jtp.add(jp3,"手机号码");

jtp.add(jp4,"电子邮件");

}

public void initSouthLayout(){

//处理南部

jp1=new JPanel();

jp1_jb1=new JButton("登录");

jp1_jb1.addActionListener(this);

jp1_jb2=new JButton("取消");

jp1_jb2.addActionListener(this);

jp1_jb3=new JButton("注册");

//把三个按钮放到jp1

jp1.add(jp1_jb1);

jp1.add(jp1_jb2);

jp1.add(jp1_jb3);

}

//构造函数

public QqClientLogin(){

//布局北部

this.initNorthLayout();

//布局中部

this.initCenterLayout();

//布局南部

this.initSouthLayout();

this.add(jbl1,"North");

this.add(jtp,"Center");

this.add(jp1,"South");

this.setTitle("QQ登录界面");

this.setResizable(false);

this.setSize(350, 300);

this.setLocationRelativeTo(null);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.setVisible(true);

}

1/**

2* 功能:QQ客户端登陆界面

3*/

4package com.qq.client.view;

5

6import java.awt.Color;

7import java.awt.Cursor;

8import java.awt.FlowLayout;

9import java.awt.GridLayout;

10import java.awt.event.ActionEvent;

11import java.awt.event.ActionListener;

12import java.io.IOException;

13import java.io.ObjectOutputStream;

14import javax.swing.ImageIcon;

15import javax.swing.JButton;

16import javax.swing.JCheckBox;

17import javax.swing.JFrame;

18import javax.swing.JLabel;

19import javax.swing.JOptionPane;

20import javax.swing.JPanel;

21import javax.swing.JPasswordField;

22import javax.swing.JTabbedPane;

23import javax.swing.JTextField;

24import javax.swing.UIManager;

25import com.qq.client.model.QqClientUser;

26import com.qq.client.tools.ManageClientConServerThread;

27import com.qq.client.tools.ManageQqFriendList;

28import com.qq.common.Message;

29import com.qq.common.MessageType;

30import com.qq.common.User;

31

32public class QqClientLogin extends JFrame implements ActionListener{

33//定义北部需要的组件

34JLabel jbl1;

35//定义中部需要的组件

36//中部有三个JPanel,有一个叫选项卡窗口管理

37JTabbedPane jtp;

38JPanel jp2,jp3,jp4;

39JLabel jp2_jbl1,jp2_jbl2,jp2_jbl3,jp2_jbl4;

40JButton jp2_jb1;

41JTextField jp2_jtf;

42JPasswordField jp2_jpf;

43JCheckBox jp2_jcb1,jp2_jcb2;

44

45//定义南部需要的组件

46JPanel jp1;

47JButton jp1_jb1,jp1_jb2,jp1_jb3;

48public static void main(String[] args) {

49try {

50UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

51} catch (Exception e) {

52e.printStackTrace();

53}

54new QqClientLogin();

55}

56

57public void initNorthLayout(){

58//处理北部

59jbl1=new JLabel(new ImageIcon("image/qqview.jpg"));

60}

61

62public void initCenterLayout(){

63//处理中部

64jp2=new JPanel();

65jp2.setLayout(null);

66jp2_jbl1=new JLabel("QQ号码:");

67jp2_jbl1.setBounds(30, 15, 60, 25);

68jp2_jbl2=new JLabel("QQ密码:");

69jp2_jbl2.setBounds(30, 50, 60, 25);

70jp2_jbl3=new JLabel("忘记密码");

71jp2_jbl3.setForeground(Color.blue);

72jp2_jbl3.setBounds(260, 50, 80, 25);

73jp2_jbl3.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));

74jp2_jbl4=new JLabel("申请密码保护");

75jp2_jbl4.setForeground(Color.blue);

76jp2_jbl4.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));

77jp2_jbl4.setBounds(250, 85, 100, 25);

78jp2_jb1=new JButton("清除号码");

79jp2_jb1.setBounds(245, 15, 80, 25);

80jp2_jtf=new JTextField();

81jp2_jtf.setBounds(80, 15, 150, 25);

82jp2_jpf=new JPasswordField();

83jp2_jpf.setBounds(80, 50, 150, 25);

84jp2_jcb1=new JCheckBox("隐身登录");

85jp2_jcb1.setBounds(75, 85, 80, 25);

86jp2_jcb2=new JCheckBox("记住密码");

87jp2_jcb2.setBounds(155, 85, 80, 25);

88//把控制按顺序加入jp2

89jp2.add(jp2_jbl1);

90jp2.add(jp2_jtf);

91jp2.add(jp2_jb1);

92jp2.add(jp2_jbl2);

93jp2.add(jp2_jpf);

94jp2.add(jp2_jbl3);

95jp2.add(jp2_jcb1);

96jp2.add(jp2_jcb2);

97jp2.add(jp2_jbl4);

98

99//jp3,jp4

100jp3=new JPanel();

101jp4=new JPanel();

102

103//创建选项卡窗口

104jtp=new JTabbedPane();

105jtp.add(jp2,"QQ号码");

106jtp.add(jp3,"手机号码");

107jtp.add(jp4,"电子邮件");

108}

109

110public void initSouthLayout(){

111//处理南部

112jp1=new JPanel();

113jp1_jb1=new JButton("登录");

114jp1_jb1.addActionListener(this);

115jp1_jb2=new JButton("取消");

116jp1_jb2.addActionListener(this);

117jp1_jb3=new JButton("注册");

118//把三个按钮放到jp1

119jp1.add(jp1_jb1);

120jp1.add(jp1_jb2);

121jp1.add(jp1_jb3);

122}

123

124//构造函数

125public QqClientLogin(){

126//布局北部

127this.initNorthLayout();

128//布局中部

129this.initCenterLayout();

130//布局南部

131this.initSouthLayout();

132

133this.add(jbl1,"North");

134this.add(jtp,"Center");

135this.add(jp1,"South");

136

137this.setTitle("QQ登录界面");

138this.setResizable(false);

139this.setSize(350, 300);

140this.setLocationRelativeTo(null);

141this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

142this.setVisible(true);

143}

144

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、具有登陆界面,包括服务器IP(或服务器名)、用户名、密码。 登录:在数据库服务器上验证用户名和密码,如果匹配就进入QQ聊天主界面,否则提示不能登录。 取消:退出即可。 注册:进入用户注册界面。 服务器栏中默认是你要使用的服务器名字,即该服务器安装的数据库,所有qq用户信息都保存在这个服务器的数据库里。图片显示的是我试验的服务器名字。 登录成功后还要把自己当前所在机器的IP地址提取出来并保存到数据库的个人信息中,替换原来注册或上次使用的IP。 2、注册界面,可以让第一次使用的用户注册,即给自己在服务器上注册一个用户名、密码、自己所使用的机器IP、自己的端口号,如图所示: 注册:首先验证密码和确认密码是否一致,如果不一致,则提示,否则,把输入的信息记录到数据库中,如果用户名重复也要提示。 其中IP栏目的内容可以由程序自动提取出本机的ip地址,并显示出来,省得用户输入错误。 3、聊天主界面 登陆成功后就进入本届面,界面如下: 界面设计类似简单的QQ界面,可以使用BorderLayout布局管理器,在上面(BorderLayou.NORTH)显示“好友列表”四个字,中间部分(BorderLayou.CENTER)显示自己的好友名单,名单可以用多个JLabel控件(JLabel中添加ImageIcon)显示,或者用JTree控件显示(比较复杂),名单中可以显示qq号、昵称(姓名)、状态(在线、离线等)。最下边(BorderLayou.SOUTH)可以显示“欢迎您:***”。 好友要求用不同的图标显示在线和不在线的状态。 双击在线的好友名字可以打开聊天窗口,而双击不在线的好友不动(即不开启聊天窗口)。 达到这种效果的前提是在登录成功后,获得当前登录用户的信息,在本模块根据登录信息获取用户名、获取他的好友列表等数据。
资源分设为1,因为我自己只有3分资源分了,所以就不设为0了 这个山寨QQ代码2000行,基于现在可以使用IP6,给出它的设计原理 功能:山寨QQ 主要行为: ①用户注册 ②添加好友 ③好友上线头像变为彩色 ④在线上的好友头像是彩色,不在线上的好友头像是灰色,动态变化 ⑤独立窗口聊天 ⑥服务器端有两个表,全部用户表和在线用户表,都是动态改变的 代码在下面,有2000多行,总共17个文件,干脆就看看这些思路得了。 山寨QQ分为用户端和服务器端,主要用到的Java知识点有:多线程、网络编程、IO流,如果能够加入数据库当然更好,可是我在家一直没网,没有数据库,所以就把用户信息全部储存在文件中了。 服务器端3000号端口作为一个特殊的端口,放在一个单独的线程中时刻监听着。服务器的交互信息通讯端口从3001号一直向后监听,最大可以到65535号端口。 用户每次来连接服务器时,首先连接3000号端口,获取服务器正在监听的端口号,然后再去连接这个端口。 用户和服务器之间的交互信息使用对象流来传递,信息类型分为 注册消息=0、 修改密码=1、 登录验证=2、 请求聊天=3、 获取在线好友=4、 添加好友=5、 某人上线了=6 如果是登录消息,则把这个新建的套接字(套接字即Socket,网络通讯全靠他来实现)储存在一个单独的线程中,使用这个线程的类储存用户的用户名、昵称、密码、IP。然后将这个县城储存在一组向量中,即C语言中的链表。IP地址可以通过套接字得到。当用户再次和服务器发生交互信息时,直接利用这个已存在的套接字即可。 如果用户双击某个用户希望聊天时,首先从服务器端获取该用户的IP,然后再单独去连接这个用户。 用户连接用户时,和连接服务器的原理大同小异。2000号端口作为一个特殊的端口被监听着。如果一台机器上同时登陆有多个用户,则监听的端口一直往下走,最小可以到1025,总共有975个端口可以利用,用户总该用不了这么多吧。然后接下来,该不用我说了吧,连接好友正在监听的端口就是了。 建立完成连接,就可以弹出聊天窗口开始聊天了。 好了,大体思路就是这样。当然还有一些其他的功能,比如注册用户、添加好友等,和上面思路也差不多。 对了,忘了说说如何获取在线好友了 用户登录成功后,将自己所有的好友列表从文件中读取,放在一个向量中发送给服务器,服务器查看哪些人在在线用户列表中,然后返回用户的在线好友,同时通知这些在线好友某人人上线了,还是利用已建立的套接字。 用户下线后,和服务器已建立的套接字发生IOException异常,程序代码块跳转,服务器就通知用户的在线好友有人下线了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值