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

1167156-20181201003346265-1035305928.png
不考虑用户是否离线的问题;
1167156-20181201003346835-607954920.png

写项目之前单开一个工作区:
1167156-20181201003347123-513465726.png

1167156-20181201003347694-2118559363.png

File-switch workspace
1167156-20181201003348251-1110973505.png

1167156-20181201003348865-1163309075.png

view      界面
model   后台
tools      工具类
common  客户端/服务器公用的一些类
1167156-20181201003349351-1859791913.png
model层可能根据业务不同再分类

--QQ登录界面
JLable;
中间网格布局;选项卡窗口;
最南面,Panel上面放了几个按钮;JPanel放在最南面,流布局;
1167156-20181201003349747-654931678.png

1167156-20181201003350078-1285855941.png

1167156-20181201003350668-189015173.png

image文件夹
1167156-20181201003351139-640712820.png
1167156-20181201003351406-192426761.png

1167156-20181201003351831-1216721767.png
处理北面布局

1167156-20181201003352474-1243902707.png
设置快捷键:keys-Content Assist

1167156-20181201003352971-2080835979.png

1167156-20181201003353239-518660986.png
ImageIcon

1167156-20181201003353825-102591716.png
处理界面南部south

----------------
--处理中部
中间可能有3个Panel,有一个选项卡窗口管理,
通过选项卡不停地切换;
1167156-20181201003354284-1056169344.png
JTabbedPane 选项卡

jp2放网格布局;9个JLabel;
1167156-20181201003354688-463982272.png

处理4个JLabel:  QQ号码、QQ密码、忘记密码、申请密码保护
1167156-20181201003355284-1763575370.png

-输入框、密码框、2个checkbox
1167156-20181201003355537-764123492.png

-把控件按照顺序加入到jp2里面去;
QQ号码、输入框;清楚密码;
QQ密码、密码框;忘记密码;
1167156-20181201003356046-582609843.png

1167156-20181201003356336-1875823062.png

--创建选项卡窗口
jtp=new  JTabbedPane();
jtp.add('QQ号码',jp2);
1167156-20181201003356853-1653801837.png

最后,加在中间的是 jtp ,而不是 JPanel
1167156-20181201003357191-650606367.png

1167156-20181201003357645-467474790.png

在JPanel上是居中布局;稍微好看一点点;
1167156-20181201003358077-667294603.png

修改前景色:
1167156-20181201003358473-1367642191.png
jp2_jbl3.setForeground(Color.blue);
----------------------

账号、密码需要到服务器去验证:
1167156-20181201003359111-653462122.png
账号、密码 是存在服务器上的;服务器决定QQ是否合法;
1167156-20181201003359347-2139384917.png

400G带宽,一个月给电信上千万费用;
在线影院、在线视频、都是烧钱网站;
带宽不够大,视频不流畅;

Client端源代码

com.qq.client.view

[QqClientLogin.java]

/** * 功能: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("<html><u>申请密码保护</u><html>"); 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
 */
4
package com.qq.client.view;
5
 
6
import java.awt.Color;
7
import java.awt.Cursor;
8
import java.awt.FlowLayout;
9
import java.awt.GridLayout;
10
import java.awt.event.ActionEvent;
11
import java.awt.event.ActionListener;
12
import java.io.IOException;
13
import java.io.ObjectOutputStream;
14
import javax.swing.ImageIcon;
15
import javax.swing.JButton;
16
import javax.swing.JCheckBox;
17
import javax.swing.JFrame;
18
import javax.swing.JLabel;
19
import javax.swing.JOptionPane;
20
import javax.swing.JPanel;
21
import javax.swing.JPasswordField;
22
import javax.swing.JTabbedPane;
23
import javax.swing.JTextField;
24
import javax.swing.UIManager;
25
import com.qq.client.model.QqClientUser;
26
import com.qq.client.tools.ManageClientConServerThread;
27
import com.qq.client.tools.ManageQqFriendList;
28
import com.qq.common.Message;
29
import com.qq.common.MessageType;
30
import com.qq.common.User;
31
 
32
public class QqClientLogin extends JFrame implements ActionListener{
33
    //定义北部需要的组件
34
    JLabel jbl1;
35
    //定义中部需要的组件
36
    //中部有三个JPanel,有一个叫选项卡窗口管理
37
    JTabbedPane jtp;
38
    JPanel jp2,jp3,jp4;
39
    JLabel jp2_jbl1,jp2_jbl2,jp2_jbl3,jp2_jbl4;
40
    JButton jp2_jb1;
41
    JTextField jp2_jtf;
42
    JPasswordField jp2_jpf;
43
    JCheckBox jp2_jcb1,jp2_jcb2;
44
   
45
    //定义南部需要的组件
46
    JPanel jp1;
47
    JButton jp1_jb1,jp1_jb2,jp1_jb3;
48
    public static void main(String[] args) {
49
        try {
50
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
51
        } catch (Exception e) {
52
            e.printStackTrace();
53
        }
54
        new QqClientLogin();
55
    }
56
   
57
    public void initNorthLayout(){
58
        //处理北部
59
        jbl1=new JLabel(new ImageIcon("image/qqview.jpg"));
60
    }
61
   
62
    public void initCenterLayout(){
63
        //处理中部
64
        jp2=new JPanel();
65
        jp2.setLayout(null);
66
        jp2_jbl1=new JLabel("QQ号码:");
67
        jp2_jbl1.setBounds(30, 15, 60, 25);
68
        jp2_jbl2=new JLabel("QQ密码:");
69
        jp2_jbl2.setBounds(30, 50, 60, 25);
70
        jp2_jbl3=new JLabel("忘记密码");
71
        jp2_jbl3.setForeground(Color.blue);
72
        jp2_jbl3.setBounds(260, 50, 80, 25);
73
        jp2_jbl3.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
74
        jp2_jbl4=new JLabel("<html><u>申请密码保护</u><html>");
75
        jp2_jbl4.setForeground(Color.blue);
76
        jp2_jbl4.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
77
        jp2_jbl4.setBounds(250, 85, 100, 25);
78
        jp2_jb1=new JButton("清除号码");
79
        jp2_jb1.setBounds(245, 15, 80, 25);
80
        jp2_jtf=new JTextField();
81
        jp2_jtf.setBounds(80, 15, 150, 25);
82
        jp2_jpf=new JPasswordField();
83
        jp2_jpf.setBounds(80, 50, 150, 25);
84
        jp2_jcb1=new JCheckBox("隐身登录");
85
        jp2_jcb1.setBounds(75, 85, 80, 25);
86
        jp2_jcb2=new JCheckBox("记住密码");
87
        jp2_jcb2.setBounds(155, 85, 80, 25);
88
        //把控制按顺序加入jp2
89
        jp2.add(jp2_jbl1);
90
        jp2.add(jp2_jtf);
91
        jp2.add(jp2_jb1);
92
        jp2.add(jp2_jbl2);
93
        jp2.add(jp2_jpf);
94
        jp2.add(jp2_jbl3);
95
        jp2.add(jp2_jcb1);
96
        jp2.add(jp2_jcb2);
97
        jp2.add(jp2_jbl4);
98
       
99
        //jp3,jp4
100
        jp3=new JPanel();
101
        jp4=new JPanel();
102
       
103
        //创建选项卡窗口
104
        jtp=new JTabbedPane();
105
        jtp.add(jp2,"QQ号码");
106
        jtp.add(jp3,"手机号码");
107
        jtp.add(jp4,"电子邮件");
108
    }
109
   
110
    public void initSouthLayout(){
111
        //处理南部
112
        jp1=new JPanel();
113
        jp1_jb1=new JButton("登录");
114
        jp1_jb1.addActionListener(this);
115
        jp1_jb2=new JButton("取消");
116
        jp1_jb2.addActionListener(this);
117
        jp1_jb3=new JButton("注册");
118
        //把三个按钮放到jp1
119
        jp1.add(jp1_jb1);
120
        jp1.add(jp1_jb2);
121
        jp1.add(jp1_jb3);
122
    }
123
   
124
    //构造函数
125
    public QqClientLogin(){
126
        //布局北部
127
        this.initNorthLayout();
128
        //布局中部
129
        this.initCenterLayout();
130
        //布局南部
131
        this.initSouthLayout();
132
       
133
        this.add(jbl1,"North");
134
        this.add(jtp,"Center");
135
        this.add(jp1,"South");
136
       
137
        this.setTitle("QQ登录界面");
138
        this.setResizable(false);
139
        this.setSize(350, 300);
140
        this.setLocationRelativeTo(null);
141
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
142
        this.setVisible(true);
143
    }
144
 













转载于:https://www.cnblogs.com/xuxaut-558/p/10047897.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值