// Create new room // 创建新的房间 ChatRoom chatRoom = new ChatRoomImpl( message.getFrom(), userNickname, roomTitle ); SparkManager.getChatManager().getChatContainer().addChatRoom( chatRoom ); SparkManager.getChatManager().getChatContainer().activateChatRoom( chatRoom ); chatRoom.insertMessage( message );
GroupChatRoom.java private void handleMessagePacket( Stanza stanza )
SparkManager.java
public static ChatManager getChatManager() { if (chatManager == null) { chatManager = ChatManager.getInstance(); } return chatManager; }
ChatManager.java
public ChatContainer getChatContainer() { return chatContainer; }
ChatContainer.java
/** * Adds a new ChatRoom to Spark. * 给Spark添加了一个新的聊天室。 * * @param room the ChatRoom to add. */ public synchronized void addChatRoom(final ChatRoom room) { createFrameIfNeeded(); // 设置边框,高亮灰 room.setBorder(BorderFactory.createMatteBorder(1, 0, 0, 0, Color.LIGHT_GRAY)); AndFilter presenceFilter = new AndFilter(new StanzaTypeFilter(Presence.class), FromMatchesFilter.createBare( room.getRoomname())); // Next, create a packet listener. We use an anonymous inner class for brevity. StanzaListener myListener = stanza -> SwingUtilities.invokeLater( () -> handleRoomPresence((Presence)stanza) ); room.registeredToFrame(chatFrame); SparkManager.getConnection().addAsyncStanzaListener(myListener, presenceFilter); // Add to PresenceMap presenceMap.put(room.getRoomname(), myListener); String tooltip; if (room instanceof ChatRoomImpl) { tooltip = ((ChatRoomImpl)room).getParticipantJID(); String nickname = SparkManager.getUserManager().getUserNicknameFromJID(((ChatRoomImpl)room).getParticipantJID()); tooltip = "<html><body><b>Contact: </b>" + nickname + "<br><b>JID: </b>" + tooltip; } else { tooltip = room.getRoomname(); } // Create ChatRoom UI and dock SparkTab tab = addTab(room.getTabTitle(), room.getTabIcon(), room, tooltip); tab.addMouseListener(new MouseAdapter() { public void mouseReleased(MouseEvent e) { checkTabPopup(e); } public void mousePressed(MouseEvent e) { checkTabPopup(e); } }); room.addMessageListener(this); // Remove brand panel final String title = getTabAt(0).getActualText(); if (title.equals(WELCOME_TITLE)) { chatFrame.setTitle(room.getRoomTitle()); } final TimerTask visibleTask = new SwingTimerTask() { public void doRun() { checkVisibility(room); } }; TaskEngine.getInstance().schedule(visibleTask, 100); // Add to ChatRoomList chatRoomList.add(room); // Notify users that the chat room has been opened. // 通知用户聊天室已经打开。 fireChatRoomOpened(room); // Focus Chat focusChat(); // Add Room listeners to override issue with input maps and keybinding on the mac. // 添加房间监听器以覆盖在mac上的输入映射和键绑定问题。 if (Spark.isMac()) { room.getChatInputEditor().addKeyListener(this); } }