在开发软件时,我们大多第一印象就是一个用户界面,所以我们从用户界面开始
一、开发时一定要先做好需求分析,这是本人的血泪教训。事先一定要先想好自己要做什么功能,能想的多全面就有多全面,不然等到开发到一半时就可以体会绝望了。在本次项目中,我主要实现的是登录,注册,添加/删除分组,添加好友,多人聊天功能。在后面还想要添加一些附加功能,比如聊天记录查询,个人资料修改,好友管理功能,后来发现时间不够了,而且需要改动的地方较大。。所以请同学们一定做好需求分析。
二、打好注释,打好注释,打好注释。。。重要的事情说三遍
下面开始吧!
整个界面,猪窗口使用的是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");
}
}
代码比较多,希望大家能有耐心。。。和(绷带)