📄 recievethread.java
字号:
package com.zlf.qqclient.login;
/**
*客户端接收线程
*@author zlf
*/
import java.awt.Color;
import java.awt.Component;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.text.BadLocationException;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;
import javax.swing.tree.DefaultMutableTreeNode;
import com.zlf.qq.pub.DataPacket;
import com.zlf.qqclient.filetransfer.FileTransfer;
import com.zlf.qqclient.filetransfer.MyFileChooser;
import com.zlf.qqclient.filetransfer.ReceiveFile;
import com.zlf.qqclient.mainframe.MainFrame;
import com.zlf.qqclient.mainframe.tree.User;
import com.zlf.qqclient.utils.Public;
import com.zlf.qqclient.utils.QQUtils;
public class RecieveThread implements Runnable {
private ObjectInputStream ois;
private boolean flag = false;
private MainFrame chatFrame;
private MyFileChooser fc = new MyFileChooser();
private static FileTransfer ft;
private static ReceiveFile rf;
private static String filename;
private SimpleAttributeSet sas = new SimpleAttributeSet();// 属性集合
private String sary;
/**
*
* @param ois 对象输入流
* @param chatFrame 主面板
*
*/
public RecieveThread(ObjectInputStream ois, MainFrame chatFrame) {
this.ois = ois;
this.chatFrame = chatFrame;
}
public void run() {
while (!flag) {
try {
// 收包
DataPacket datapacket = (DataPacket) ois.readObject();
//System.out.println("收包"+datapacket.getType());
if (datapacket.getType().equals(DataPacket.server_close_type)) {
// 如果是关闭包的话,弹出提示,关闭客户端程序
String serverClose = (String) datapacket.getData().get(
"data");
JOptionPane.showMessageDialog(chatFrame, serverClose,
"提示框", JOptionPane.WARNING_MESSAGE);
System.exit(0);
}else if (datapacket.getType().equals(DataPacket.up_line_type)
|| datapacket.getType().equals(
DataPacket.down_line_type)) {
// 上下线包
String userId = datapacket.getFrom();// 取得userId
DefaultMutableTreeNode tempuser = (DefaultMutableTreeNode) Public.userTable
.get(userId);
DefaultMutableTreeNode parent = (DefaultMutableTreeNode) tempuser
.getParent();
parent.remove(tempuser);
if (datapacket.getType().equals(DataPacket.up_line_type)) {
// 上线包的话
((User) tempuser.getUserObject()).setOnline(1);// 该用户上线了
parent.insert(tempuser, 0);
} else if (datapacket.getType().equals(DataPacket.down_line_type)) {
// 下线包的话
((User) tempuser.getUserObject()).setOnline(0);// 该用户下线了
parent.insert(tempuser, parent.getChildCount());
}
chatFrame.getTree().updateUI();
}else if (datapacket.getType().equals(
DataPacket.privateChat_type)
|| datapacket.getType()
.equals(DataPacket.deptChat_type)||datapacket.getType()
.equals(DataPacket.publicChat_type)) {
chatFrame.getTextContent().setEditable(true);//设置能编辑的
// 私聊包
String fromId = datapacket.getFrom();// 取得userId
DefaultMutableTreeNode tempNode = (DefaultMutableTreeNode) Public.userTable
.get(fromId);
String fromName = ((User) tempNode.getUserObject())
.getName();
HashMap data = datapacket.getData();
ArrayList al = (ArrayList) data.get("data");
MutableAttributeSet attrSet = (MutableAttributeSet) data
.get("font");
// 获取与编辑器关联的模型。StyledDocument用作通用样式化文档的接口。
StyledDocument sdShow = chatFrame.getTextContent()
.getStyledDocument();
///SimpleAttributeSet sas = new SimpleAttributeSet();// 属性集合
StyleConstants.setForeground(sas, Color.gray);// 设置字体前景色
// 返回文档中当前内容的字符数。
int lenShow = sdShow.getLength();
try {
// 在显示区填加内容
sdShow.insertString(lenShow, fromName + " " + QQUtils.getCurDate()+":"
+ "\n", sas);
for (int i = 0; i < al.size(); i++) {
// 返回文档中当前内容的字符数。
lenShow = sdShow.getLength();
// 设置 TextComponent 的文本插入符的位置。
chatFrame.getTextContent().setCaretPosition(lenShow);
Object o = al.get(i);
if (o instanceof Icon) {
chatFrame.getTextContent().insertIcon((ImageIcon) o);// 将图片显示在面板上
} else if (o instanceof String) {
sdShow.insertString(lenShow, (String) o,
attrSet);
}
}
lenShow = sdShow.getLength();
sdShow.insertString(lenShow, "\n", null);
chatFrame.getTextContent().setEditable(false);//设置不能编辑的
chatFrame.getTextContent().setCaretPosition(lenShow);//光标定位到最后
} catch (BadLocationException e1) {
e1.printStackTrace();
}
}else if(datapacket.getType().equals(DataPacket.delete_user_type)){
// 删除用户包
String userId = datapacket.getFrom();// 取得userId
DefaultMutableTreeNode tempuser = (DefaultMutableTreeNode) Public.userTable
.get(userId);
DefaultMutableTreeNode parent = (DefaultMutableTreeNode) tempuser
.getParent();
parent.remove(tempuser);
chatFrame.getTree().updateUI();
}else if(datapacket.getType().equals(DataPacket.transfile_type)){
String st = (String) datapacket.getData().get("filename");
sary = st.substring(st.lastIndexOf("\\")+1);
if ((JOptionPane.showConfirmDialog(chatFrame, datapacket.getFrom()+" 要给你发送文件 "+sary+" 是否接受?", "友情提示", JOptionPane.YES_NO_OPTION)) != 0){
//不接受文件
ObjectOutputStream oos = (ObjectOutputStream) ((ArrayList) Public.mySocketInfo
.get(datapacket.getTo())).get(2);
DataPacket infoPacket = null;
HashMap data = new HashMap();
data.put("filename",datapacket.getData().get("filename"));
infoPacket = new DataPacket(DataPacket.cannotSendtransfile_type,
datapacket.getTo(), datapacket.getFrom(), data);
try {
oos.writeObject(infoPacket);
oos.flush();
} catch (IOException e1) {
e1.printStackTrace();
}
return;
}
Component comp = getLabelForInChooser(fc, "FileChooser.fileNameLabelText");
if (comp instanceof JTextField) {
JTextField field = ((JTextField)comp);
field.setText(sary);//默认设置发过来的文件名
}
if (fc.showDialog(chatFrame, "保存文件") == JFileChooser.APPROVE_OPTION) {
filename = fc.getSelectedFile().getAbsolutePath();
rf = new ReceiveFile(filename,chatFrame.getTextContent());
rf.start();
chatFrame.getJtp().setSelectedIndex(1);
// 确认可以发文件包
ObjectOutputStream oos = (ObjectOutputStream) ((ArrayList) Public.mySocketInfo
.get(datapacket.getTo())).get(2);
DataPacket infoPacket = null;
HashMap data = new HashMap();
data.put("filename",datapacket.getData().get("filename"));
infoPacket = new DataPacket(DataPacket.canSendtransfile_type,
datapacket.getTo(), datapacket.getFrom(), data);
try {
oos.writeObject(infoPacket);
oos.flush();
} catch (IOException e1) {
e1.printStackTrace();
}
}else{
//不接受文件
ObjectOutputStream oos = (ObjectOutputStream) ((ArrayList) Public.mySocketInfo
.get(datapacket.getTo())).get(2);
DataPacket infoPacket = null;
HashMap data = new HashMap();
data.put("filename",datapacket.getData().get("filename"));
infoPacket = new DataPacket(DataPacket.cannotSendtransfile_type,
datapacket.getTo(), datapacket.getFrom(), data);
try {
oos.writeObject(infoPacket);
oos.flush();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}else if(datapacket.getType().equals(DataPacket.canSendtransfile_type)){
chatFrame.getJtp().setSelectedIndex(1);
// 获取与编辑器关联的模型。StyledDocument用作通用样式化文档的接口。
StyledDocument sdShow = chatFrame.getTextContent()
.getStyledDocument();
//SimpleAttributeSet sas = new SimpleAttributeSet();// 属性集合
StyleConstants.setForeground(sas, Color.blue);// 设置字体前景色
// 返回文档中当前内容的字符数。
int lenShow = sdShow.getLength();
sdShow.insertString(lenShow, QQUtils.getCurDate() + "\n"+ "对方同意了接收文件"+sary+ "\n", sas);
//chatFrame.getTextContent().getStyledDocument().insertString(0, "对方同意了接收文件"+datapacket.getData().get("filename"),null);
ft = new FileTransfer(9988,QQUtils.properties.getProperty("Address"),chatFrame.getTextContent(),datapacket.getData().get("filename").toString());
ft.start();
}else if(datapacket.getType().equals(DataPacket.cannotSendtransfile_type)){
if (rf != null){
rf = null;
}
if (ft != null){
ft = null;
}
//获取与编辑器关联的模型。StyledDocument用作通用样式化文档的接口。
StyledDocument sdShow = chatFrame.getTextContent()
.getStyledDocument();
//SimpleAttributeSet sas = new SimpleAttributeSet();// 属性集合
StyleConstants.setForeground(sas, Color.blue);// 设置字体前景色
// 返回文档中当前内容的字符数。
int lenShow = sdShow.getLength();
sdShow.insertString(lenShow, QQUtils.getCurDate() + "\n"+ "对方拒绝了接收文件"+ "\n", sas);
//chatFrame.getTextContent().setText("对方拒绝了接收文件");
}else if (datapacket.getType().equals(DataPacket.chat_all_type)){
chatFrame.getJtp().setSelectedIndex(0);
chatFrame.getNewsText().setText((String) datapacket.getData().get("data"));
}
} catch (IOException e) {
e.printStackTrace();
break;
} catch (ClassNotFoundException e) {
e.printStackTrace();
break;
} catch (BadLocationException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
break;
}
}
}
/**
*
* @param chooser JFileChooser
* @param key
* @return
*/
public static Component getLabelForInChooser(JFileChooser chooser, String key){
java.util.Locale l = chooser.getLocale();
String s = UIManager.getString(key, l);
javax.swing.plaf.FileChooserUI ui = chooser.getUI();
int count = ui.getAccessibleChildrenCount(chooser);
for (int i=0; i<count; i++) {
javax.accessibility.Accessible a =
ui.getAccessibleChild(chooser, i);
JLabel label = findLabel((JComponent)a, s);
if (label != null) {
return label.getLabelFor();
}
}
return null;
}
/**
*
* @param comp
* @param s
* @return
*/
private static JLabel findLabel(JComponent comp, String s){
JLabel label = null;
if (comp instanceof JLabel) {
if (((JLabel)comp).getText().equals(s)){
label = (JLabel)comp;
}
} else if (comp instanceof JComponent) {
Component[] comps = comp.getComponents();
for (int i=0; i<comps.length; i++) {
if (comps[i] instanceof JComponent) {
label = findLabel((JComponent)comps[i], s);
if (label != null) {
break;
}
}
}
}
return label;
}
public static FileTransfer getFt() {
return ft;
}
public static ReceiveFile getRf() {
return rf;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -