Java-QQ聊天软件(弱鸡版)GUI编程

在开发软件时,我们大多第一印象就是一个用户界面,所以我们从用户界面开始

    一、开发时一定要先做好需求分析,这是本人的血泪教训。事先一定要先想好自己要做什么功能,能想的多全面就有多全面,不然等到开发到一半时就可以体会绝望了。在本次项目中,我主要实现的是登录,注册,添加/删除分组,添加好友,多人聊天功能。在后面还想要添加一些附加功能,比如聊天记录查询,个人资料修改,好友管理功能,后来发现时间不够了,而且需要改动的地方较大。。所以请同学们一定做好需求分析。

    二、打好注释,打好注释,打好注释。。。重要的事情说三遍

    下面开始吧!

    整个界面,猪窗口使用的是BorderLayout布局管理器,东西南北中面板大部分使用的是null面板,然后使用setBounds方法调整组件位置大小(简称懒人神器)

    GUI设计时可以使用MyEclipse的设计者模式,那样更快,更方便。

GUI没有什么难度或者让人不理解的地方,看代码应该看得懂。。

    首先是登录界面,GUI没有什么好讲的,跟画画差不多

    登录界面中包含客户端的主方法,也就是说客户端启动时从这里进入

package UI;

import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.border.LineBorder;

import model.GetQQFriends;

import bean.Message;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.Vector;

import tools.*;
public class Login extends JFrame{
	JButton login;//登录按钮
	JComboBox id;//QQ号下拉框
	JPasswordField password;//QQ密码框
	JLabel findpassword,reg;//注册账号,找回密码标签;
	JButton close,minn;//北部最小化与关闭按钮
	JCheckBox zidong,reme;//自动登录与记住密码复选框
	public Login() {
		// TODO Auto-generated constructor stub
		
		/***主界面设置***/
		BorderLayout b1 = new BorderLayout();//主界面设置为BorderLayout
		this.setTitle("QQ登录");//设置标题
		this.setLayout(b1);//设置布局管理器
		
		
		/*添加背景图片*/
		ImageIcon image = new ImageIcon("pic//qqbeijing.png");
		JLabel l1 = new JLabel(image);
		l1.setBounds(0,0,image.getIconWidth(),image.getIconHeight());
	    this.getLayeredPane().add(l1,new Integer(Integer.MIN_VALUE)); 
	    JPanel contentPanel = (JPanel)this.getContentPane();  
	    contentPanel.setOpaque(false);
		/*背景图片添加完成
		
		
		/**向主界面添加各个部分面板**/
		
		/*北部面板*/
		JPanel pnor = creatNor();//创建新的北部面板
		this.add(pnor,b1.NORTH);//将北部面板添加到主界面北部
		
		/*中间面板*/
		JPanel pcen = creatCen();//创建新的中间面板
		this.add(pcen,b1.CENTER);//将新的中间面板添加进去
		
		/*南部面板*/
		JPanel psou = creatPsou();//创建新的南部面板
		this.add(psou,b1.SOUTH);//将新的南部面板添加进去
		
		
		/*西部面板*/
		JPanel pwe = creatWe();//创建新的西部面板
		this.add(pwe,b1.WEST);//将新的西部面板添加进去
		
		/*消除边框并设置登录界面大小可见等基本属性*/
		this.setUndecorated(true);
		this.setResizable(false);//设置不可改变大小
		this.setVisible(true);//设置可见
		this.setSize(380, 294);//设置大小
		this.setLocationRelativeTo(null);//设置出现位置居中
		/*设置完成*/
		/**此监听事件是登录监听,即点击登录按钮之后登录**/
		/**,大家可以等看完网络编程之后再看里面的内容**/
		login.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				String qqid = (String) id.getSelectedItem();
				String qqpass = password.getText();
				//new GetQQFriends().ADD(qqid);
				int re = 0;
				int au = 0;
				if(zidong.isSelected()){
					au = 1;
				}
				if(reme.isSelected()){
					re = 1;
				}
				Message mm = new Message();
				mm.setFasong(qqid);//设置发送的账号
				mm.setPass(qqpass);//设置发送的密码
				mm.setPanduan("1");//设置标志为1
				mm.setReme(re);
				mm.setZidong(au);
				Socket s;
				try{
					s = new Socket("localhost",9999);
					ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());// 新建输出流
					oos.writeObject(mm);// 发给服务器
					ObjectInputStream ois = new ObjectInputStream(s.getInputStream());// 新建输入流
					Message m1 = (Message) ois.readObject();// 获得服务器的反馈消息
					if(m1.getPanduan().equals("1")){
						setVisible(false);
						//创建一个该QQ号和服务器连接的线程
						ClientConServerThread ccst = new ClientConServerThread(s);
						ccst.start();//启动线程
						ManageClientConServerThread.addClientConServerThread(qqid, ccst);//添加到线程池
						new QQbuddy(qqid);
					}else{
						Container container = new Container();
						JOptionPane.showOptionDialog(container, "账号或密码错误", "失败",
								JOptionPane.DEFAULT_OPTION,
								JOptionPane.INFORMATION_MESSAGE, null, null, null);
					}
					
				}catch(IOException e1){
					e1.printStackTrace();
					
				} catch (ClassNotFoundException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
				
			}
		});
	}
	private JPanel creatPsou() {//南部面板的创建
		//南部面板主要包括登录按钮的设置
		// TODO Auto-generated method stub
		JPanel psou = new JPanel();
		psou.setPreferredSize(new Dimension(0,51));//设置面板大小
		//百度:setPreferredSize需要在使用布局管理器的时候使用,布局管理器会获取空间的preferredsize,
		//因而可以生效。例如borderlayout在north中放入一个panel,
		//panel的高度可以通过这样实现:panel.setPreferredSize(new Dimension(0, 100));
		//这样就设置了一个高度为100的panel,宽度随窗口变化。
		//、setSize,setLocation,setBounds方法需要在不使用布局管理器的时候使用,
		//也就是setLayout(null)的时候可以使用这三个方法控制布局。
		psou.setBorder(null);//设置无边框
		psou.setLayout(null);//设置面板为空
		login = new JButton("登     录");
		login.setFont(new Font("宋体",0,13));//设置字体大小样式
		login.setBounds(113,8,160,30);//设置出现位置
		login.setBorderPainted(false); //设置点击不出现边框
		psou.add(login);//将按钮添加到面板上
		psou.setOpaque(false);//设置面板透明
		
		return psou;//返回创建好的面板
	}
	
	
	
	private JPanel creatWe() {//西部面板的创建
		//西部主要包含登录头像
		// TODO Auto-generated method stub
		/**西部面板我主要就放了一个图片。。。其他基本没有**/
		JPanel pw = new JPanel();
		pw.setPreferredSize(new Dimension(102,0));
		pw.setLayout(new FlowLayout(FlowLayout.RIGHT)); 
		ImageIcon im = new ImageIcon("pic//qqw.png");
		JLabel ll = new JLabel(im);
		ll.setBounds(206,100,im.getIconWidth(),im.getIconHeight());
		pw.add(ll);
		pw.setOpaque(false);
		return pw;
	}
	
	private JPanel creatCen() {//中间面板的创建
		//中间面板主要包括--账号密码 --标签--登录框
		//记住密码,自动登录的复选框
		
		// TODO Auto-generated method stub
		JPanel pc = new JPanel();
		pc.setLayout(null);
		/**账号密码设置**/
		/*账号下拉框*/
		//String str[] = {"209691440","2676964270","123456789","","","",""};//获取登陆过的QQ账号ID
		Vector<String> str = new Vector<String>();

		id = new JComboBox(str);//初始化下拉框
		id.setBorder(null);//设置无边框
		id.setEditable(true);//设置下拉框可编辑
		id.setBounds(7, 14, 185, 25);//设置下拉框的大小位置
		id.setFont(new Font("Calibri ",0,13));//设置下拉框的字体样式

		
		pc.add(id);//添加进面板
		/*账号下拉框完毕*/
		
		/*注册账号标签设置*/
		reg = new JLabel("注册账号");//初始化
		reg.setFont(new Font("宋体",0,13));//初始化注册账号字体样式
		reg.setForeground(new Color(114,184,254));//设置字体颜色
		reg.setBounds(206, 17, 100, 16);//设置大小位置
		
		reg.addMouseListener(new MouseListener() {
			//该监听为注册账号标签监听,设置为鼠标移入之后变红
			//,离开之后变回去,同时点击之后启动注册界面
			@Override
			public void mouseReleased(MouseEvent e) {//鼠标释放
				// TODO Auto-generated method stub
			}
			
			@Override
			public void mousePressed(MouseEvent e) {//按下鼠标
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void mouseExited(MouseEvent e) {//鼠标离开
				// TODO Auto-generated method stub
				//颜色变回去
				reg.setForeground(new Color(114,184,254));
			}
			
			@Override
			public void mouseEntered(MouseEvent e) {//鼠标进入
				// TODO Auto-generated method stub
				//颜色设定为红
				reg.setForeground(Color.red);
			}
			
			@Override
			public void mouseClicked(MouseEvent e) {//鼠标单击
				// TODO Auto-generated method stub
				//单机之后启动注册界面
				new ResginQQ();
			}
		});
		pc.add(reg);//加入面板
		/*注册账号标签完成*/
		
		/*找回密码标签*/
		findpassword = new JLabel("找回密码");
		findpassword.setFont(new Font("宋体",0,13));//初始化注册账号字体样式
		findpassword.setForeground(new Color(114,184,254));//设置字体颜色
		findpassword.setBounds(206, 53, 80, 16);//设置大小位置
		//找回密码标签监听,同楼上,不过没有实现找回密码功能
		findpassword.addMouseListener(new MouseListener() {
			
			@Override
			public void mouseReleased(MouseEvent e) {//鼠标释放
				// TODO Auto-generated method stub
			}
			
			@Override
			public void mousePressed(MouseEvent e) {//按下鼠标
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void mouseExited(MouseEvent e) {//鼠标离开
				// TODO Auto-generated method stub
				findpassword.setForeground(new Color(114,184,254));
			}
			
			@Override
			public void mouseEntered(MouseEvent e) {//鼠标进入
				// TODO Auto-generated method stub
				findpassword.setForeground(Color.red);
			}
			
			@Override
			public void mouseClicked(MouseEvent e) {//鼠标单击
				// TODO Auto-generated method stub
				
			}
		});
		
		pc.add(findpassword);
		/**密码框设置**/
		/*密码框*/
		password = new JPasswordField();
		password.setLayout(new FlowLayout(FlowLayout.RIGHT,0,0));
		LineBorder lin = new LineBorder(Color.WHITE,3,true);  //实现密码框白色,并且任意厚度的类
	    password.setBorder(lin);  
	    password.setBounds(7,48,185,23);  
		pc.add(password);
		/*密码框完成*/
		/*自动登录复选框*/
		zidong = new JCheckBox("自动登录");
		zidong.setFocusPainted(false);//选中时没有边框
		zidong.setFont(new Font("宋体",0,13));//设置字体样式
		zidong.setBounds(7, 83, 80, 15);
		zidong.setOpaque(false);
		pc.add(zidong);
		
		/*记住密码复选框*/
		reme = new JCheckBox("记住密码");
		reme.setFocusPainted(false);//选中时没有边框
		reme.setFont(new Font("宋体",0,13));//设置字体样式
		reme.setBounds(87, 83, 80, 15);
		reme.setOpaque(false);
		pc.add(reme);
		pc.setOpaque(false);
		/*复选框完成*/
		return pc;
	}
	private JPanel creatNor() {
		// TODO Auto-generated method stub
		JPanel pn = new JPanel();  
		pn.setLayout(null);  
		pn.setPreferredSize(new Dimension(0,140)); //设置北边面板容器的大小  
		/******关闭按钮*****/
		ImageIcon closeimage = new ImageIcon("pic//close.png");//设定关闭图片种子
		close = new JButton(closeimage);//新建关闭按钮
		close.setBounds(342, -1, 28, 20);
		//图上有两圈方框,外面的是border,里面的是focus状态表示。
		//focus是焦点状态,一般你最后一次操作过的组件会获得焦点。
		close.setBorderPainted(false);//可以让按钮里面那个focus的方框不显示。
		close.setFocusPainted(false);//可以隐藏border,或者你也可以setBorder换一个其他的样式
		close.setToolTipText("关闭");//设置悬浮时显示关闭字样
		close.setOpaque(false);
		close.addActionListener(new ActionListener() {//设置点击时关闭
			
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				dispose();
			}
		});
		/********************/
		
		/**最小化按钮**/
		ImageIcon minnimage = new ImageIcon("pic//minn.png");//设置最小化图片路径
		minn = new JButton(minnimage);//初始化最小化按钮
		minn.setBounds(315, -1, 28, 20);//设置最小化按钮初始大小位置
		minn.setBorderPainted(false);
		minn.setFocusPainted(false);
		minn.setToolTipText("最小化");
		minn.setOpaque(false);
		minn.addActionListener(new ActionListener() {//最小化按钮监听事件
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				setExtendedState(ICONIFIED);//界面最小化
			}
		});
		pn.add(close);
		pn.add(minn);
		pn.setOpaque(false);
		return pn;
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new Login();
		//new QQbuddy("137237733");
		//new Talke("209691440", "2676964270");
		//new QQBuddyList();
	}

}

然后是注册界面,也就是单机了注册账号标签之后弹出的界面

注册界面更简单了,设置布局管理器为null,全程setBounds。需要注意的是,点击了注册之后,会向服务器发送数据,同样可以看完之后的在回头来


package UI;

import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Vector;

import javax.swing.*;

import bean.*;

public class ResginQQ extends JFrame implements ActionListener {
	JLabel QQname, password, repassword, birthday, sex, phone, title, realname;// 所有用户属性标签
	JButton reg;// 注册按钮
	JPasswordField passtext, repasstext;// 两次密码框
	JTextField QQnametext, phonetext, titletext, realnametext;// 剩余需要的文本框
	JRadioButton man, woman;// 性别复选框;
	JComboBox year, mon, day;// 生日的三个下拉框
	Socket s;// 网络连接

	public ResginQQ() {
		// TODO Auto-generated constructor stub
		/** 主界面设置 **/
		this.setTitle("注册QQ");
		this.setSize(250, 350);
		this.setLocation(497, 342);
		this.setVisible(true);
		this.setLayout(null);
		/** QQ昵称与输入框设置 **/
		QQname = new JLabel(" QQ昵称");
		QQname.setBounds(20, 10, 50, 30);
		QQnametext = new JTextField();
		QQnametext.setBounds(80, 15, 130, 20);
		this.add(QQname);
		this.add(QQnametext);
		/********************/

		/** QQ密码标签与重复密码标签,框设置 **/
		password = new JLabel(" QQ密码");
		passtext = new JPasswordField();
		repassword = new JLabel("重复密码");
		repasstext = new JPasswordField();
		password.setBounds(20, 40, 50, 30);
		passtext.setBounds(80, 45, 130, 20);
		repassword.setBounds(20, 70, 55, 30);
		repasstext.setBounds(80, 75, 130, 20);
		this.add(password);
		this.add(passtext);
		this.add(repassword);
		this.add(repasstext);
		/************************/
		/** 生日设置 **/
		birthday = new JLabel("设置生日");
		birthday.setBounds(20, 100, 55, 30);
		this.add(birthday);
		/* 年下拉框 */
		Vector<String> yy = new Vector<String>();
		for (int i = 1990; i <= 2019; i++) {
			yy.add(Integer.toString(i));
		}
		year = new JComboBox(yy);
		year.setBounds(80, 105, 51, 20);
		year.setBorder(null);// 设置无边框
		year.setEditable(true);// 设置下拉框可编辑
		this.add(year);
		/*******************/
		/* 月下拉框 */
		Vector<String> mm = new Vector<String>();
		for (int i = 1; i <= 12; i++) {
			String s1 = "";
			if (i < 10) {
				s1 = '0' + Integer.toString(i);
			} else {
				s1 = Integer.toString(i);
			}
			mm.add(s1);
		}
		mon = new JComboBox(mm);
		mon.setBounds(131, 105, 40, 20);
		mon.setBorder(null);// 设置无边框
		mon.setEditable(true);// 设置下拉框可编辑
		this.add(mon);
		/*****************/

		/* 日下拉框 */
		Vector<String> dd = new Vector<String>();
		for (int i = 1; i <= 31; i++) {
			String s1 = "";
			if (i < 10) {
				s1 = '0' + Integer.toString(i);
			} else {
				s1 = Integer.toString(i);
			}
			dd.add(s1);
		}
		day = new JComboBox(dd);
		day.setBounds(171, 105, 40, 20);
		day.setBorder(null);// 设置无边框
		day.setEditable(true);// 设置下拉框可编辑
		this.add(day);
		/***************/
		/* 性别单选框 */
		sex = new JLabel("性	        别");
		sex.setBounds(20, 130, 55, 30);
		man = new JRadioButton("男");
		man.setSelected(true);
		woman = new JRadioButton("女");
		man.setBounds(78, 130, 75, 30);
		woman.setBounds(150, 130, 75, 30);
		ButtonGroup sexgrip = new ButtonGroup();// 设置性别组,保证只能选一个
		sexgrip.add(man);
		sexgrip.add(woman);
		this.add(sex);
		this.add(man);
		this.add(woman);
		/*******************/
		/* 姓名 */
		realname = new JLabel("真实姓名");
		realname.setBounds(20, 160, 55, 30);
		this.add(realname);
		realnametext = new JTextField();
		realnametext.setBounds(80, 165, 130, 20);
		this.add(realnametext);
		/*************/

		/* 设置电话 */
		phone = new JLabel("电        话");
		phone.setBounds(20, 190, 55, 30);
		phonetext = new JTextField();
		phonetext.setBounds(80, 193, 130, 20);
		this.add(phone);
		this.add(phonetext);
		/* 设置个性签名 */
		title = new JLabel("个性签名");
		title.setBounds(20, 220, 55, 30);
		titletext = new JTextField();
		titletext.setBounds(80, 223, 130, 20);
		this.add(title);
		this.add(titletext);

		/** 注册按钮 **/
		reg = new JButton("注    册");
		reg.setBounds(80, 250, 100, 30);
		reg.addActionListener(this);
		this.add(reg);
		this.repaint();
		this.validate();

	}

	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		if (e.getSource() == reg) {//点击注册按钮
			String s1 = passtext.getText();
			String s2 = repasstext.getText();
			if (!s1.equals(s2)) {
				Container container = new Container();
				JOptionPane.showOptionDialog(container, "两次密码不一致", "失败",
						JOptionPane.DEFAULT_OPTION,
						JOptionPane.INFORMATION_MESSAGE, null, null, null);
			} else {
				UserBean user = new UserBean();// 将用户信息封装进一个类
				String pass = passtext.getText();// 获取密码
				String name = QQnametext.getText();// 获取昵称
				String realname = realnametext.getText();// 获取真实姓名
				String sex;// 获取性别
				if (man.isSelected()) {
					sex = "男";
				} else {
					sex = "女";
				}
				String year1 = (String) year.getSelectedItem();
				String mon1 = (String) mon.getSelectedItem();
				String day1 = (String) day.getSelectedItem();
				String dat = year1 + "-" + mon1 + "-" + day1;
				SimpleDateFormat bir = new SimpleDateFormat("yyyy-MM-dd"); // 将生日转化为日期格式
				Date bir1 = null;
				try {
					bir1 = bir.parse(dat);
				} catch (ParseException e2) {
					// TODO Auto-generated catch block
					e2.printStackTrace();
				}
				System.out.println(bir1);
				String ph = phonetext.getText();// 获取手机号
				String ti = titletext.getText();// 获取个性签名
				int re = 0;// 记住密码
				int au = 0;// 自动登录
				/* 将注册信息添加到bean */
				user.setBirthday(bir1);
				user.setMyTitle(ti);
				user.setName(name);
				user.setPhone(ph);
				user.setQQpassword(pass);
				user.setReme(re);
				user.setSex(sex);
				user.setTruename(realname);
				user.setZidong(au);
				/***/
				Message mm = new Message();// 新建传送表
				mm.setPanduan("4");// 将标志设置为4,表示注册信息
				mm.setUb(user);// 将注册信息添加到里面
				System.out.println(mm.getPanduan());
				try {
					s = new Socket("localhost", 9999);//连接到服务器

					ObjectOutputStream oos = new ObjectOutputStream(s
							.getOutputStream());// 新建输出流
					oos.writeObject(mm);// 发给服务器
					ObjectInputStream ois = new ObjectInputStream(s
							.getInputStream());// 新建输入流
					Message m1 = (Message) ois.readObject();// 获得服务器的反馈消息
					System.out.println(m1.getUb().getQQnumber());
					if (m1.getPanduan().equals("5")) {// 注册成功
						new OptionPane().GetQQSucceesed(m1.getFasong(), "恭喜");
					} else if (m1.getPanduan() == "6") {// 注册失败
						new OptionPane().GetQQFail("注册失败", "未知错误");
					}
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				} catch (ClassNotFoundException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}

			}
		}

	}

}

登录之后的主界面

这里是一个难点,我在这里花费了大量时间,因为涉及到了大量的数据变化,同时还有一个重要的卡片布局管理器的使用,目测课堂上老师没有多少涉及卡片布局。

好友列表主界面同样使用了BorderLayout布局管理器,背部包含了头像,昵称等,中间面板是重点中的重点,使用了卡片管理器

南部同样简单,核心就是中间的面板。

我想的是一会可以单开一个文章讲讲卡片。。。。

package UI;

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionAdapter;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.Vector;

import javax.swing.*;
import javax.swing.border.EmptyBorder;
import javax.swing.event.AncestorListener;

import tools.ClientConServerThread;
import tools.ManageClientConServerThread;
import tools.ManageQqChat;

import bean.Message;

import model.GetQQFriends;

public class QQbuddy extends JFrame {
	BorderLayout b1;// 主界面布局管理器
	GridLayout g1;
	JPanel pcen;// 中间面板--存放好友列表
	JPanel pnor;// 北部面板--存放个人头像姓名签名
	JPanel psou;// 南部面板--存放设置按钮,返回按钮
	ImageIcon ye = new ImageIcon("pic//yes.png");
	ImageIcon no = new ImageIcon("pic//no.png");
	Vector<String> ff;// 获取分组个数
	Vector<String> fn;// 获取好友名字
	Vector<String> ficon;// 获取好友头像路径
	int xold = 0, yold = 0;// 实现移动边框
	int n;// 好友分组 的个数
	CardLayout c1 = new CardLayout();// 设定中间的卡片布局
	public QQbuddy(String myid) {
		// TODO Auto-generated constructor stub
		b1 = new BorderLayout();
		this.setLayout(null);
		/* 添加背景图片 */
		ImageIcon image = new ImageIcon("Images//back.png");
		JLabel l1 = new JLabel(image);
		l1.setBounds(0, 0, image.getIconWidth(), image.getIconHeight());
		this.getLayeredPane().add(l1, new Integer(Integer.MIN_VALUE));
		JPanel contentPanel = (JPanel) this.getContentPane();
		contentPanel.setOpaque(false);
		// 背景图片添加完成

		// 设置北部面板
		creatPnor(myid);
		this.add(pnor);
		/***********/
		// 设置中间面板
		creatPcen(myid);
		pcen.setBounds(0, 120, 279, 500);
		this.add(pcen);
		/*************/
		// 设置南部面板
		psou = creatSou(myid);
		psou.setBounds(0, 620, 279, 78);
		this.add(psou);
		this.repaint();
		this.validate();
		this.setUndecorated(true);
		this.setVisible(true);
		this.setSize(279, 698);// QQ列表大小
		this.setLocationRelativeTo(null);
		this.addMouseListener(new MouseAdapter() {
			@Override
			public void mousePressed(MouseEvent e) {
				// TODO Auto-generated method stub
				xold = e.getX();
				yold = e.getY();
			}
		});
		this.addMouseMotionListener(new MouseMotionAdapter() {
			@Override
			public void mouseDragged(MouseEvent e) {
				// TODO Auto-generated method stub
				int xOn = e.getXOnScreen();
				int yOn = e.getYOnScreen();
				int xnow = xold - xOn;
				int ynow = yold - yOn;
				QQbuddy.this.setLocation(xOn, yOn);
			}
		});
	}

	public void upDateUI(String id) {
		// TODO Auto-generated method stub
		this.dispose();
		new QQbuddy(id);
	}

	private JPanel creatSou(final String ID) {// 南部面板
		// TODO Auto-generated method stub
		JPanel ps = new JPanel();
		JButton addfenzu, delfenzu, addfriend;
		addfenzu = new JButton("添加分组");
		delfenzu = new JButton("删除分组");
		addfriend = new JButton("添加好友");
		addfenzu.addActionListener(new ActionListener() {// 添加分组监听

					@Override
					public void actionPerformed(ActionEvent e) {
						// TODO Auto-generated method stub
						final JFrame jf = new JFrame();
						jf.setBounds(500, 500, 250, 150);
						jf.setTitle("添加分组");
						JButton add = new JButton("添加");
						add.setBounds(150, 100, 50, 25);
						JLabel l1 = new JLabel("分组名:");
						l1.setBounds(20, 20, 50, 25);
						final JTextField name = new JTextField(20);
						name.setBounds(80, 20, 80, 25);

						add.addActionListener(new ActionListener() {

							@Override
							public void actionPerformed(ActionEvent e) {
								// TODO Auto-generated method stub
								String na = name.getText();
								Message m = new Message();
								m.setPanduan("13");
								m.setText(na);
								m.setFasong(ID);
								Socket s;
								try {
									s = new Socket("localhost", 9999);// 连接到服务器
									ObjectOutputStream oos = new ObjectOutputStream(
											s.getOutputStream());// 新建输出流
									oos.writeObject(m);// 发给服务器
									ObjectInputStream ois = new ObjectInputStream(
											s.getInputStream());// 新建输入流
									Message m1 = (Message) ois.readObject();// 获得服务器的反馈消息
									if (m1.getPanduan().equals("13")) {
										Container container = new Container();
										JOptionPane
												.showOptionDialog(
														container,
														"添加成功",
														"成功",
														JOptionPane.DEFAULT_OPTION,
														JOptionPane.INFORMATION_MESSAGE,
														null, null, null);
										jf.dispose();
										upDateUI(ID);
									} else {
										Container container = new Container();
										JOptionPane
												.showOptionDialog(
														container,
														"该分组以存在",
														"失败",
														JOptionPane.DEFAULT_OPTION,
														JOptionPane.INFORMATION_MESSAGE,
														null, null, null);

									}
								} catch (IOException e1) {
									e1.printStackTrace();
								} catch (ClassNotFoundException e1) {
									// TODO Auto-generated catch block
									e1.printStackTrace();
								}

							}
						});

						JPanel p = new JPanel();
						p.add(l1);
						p.add(name);
						p.add(add);
						jf.add(p);
						jf.setVisible(true);

					}
				});
		// ps.setLayout(null);
		addfriend.addActionListener(new ActionListener() {// 添加好友监听

					@Override
					public void actionPerformed(ActionEvent e) {
						// TODO Auto-generated method stub
						final JFrame jf2 = new JFrame();
						jf2.setLayout(null);
						jf2.setVisible(true);
						jf2.setBounds(500, 500, 300, 200);
						jf2.setTitle("添加好友");
						JLabel l1 = new JLabel("QQ:");
						l1.setBounds(20, 20, 40, 25);
						jf2.add(l1);
						final JTextField name = new JTextField(20);
						name.setBounds(60, 21, 100, 20);
						jf2.add(name);

						JButton add = new JButton("加为好友");
						add.setBounds(100, 110, 100, 25);
						jf2.add(add);

						Vector<String> str = new GetQQFriends()
								.getQQfriendssum(ID);
						final JComboBox fenzuname;
						fenzuname = new JComboBox(str);// 初始化下拉框
						fenzuname.setBorder(null);// 设置无边框
						fenzuname.setEditable(true);// 设置下拉框可编辑
						fenzuname.setBounds(60, 80, 100, 20);// 设置下拉框的大小位置
						fenzuname.setFont(new Font("Calibri ", 0, 13));// 设置下拉框的字体样式
						jf2.add(fenzuname);

						JLabel namelb = new JLabel("昵称:");
						namelb.setBounds(20, 50, 40, 25);
						jf2.add(namelb);
						final JTextField re = new JTextField(20);
						re.setBounds(60, 51, 100, 20);
						jf2.add(re);

						JButton find = new JButton("查询");
						find.setBounds(170, 21, 60, 20);
						find.addActionListener(new ActionListener() {

							@Override
							public void actionPerformed(ActionEvent e) {
								// TODO Auto-generated method stub
								String id = name.getText();
								String te = new GetQQFriends().findQQ(id);
								if (te == null) {
									Container container = new Container();
									JOptionPane.showOptionDialog(container,
											"找好不存在", "警告",
											JOptionPane.DEFAULT_OPTION,
											JOptionPane.INFORMATION_MESSAGE,
											null, null, null);
								} else {
									re.setText(te);
								}
							}
						});

						add.addActionListener(new ActionListener() {

							@Override
							public void actionPerformed(ActionEvent e) {
								// TODO Auto-generated method stub
								String fid = name.getText();
								String fenzuid = (String) fenzuname
										.getSelectedItem();
								if (fenzuid == null) {
									Container container = new Container();
									JOptionPane.showOptionDialog(container,
											"分组不能为空", "警告",
											JOptionPane.DEFAULT_OPTION,
											JOptionPane.INFORMATION_MESSAGE,
											null, null, null);
								}
								Message m = new Message();
								m.setPanduan("14");
								m.setFasong(ID);
								m.setJieshou(fid);
								m.setPass(fenzuid);
								System.out.println("我的账号" + m.getFasong()
										+ "好友账号" + m.getJieshou() + "分组"
										+ m.getPass());
								Socket s;
								try {
									s = new Socket("localhost", 9999);// 连接到服务器
									ObjectOutputStream oos = new ObjectOutputStream(
											s.getOutputStream());// 新建输出流
									oos.writeObject(m);// 发给服务器
									ObjectInputStream ois = new ObjectInputStream(
											s.getInputStream());// 新建输入流
									Message m1 = (Message) ois.readObject();// 获得服务器的反馈消息
									if (m1.getPanduan().equals("14")) {
										Container container = new Container();
										JOptionPane
												.showOptionDialog(
														container,
														"添加成功",
														"成功",
														JOptionPane.DEFAULT_OPTION,
														JOptionPane.INFORMATION_MESSAGE,
														null, null, null);
										jf2.dispose();
										upDateUI(ID);
									} else {
										Container container = new Container();
										JOptionPane
												.showOptionDialog(
														container,
														"该账号不存在或已为好友",
														"失败",
														JOptionPane.DEFAULT_OPTION,
														JOptionPane.INFORMATION_MESSAGE,
														null, null, null);

									}
								} catch (IOException e1) {
									e1.printStackTrace();
								} catch (ClassNotFoundException e1) {
									// TODO Auto-generated catch block
									e1.printStackTrace();
								}

							}
						});
						jf2.add(find);

						JLabel fen = new JLabel("分组:");
						fen.setBounds(20, 80, 40, 25);
						jf2.add(fen);

					}
				});

		delfenzu.addActionListener(new ActionListener() {// 删除分组

					@Override
					public void actionPerformed(ActionEvent e) {
						// TODO Auto-generated method stub

						final JFrame delf = new JFrame();
						delf.setLayout(null);
						final Vector<String> str = new GetQQFriends()
								.getQQfriendssum(ID);//获取所有的好友分组
						final JComboBox fenzuname;
						fenzuname = new JComboBox(str);// 初始化下拉框
						fenzuname.setBorder(null);// 设置无边框
						fenzuname.setEditable(true);// 设置下拉框可编辑
						fenzuname.setBounds(20, 20, 130, 20);// 设置下拉框的大小位置
						fenzuname.setFont(new Font("Calibri ", 0, 13));// 设置下拉框的字体样式

						JButton del = new JButton("删除");
						del.setBounds(40, 50, 80, 28);
						del.addActionListener(new ActionListener() {

							@Override
							public void actionPerformed(ActionEvent e) {
								// TODO Auto-generated method stub
								Container container = new Container();
								int result = JOptionPane.showConfirmDialog(
										container,
										"删除分组将会导致分组内的好友随机添加到其它分组,确认删除?",
										"提示信息",
										JOptionPane.YES_NO_CANCEL_OPTION,
										JOptionPane.QUESTION_MESSAGE);
								if (result == 0) {// 如果选择了删除
									String dt = (String) fenzuname.getSelectedItem();
									if (str.size() == 1) {
										Container container1 = new Container();
										JOptionPane
												.showOptionDialog(
														container1,
														"分组个数不能为0",
														"失败",
														JOptionPane.DEFAULT_OPTION,
														JOptionPane.INFORMATION_MESSAGE,
														null, null, null);
									} else {
										String newF = null;
										for(int ii=0; ii<str.size(); ii++){
											System.out.println(str.get(ii));
											if(str.get(ii).equals(dt)){
												
											}else{
												newF = str.get(ii);//获取其它任意一个分组的名字
											}
										}
										System.out.println("新分组" + newF);
										Message m = new Message();
										m.setPanduan("16");
										m.setText(dt);
										m.setFasong(ID);
										m.setJieshou(newF);
										Socket s;
										try {
											s = new Socket("localhost", 9999);// 连接到服务器
											ObjectOutputStream oos = new ObjectOutputStream(
													s.getOutputStream());// 新建输出流
											oos.writeObject(m);// 发给服务器
											/*
											 * ObjectInputStream ois = new
											 * ObjectInputStream
											 * (s.getInputStream());// 新建输入流
											 * Message m1 = (Message)
											 * ois.readObject();// 获得服务器的反馈消息
											 *//** 删除成功 **/
											
											
											delf.dispose();
											upDateUI(ID);
											/************/
										} catch (IOException e1) {
											e1.printStackTrace();
										}
									}
								}
							}
						});

						delf.setBounds(500, 500, 250, 150);
						delf.add(fenzuname);
						delf.add(del);
						delf.setVisible(true);
					}
				});
		ps.setPreferredSize(new Dimension(279, 78));
		ps.add(addfenzu);
		ps.add(delfenzu);
		ps.add(addfriend);
		ps.setOpaque(false);
		ps.repaint();
		ps.validate();
		return ps;
	}

	private void creatPcen(final String myid) {
		// TODO Auto-generated method stub
		pcen = new JPanel();
		ff = new GetQQFriends().getQQfriendssum(myid);// 获取好友分组个数
		n = ff.size();
		JPanel[] pc = new JPanel[n + 1];// 获得卡片数

		/****** 第一张卡片 *********/
		JButton[] fb = new JButton[n];// 初始化分组按钮
		pc[0] = new JPanel();// 初始化第一张卡片
		JPanel pp = new JPanel();// 创建一个临时存放分组组件的面板
		if (n < 10) {
			pp.setLayout(new GridLayout(10, 1));
		} else {
			pp.setLayout(new GridLayout(n, 1));
		}
		// pp.setPreferredSize(new Dimension(279, 500));
		JScrollPane jsp1 = new JScrollPane();
		jsp1.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);// 设置水平滚动条从不出现
		for (int i = 0; i < n; i++) {// 初始化第一张卡片
			fb[i] = new JButton(ff.get(i), no);
			fb[i].setPreferredSize(new Dimension(279, 50));
			fb[i].setHorizontalAlignment(JButton.LEFT);
			fb[i].addMouseListener(new MouseListener() {

				@Override
				public void mouseReleased(MouseEvent e) {
					// TODO Auto-generated method stub

				}

				@Override
				public void mousePressed(MouseEvent e) {
					// TODO Auto-generated method stub

				}

				@Override
				public void mouseExited(MouseEvent e) {
					// TODO Auto-generated method stub

				}

				@Override
				public void mouseEntered(MouseEvent e) {
					// TODO Auto-generated method stub

				}

				@Override
				public void mouseClicked(MouseEvent e) {
					// TODO Auto-generated method stub
					if (e.getClickCount() == 2) {
						JButton te = (JButton) e.getSource();
						if (te.getIcon() == no) {
							String name = te.getText();
							int jj = 0;
							for (jj = 0; jj < n; jj++) {
								if (ff.get(jj).equals(name)) {
									break;
								}
							}
							System.out.println(jj);
							c1.show(pcen, Integer.toString(jj + 1));
						} else {
							c1.show(pcen, "0");
						}
					}
				}
			});

			pp.add(fb[i]);

		}
		jsp1.setBounds(0, 120, 279, 500);
		jsp1.setPreferredSize(new Dimension(279, 500));
		jsp1.setViewportView(pp);// 用JSP存放面板
		pc[0].add(jsp1);// 将JSO添加到pc[0]

		/**********************************/
		for (int i = 1; i <= n; i++) {// 初始化其它卡片
			fn = new GetQQFriends().getQQfriendExtendsFenzu(ff.get(i - 1), myid);// 获取该分组内的好友备注
			int nn = fn.size();
			JButton[] fq = new JButton[fn.size()];
			JScrollPane jsp = new JScrollPane();// 初始化存放的JSP
			jsp.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);// 设置水平滚动条从不出现
			pc[i] = new JPanel(); // 初始化卡片
			JPanel pl = new JPanel();
			if (n + nn < 10) {
				pl.setLayout(new GridLayout(10, 1));
			} else {
				pl.setLayout(new GridLayout(n + nn, 1));
			}
			jsp.setViewportView(pl);
			for (int j = 0; j < n; j++) {
				if (j == i - 1) {
					fb[j] = new JButton(ff.get(j), ye);
					fb[j].setPreferredSize(new Dimension(279, 50));
				} else {
					fb[j] = new JButton(ff.get(j), no);
					fb[j].setPreferredSize(new Dimension(279, 50));
				}
				fb[j].setHorizontalAlignment(JButton.LEFT);
				fb[j].addMouseListener(new MouseListener() {

					@Override
					public void mouseReleased(MouseEvent e) {
						// TODO Auto-generated method stub

					}

					@Override
					public void mousePressed(MouseEvent e) {
						// TODO Auto-generated method stub

					}

					@Override
					public void mouseExited(MouseEvent e) {
						// TODO Auto-generated method stub

					}

					@Override
					public void mouseEntered(MouseEvent e) {
						// TODO Auto-generated method stub

					}

					@Override
					public void mouseClicked(MouseEvent e) {
						// TODO Auto-generated method stub
						if (e.getClickCount() == 2) {
							JButton te = (JButton) e.getSource();
							if (te.getIcon() == no) {
								String name = te.getText();
								int jj = 0;
								for (jj = 0; jj < n; jj++) {
									if (ff.get(jj).equals(name)) {
										break;
									}
								}
								System.out.println(jj);
								c1.show(pcen, Integer.toString(jj + 1));
							} else {
								c1.show(pcen, "0");
							}
						}
					}
				});
				pl.add(fb[j]);
				if (ff.get(j).equals(ff.get(i - 1))) {
					for (int kk = 0; kk < fn.size(); kk++) {
						String ic = new GetQQFriends()
								.getIcon(fn.get(kk), myid);// 获取好友头像路径
						String nickname = new GetQQFriends()
								.getQQfriendsNickName(fn.get(kk), myid);// 获取好友昵称
						String title1 = new GetQQFriends().getQQfriendsTitle(fn
								.get(kk), myid);// 获取好友签名
						ImageIcon icon = new ImageIcon(ic);
						if (nickname.equals(fn.get(kk))) {
							fq[kk] = new JButton(fn.get(kk), icon);
							fq[kk].setPreferredSize(new Dimension(279, 50));
							fq[kk].setToolTipText(title1);
						} else {
							String tt = fn.get(kk) + "(" + nickname + ")";
							fq[kk] = new JButton(tt, icon);
							fq[kk].setPreferredSize(new Dimension(279, 50));
							fq[kk].setToolTipText(title1);
						}
						fq[kk].setBackground(Color.WHITE);
						fq[kk].setHorizontalAlignment(JButton.LEFT);
						fq[kk].addMouseListener(new MouseListener() {

							@Override
							public void mouseReleased(MouseEvent e) {
								// TODO Auto-generated method stub

							}

							@Override
							public void mousePressed(MouseEvent e) {
								// TODO Auto-generated method stub

							}

							@Override
							public void mouseExited(MouseEvent e) {
								// TODO Auto-generated method stub

							}

							@Override
							public void mouseEntered(MouseEvent e) {
								// TODO Auto-generated method stub

							}

							@Override
							public void mouseClicked(MouseEvent e) {
								// TODO Auto-generated method stub
								if (e.getClickCount() == 2) {//双击表示聊天
									JButton te = (JButton) e.getSource();
									String fid = new GetQQFriends().getid(myid, te.getText());
									//System.out.println("聊天打开时的获取的好友ID" + fid);
									Talke qqchat = new Talke(myid,te.getText());
									String lt = myid+fid;
									System.out.println("创建的聊天名"+lt);
									ManageQqChat.addQqChat(lt, qqchat);
								}else if(e.getButton() == e.BUTTON3){//右键好友管理
									String Myid = myid;
									JButton ft= (JButton) e.getSource();
									String Fi = ft.getText();
									JPopupMenu menu = new JPopupMenu();
									JButton del,cha;
									del = new JButton("删除好友");
									cha = new JButton("修改备注");
									menu.add(del);
									menu.add(cha);
									menu.show(e.getComponent(),e.getX(),e.getY());//显示弹出菜单;
									//添加监听
									del.addActionListener(new ActionListener() {//删除好友监听
										
										@Override
										public void actionPerformed(ActionEvent e) {
											// TODO Auto-generated method stub
											
										}
									});
									
									cha.addActionListener(new ActionListener() {//修改备注监听
										
										@Override
										public void actionPerformed(ActionEvent e) {
											// TODO Auto-generated method stub
											System.out.println("修改备注");
										}
									});

								}
							}
						});

						pl.add(fq[kk]);
					}
				}
			}
			jsp.setBounds(0, 120, 279, 500);
			jsp.setPreferredSize(new Dimension(279, 500));
			pc[i].add(jsp);

		}
		/****************/
		pcen.setLayout(c1);
		pcen.setBounds(0, 300, 279, 100);
		// pcen.setPreferredSize(new Dimension(279, 100));
		for (int i = 0; i <= n; i++) {//将所有卡片加入卡片布局管理器
			pcen.add(pc[i], Integer.toString(i));
		}
	}

	private void creatPnor(String MyId) {// 北部面板
		// TODO Auto-generated method stub
		String MyNickname = null;
		String MyIcon = null;
		String Mytitle = null;
		Message mm = new Message();//获取登录到的头像昵称等信息
		mm.setPanduan("17");
		mm.setFasong(MyId);
		Socket s;
		try {
			s = new Socket("localhost", 9999);// 连接到服务器

			ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());// 新建输出流
			oos.writeObject(mm);// 发给服务器
			ObjectInputStream ois = new ObjectInputStream(s.getInputStream());// 新建输入流
			Message m1 = (Message) ois.readObject();// 获得服务器的反馈消息
			MyNickname = m1.getFasong();
			MyIcon = m1.getJieshou();
			Mytitle = m1.getText();
		} catch (IOException e1) {
			e1.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		pnor = new JPanel();//
		pnor.setLayout(null);
		pnor.setPreferredSize(new Dimension(0, 120));
		pnor.setBounds(0, 0, 279, 120);
		ImageIcon im = new ImageIcon(MyIcon);//设定头像
		JLabel l1 = new JLabel(im);
		l1.setBounds(30, 20, 60, 60);
		JTextField nickname = new JTextField(20);//设定昵称
		JTextField title = new JTextField(20);//设定签名
		nickname.setBounds(100, 30, 130, 20);
		title.setBounds(100, 60, 130, 20);
		nickname.setOpaque(false);
		nickname.setBorder(new EmptyBorder(0, 0, 0, 0));
		nickname.setFont(new Font("行书", Font.BOLD + Font.ITALIC, 18));
		nickname.setEditable(false);
		nickname.setText(MyNickname);
		title.setOpaque(false);
		title.setBorder(new EmptyBorder(0, 0, 0, 0));
		title.setFont(new Font("行书", Font.ITALIC, 15));
		title.setText(Mytitle);
		title.setToolTipText(Mytitle);

		JButton min = new JButton(new ImageIcon("Images//qqmin.png"));
		min.setBounds(223, -1, 28, 28);
		min.setOpaque(false);
		min.setBorder(new EmptyBorder(0, 0, 0, 0));
		min.setToolTipText("最小化");
		min.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				setExtendedState(ICONIFIED);
			}
		});
		this.add(min);
		JButton close = new JButton(new ImageIcon("Images//qqclose.png"));
		close.setBounds(251, -1, 28, 28);
		close.setBorder(new EmptyBorder(0, 0, 0, 0));
		close.setToolTipText("关闭");
		close.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				dispose();
			}
		});
		this.add(close);

		JButton set = new JButton(new ImageIcon("Images//set.png"));
		set.setBounds(195, -1, 28, 28);
		// set.setOpaque(false);
		set.setBorder(new EmptyBorder(0, 0, 0, 0));
		set.setToolTipText("个人设置");

		pnor.add(set);
		pnor.add(nickname);
		pnor.add(l1);
		pnor.add(title);
		pnor.setOpaque(false);
	}

}

整个代码写的比较乱,因为我也是个菜鸡,而且中间就是在这里,经历了大量的修改,变化。倒是最后自己都晕乎乎的,不知道怎么的就写成了,。。推荐新手同学由繁到简,不要只是复制粘贴



聊天界面

聊天界面很简单,主要是两个JtextArea的使用,以及网络编程方面的应用。

package UI;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.ComponentOrientation;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Vector;

import javax.swing.*;
import javax.swing.text.JTextComponent;

import model.GetQQFriends;

import tools.ManageClientConServerThread;

import bean.Message;

public class Talke extends JFrame{
	BorderLayout g1;
	JPanel psou;
	JScrollPane pnor,pcen;
	JLabel friendname;//好友名字
	JButton minn,close;//最小化与关闭按钮
	JButton send;//发送消息按钮
	JButton chatrecond;//聊天记录按钮
	JTextArea nor,cen;//聊天和发送文本域
	String Fid;//好友ID
	String Myid;//本人ID
	
	public Talke(final String my,final String Frienf) {
		// TODO Auto-generated constructor stub
		/****************/
		/*设置聊天界面信息*/
		this.setSize( 450,500);
		this.setTitle(Frienf);
		this.setVisible(true);
		g1 = new BorderLayout();
		this.setLayout(g1);
		this.setLocationRelativeTo(null);// 窗体居中  
		/****************/
		/**设置北部面板**/
		//聊天域
		nor = new JTextArea();
		nor.setEditable(false);
		pnor = new JScrollPane(nor);
		pnor.setPreferredSize(new Dimension(450, 300));
		this.add(pnor,g1.NORTH);
		/**************/
		/**设置中间面板**/
		//发送文件
		cen = new JTextArea();
		pcen = new JScrollPane(cen);
		pcen.setPreferredSize(new Dimension(450,150));
		this.add(pcen,g1.CENTER);
		/**********/
		
		/**创建南部面板**/
		//发送按钮
		psou = new JPanel();
		psou.setLayout(new FlowLayout());
		send = new JButton("发送");
		psou.setPreferredSize(new Dimension(450,50));
		chatrecond = new JButton("聊天记录");
		chatrecond.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				final JFrame jf = new JFrame();
				jf.setSize(450, 400);
				jf.setLayout(null);
				jf.setVisible(true);
				jf.setLocationRelativeTo(null);// 窗体居中  
				JButton find;
				JLabel year,mon,day;
				final JComboBox yt;
				final JComboBox mt;
				final JComboBox dt;
				/* 年下拉框 */
				Vector<String> yy = new Vector<String>();
				for (int i = 1990; i <= 2019; i++) {
					yy.add(Integer.toString(i));
				}
				//月下拉框
				Vector<String> mm = new Vector<String>();
				for (int i = 1; i <= 12; i++) {
					String s1 = "";
					if (i < 10) {
						s1 = '0' + Integer.toString(i);
					} else {
						s1 = Integer.toString(i);
					}
					mm.add(s1);
				}
				//日下拉框
				Vector<String> dd = new Vector<String>();
				for (int i = 1; i <= 31; i++) {
					String s1 = "";
					if (i < 10) {
						s1 = '0' + Integer.toString(i);
					} else {
						s1 = Integer.toString(i);
					}
					dd.add(s1);
				}
				year = new JLabel("年");
				mon = new JLabel("月");
				day = new JLabel("日");
				yt = new JComboBox(yy);
				mt = new JComboBox(mm);
				dt = new JComboBox(dd);
				find = new JButton("查询记录");
				yt.setBounds(10, 10, 60, 25);
				year.setBounds(75, 10, 30, 30);
				mt.setBounds(105, 10, 60, 25);
				mon.setBounds(165, 10, 30, 30);
				dt.setBounds(195, 10, 60, 25);
				day.setBounds(255, 10, 30, 30);
				find.setBounds(290, 10, 100, 30);
				yt.setBorder(null);// 设置无边框
				yt.setEditable(true);// 设置下拉框可编辑
				mt.setBorder(null);// 设置无边框
				mt.setEditable(true);// 设置下拉框可编辑
				dt.setBorder(null);// 设置无边框
				dt.setEditable(true);// 设置下拉框可编辑
				jf.add(yt);
				jf.add(year);
				jf.add(mt);
				jf.add(mon);
				jf.add(dt);
				jf.add(day);
				jf.add(find);
				final JTextArea recarea = new JTextArea();
				JScrollPane recjsp = new JScrollPane(recarea);
				recjsp.setBounds(0, 50, 450, 350);
				jf.add(recjsp);
				find.addActionListener(new ActionListener() {
					
					@Override
					public void actionPerformed(ActionEvent e) {
						// TODO Auto-generated method stub
						String date = yt.getSelectedItem()+"-" +mt.getSelectedItem() + "-" + dt.getSelectedItem(); 
						Message mr = new Message();
						mr.setPanduan("19");
						String fid1 = new GetQQFriends().getid(my,Frienf);
						mr.setFasong(Myid);
						mr.setJieshou(fid1);
						mr.setText(date);
						try{
							ObjectOutputStream oos = new ObjectOutputStream(ManageClientConServerThread.getClientConServerThread(my).getS().getOutputStream());// 新建输出流
							oos.writeObject(mr);// 发给服务器
							ObjectInputStream ois = new ObjectInputStream(ManageClientConServerThread.getClientConServerThread(my).getS().getInputStream());
							Message m1 = (Message) ois.readObject();
							Vector<String> vr = m1.getVv();
							for(int ir =0; ir<vr.size(); ir++){
								recarea.append(vr.get(ir));
								recarea.append("\n");
							}
							
						}catch(IOException e1){
							e1.printStackTrace();
						} catch (ClassNotFoundException e1) {
							// TODO Auto-generated catch block
							e1.printStackTrace();
						}
						jf.repaint();
						jf.validate();
					}
				});;
			}
		});
		psou.add(send);
		psou.add(chatrecond);
		this.add(psou,g1.SOUTH);
		/*********/
		/*添加发送按钮监听*/
		send.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
				Date time = new Date();
				Message mm = new Message();
				String fid = new GetQQFriends().getid(my,Frienf);//获取好友ID
				String s1 = cen.getText();
				mm.setPanduan("3");
				mm.setFasong(my);
				mm.setJieshou(fid);
				mm.setText(s1);
				mm.setTime(time);
				try{
					ObjectOutputStream oos = new ObjectOutputStream(ManageClientConServerThread.getClientConServerThread(my).getS().getOutputStream());// 新建输出流
					oos.writeObject(mm);// 发给服务器
				}catch(IOException e1){
					e1.printStackTrace();
				}
				//nor.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
				nor.append( my + "  " + time + "\n");
				nor.append(s1 + "\n");
				cen.setText("");
			}
		});
		
		this.repaint();
		this.validate();
}
	public void showMessage(Message m){
		String TimeAndFa = m.getFasong()+"  "+m.getTime();
		//this.nor.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
		this.nor.append(TimeAndFa+"\n");
		this.nor.append(m.getText() + "\n");
	}

}

代码比较多,希望大家能有耐心。。。和(绷带)

猜你喜欢

转载自blog.csdn.net/zzuli_Acmer/article/details/80930492