⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 userlistmanage.java

📁 这是个用java写的qq的多线程聊天的功能,有客户段和服务端,在eclipse里可以自动运行连接数据库
💻 JAVA
字号:
package smoker.client;

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.tree.*;

import smoker.server.MessageBag;
import smoker.tools.*;

public class UserListManage implements ActionListener, IUserListManager {
	private JTree tree;
	private DefaultMutableTreeNode root;
	private UserListTreeCellRenderer userCellrender;
	private Vector<User> onLineUserList;
	private Vector<Department> departmentList;
	private DefaultTreeModel treeModel;
	private HashMap<Integer, DefaultMutableTreeNode> usersNode;
	private HashMap<String, DefaultMutableTreeNode> departmentsNode;
	private HashMap<String, ChatGUI> chatGuiMap;
	private IClientCenter iClientCenter;
	private User currentUser;
	private Vector<MessageBag> msgBag;
	private JMenuItem popItemSendMsg;
	private JMenuItem popItemSeeInfo;
	private User selectUser;

	public UserListManage(IClientCenter iCCenter, Vector<User> userList,
			Vector<Department> departmentList, User currentUser) {
		this.iClientCenter = iCCenter;
		this.onLineUserList = userList;
		this.departmentList = departmentList;
		this.currentUser = currentUser;
		chatGuiMap = new HashMap<String, ChatGUI>();
		usersNode = new HashMap<Integer, DefaultMutableTreeNode>();
		departmentsNode = new HashMap<String, DefaultMutableTreeNode>();
		msgBag = new Vector<MessageBag>();
		popItemSendMsg = new JMenuItem("发送消息");
		popItemSendMsg.setActionCommand("popItemSendMsg");
		popItemSendMsg.addActionListener(this);
		popItemSeeInfo = new JMenuItem("查看好友资料");
		popItemSeeInfo.setActionCommand("popItemSeeInfo");
		popItemSeeInfo.addActionListener(this);
		root = makeDepartmentTreeNode();
		tree = new JTree(root);
		tree.setComponentPopupMenu(getTablePopMenu());
		tree.setRootVisible(false);
		userCellrender = new UserListTreeCellRenderer();
		tree.setCellRenderer(userCellrender);
		treeModel = ((DefaultTreeModel) tree.getModel());

		tree.addMouseListener(new MouseAdapter() {
			public void mousePressed(MouseEvent e) {
				int selectRow = tree.getRowForLocation(e.getX(), e.getY());
				TreePath selectPath = tree.getPathForLocation(e.getX(), e
						.getY());
				if (selectRow != -1) {
					if (e.getButton() != MouseEvent.BUTTON1) {
						return;
					}
					if (e.getClickCount() == 2) {
						doubleClick(selectPath);
					}
				}
			}
			private void doubleClick(TreePath selectPath) {
				Object obj = selectPath.getLastPathComponent();
				if (obj instanceof DefaultMutableTreeNode) {
					DefaultMutableTreeNode selectNode = (DefaultMutableTreeNode) obj;
					Object data = selectNode.getUserObject();
					if (data instanceof User) {
						openChatGui(data);
					}
				}
			}

		});
	}
	
	Vector<MessageBag> tempBag = new Vector<MessageBag>();
		private void readMsgBag(User chatUser) {
			for (int i = 0; i < msgBag.size(); i++) {
				MessageBag mb = msgBag.get(i);
				if (mb.getUser().getUserID() == chatUser.getUserID()) {
					displayMsg(mb.getUser(), mb.getChatInfo());
				tempBag.add(mb);
			}
		}
		removeReadedMessage();
	}
	
	private void removeReadedMessage() {
		int size = tempBag.size();
		for (int i = 0; i < size; i++) {
			msgBag.remove(tempBag.get(i));
		}
	}
	
	public void openChatGui(Object data) {
		User chatUser = (User) data;
		String loginID = chatUser.getLoginID();
		ChatGUI chatGui = chatGuiMap.get(loginID);
		if (chatGui != null) {
			chatGui.setVisible(true);
			readMsgBag(chatUser);
		} else {
			chatGui = new ChatGUI(iClientCenter, iClientCenter.getCurrentUser(), chatUser);
			chatGuiMap.put(loginID, chatGui);
			chatGui.setVisible(true);
			readMsgBag(chatUser);
		}
	}
	
	public void handleReciveMsg(ChatInfo chatInfo) {
		int reciverID = chatInfo.getReceiverID();
		int size = onLineUserList.size();
		for (int i = 0; i < size; i++) {
			User user = onLineUserList.get(i);
			if (reciverID == user.getUserID()) {
				ChatGUI chatGui = chatGuiMap.get(user.getLoginID());
				if (chatGui != null && chatGui.isVisible() == true) {
					displayMsg(user, chatInfo);
				} else {
					saveMessageToMsgBag(user, chatInfo);
				}
				return;
			}
		}
	}

	private void saveMessageToMsgBag(User user, ChatInfo chatInfo) {
		new PlaySound().Ring(Files.MESSAGE_SOUND);
		MessageBag mBag = new MessageBag(user, chatInfo);
		if(isCunZai(msgBag, user)) {
			new MessageTip(this, user).setVisible(true);
		}
		msgBag.add(mBag);
	}

	private boolean isCunZai(Vector<MessageBag> msgBag, User newUser) {
		int size = msgBag.size();
		for (int i = 0; i < size; i++) {
			if(((MessageBag)msgBag.get(i)).getUser().getUserID() == newUser.getUserID()) {
				return false;
			}
		}
		return true;
	}
	
	private void displayMsg(User user, ChatInfo chatInfo) {
		String loginID = user.getLoginID();
		ChatGUI chatGui = chatGuiMap.get(loginID);
		if (chatGui != null) {
			chatGui.setVisible(true);
			chatGui.onChatReceived(chatInfo);
		} else {
			chatGui = new ChatGUI(iClientCenter,iClientCenter.getCurrentUser(), user);
			chatGuiMap.put(loginID, chatGui);
			chatGui.setVisible(true);
			chatGui.onChatReceived(chatInfo);
		}
	}

	public JTree getUserListTree() {
		return tree;
	}

	private DefaultMutableTreeNode makeDepartmentTreeNode() {
		root = new DefaultMutableTreeNode();
		DefaultMutableTreeNode dptNode = null;
		Department dpt = null;
		if (departmentList == null) {
			return null;
		}
		int size = departmentList.size();
		for (int i = 0; i < size; i++) {
			dpt = departmentList.get(i);
			dptNode = new DefaultMutableTreeNode(dpt);
			root.add(dptNode);
			departmentsNode.put(dpt.getDptName(), dptNode);
		}
		makeUserTreeNode();
		return root;
	}

	private void makeUserTreeNode() {
		DefaultMutableTreeNode dptNode = null;
		DefaultMutableTreeNode userNode = null;
		User user = null;
		int size = onLineUserList.size();
		for (int i = 0; i < size; i++) {
			user = onLineUserList.get(i);
			dptNode = departmentsNode.get(user.getDepartmentName());
			if (dptNode == null) {
				continue;
			}
			userNode = new DefaultMutableTreeNode(user);
			dptNode.add(userNode);
			usersNode.put(new Integer(user.getUserID()), userNode);
		}
	}

	public void addUserNode(User user) {
		Integer key = new Integer(user.getUserID());
		if (usersNode.containsKey(key)) {
			return;
		}
		if (currentUser.getLoginID().equals(user.getLoginID())) {
			return;
		}
		DefaultMutableTreeNode dptNode = departmentsNode.get(user
				.getDepartmentName());
		if (dptNode == null) {
			return;
		}
		DefaultMutableTreeNode userNode = new DefaultMutableTreeNode(user);
		treeModel.insertNodeInto(userNode, dptNode, 0);
		usersNode.put(key, userNode);
		onLineUserList.add(user);
		new PlaySound().Ring(Files.LOGIN_SOUND);
		userCellrender.updateUI();
	}

	public void removeUserNode(User user) {
		Integer key = new Integer(user.getUserID());
		DefaultMutableTreeNode node = usersNode.get(key);
		if (node == null) {
			return;
		}
		treeModel.removeNodeFromParent(node);
		usersNode.remove(key);
		onLineUserList.remove(user);
		userCellrender.updateUI();
	}

	private JPopupMenu getTablePopMenu() {
		JPopupMenu treePopMenu = new JPopupMenu();
		treePopMenu.add(popItemSendMsg);
		treePopMenu.add(popItemSeeInfo);
		return treePopMenu;
	}

	private class UserListTreeCellRenderer extends JLabel implements
	TreeCellRenderer {
		public static final long serialVersionUID = 0;
		private final Color selBgColor = new Color(206, 233, 254);
		private final Color selForColor = new Color(39, 69, 90);
		private final Color bgColor = Color.white;
		private final Color forColor = new Color(39, 69, 90);
		private final Color borderLineColor = new Color(139, 168, 198);
		Border border;

		UserListTreeCellRenderer() {
			setOpaque(true);
			border = BorderFactory.createLineBorder(borderLineColor);
		}

		public Component getTreeCellRendererComponent(JTree tree, Object value,
				boolean selected, boolean expanded, boolean leaf, int row,
				boolean hasFocus) {
			if (!(value instanceof DefaultMutableTreeNode)) {
				return null;
			}
			DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
			Object data = node.getUserObject();
			if (data instanceof User) {
				User user = (User) data;
				setText(user.getNickName());
				setIcon(user.getIcon());
				setPreferredSize(new Dimension(155, 42));
			} else if (data instanceof Department) {
				Department dpt = (Department) data;
				setText(dpt.getDptName() + " ( " + getDptUserCount(dpt.getDptName()) + " ) ");
				setPreferredSize(new Dimension(150, 25));
				setIcon(null);
				setBorder(null);
			}
			if (selected) {
				this.setBackground(selBgColor);
				this.setForeground(selForColor);
				this.setBorder(border);
			} else {
				this.setBackground(bgColor);
				this.setForeground(forColor);
				this.setBorder(null);
			}
			return this;
		}
	}

	private int getDptUserCount(String dptName) {
		int ret = 0;
		int size = onLineUserList.size();
		for (int i = 0; i < size; i++) {
			User user = (User) onLineUserList.get(i);
			if (user.getDepartmentName().equals(dptName)) {
				ret++;
			}
		}
		return ret;
	}

	public void actionPerformed(ActionEvent e) {
		String command = e.getActionCommand();
		if (command.equals("popItemSendMsg")) {
			selectNode();
			if (selectUser == null) {
				return;
			} else {
				openChatGui(selectUser);
			}
		} else if (command.equals("popItemSeeInfo")) {
			selectNode();
			if (selectUser == null) {
				return;
			} else {
				new CardView(selectUser);
			}
		}
	}

	private void setSelectUser(TreePath selectPath) {
		Object obj = selectPath.getLastPathComponent();
		if (obj instanceof DefaultMutableTreeNode) {
			DefaultMutableTreeNode selectNode = (DefaultMutableTreeNode) obj;
			Object data = selectNode.getUserObject();
			if (data instanceof User) {
				selectUser = (User) data;
			}
		}
	}

	private void selectNode() {
		tree.addMouseListener(new MouseAdapter() {
			public void mousePressed(MouseEvent e) {
				int selectRow = tree.getRowForLocation(e.getX(), e.getY());
				TreePath selectPath = tree.getPathForLocation(e.getX(), e.getY());
				if (selectRow != -1) {
					if (e.getButton() == MouseEvent.BUTTON3) {
						setSelectUser(selectPath);
					}
				}
			}
		});
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -