📄 userlistmanage.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 + -