?? lanchat.java
字號:
import java.util.*;import java.awt.*;import java.net.*;import java.text.*;import java.awt.event.*;import javax.swing.*;import javax.swing.event.*;/** * Description: * <br/>Copyright (C), 2005-2008, Yeeku.H.Lee * <br/>This program is protected by copyright laws. * <br/>Program Name: * <br/>Date: * @author Yeeku.H.Lee kongyeeku@163.com * @version 1.0 */public class LanChat extends JFrame{ private DefaultListModel listModel = new DefaultListModel(); //定義一個JList對象 private JList friendsList = new JList(listModel); //定義一個用于格式化日期的格式器 private DateFormat formatter = DateFormat.getDateTimeInstance(); public LanChat() { super("局域網聊天"); //設置該JList使用ImageCellRenderer作為單元格繪制器 friendsList.setCellRenderer(new ImageCellRenderer()); listModel.addElement(new UserInfo("all" , "所有人" , null , -2000)); friendsList.addMouseListener(new ChangeMusicListener()); add(new JScrollPane(friendsList)); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(2, 2, 160 , 600); } //向用戶列表中添加用戶 public void addUser(UserInfo user) { listModel.addElement(user); } //從用戶列表中刪除用戶 public void removeUser(int pos) { listModel.removeElementAt(pos); } //根據地址來查詢用戶 public UserInfo getUserBySocketAddress(SocketAddress address) { for (int i = 1 ; i < getUserNum() ; i++) { UserInfo user = getUser(i); if (user.getAddress() != null && user.getAddress().equals(address)) { return user; } } return null; } //—————————下面兩個方法是對ListModel的包裝————————— //獲取該聊天窗口的用戶數量 public int getUserNum() { return listModel.size(); } //獲取指定位置的用戶 public UserInfo getUser(int pos) { return (UserInfo)listModel.elementAt(pos); } //實現JList上的鼠標雙擊監聽器 class ChangeMusicListener extends MouseAdapter { public void mouseClicked(MouseEvent e) { //如果鼠標的擊鍵次數大于2 if (e.getClickCount() >= 2) { //取出鼠標雙擊時選中的列表項 UserInfo user = (UserInfo)friendsList.getSelectedValue(); //如果該列表項對應用戶的交談窗口為null if (user.getChatFrame() == null) { //為該用戶創建一個交談窗口,并讓該用戶引用該窗口 user.setChatFrame(new ChatFrame(null , user)); } //如果該用戶的窗口沒有顯示,則讓該用戶的窗口顯示出來 if (!user.getChatFrame().isShowing()) { user.getChatFrame().setVisible(true); } } } } /** * 處理網絡數據報,該方法將根據聊天信息得到聊天者, * 并將信息顯示在聊天對話框中。 * @param packet 需要處理的數據報 * @param single 該信息是否為私聊信息 */ public void processMsg(DatagramPacket packet , boolean single) { //獲取該發送該數據報的SocketAddress InetSocketAddress srcAddress = (InetSocketAddress)packet.getSocketAddress(); //如果是私聊信息,則該Packet獲取的是DatagramSocket的地址,將端口減1才是 //對應的MulticastSocket的地址 if (single) { srcAddress = new InetSocketAddress(srcAddress.getHostName(), srcAddress.getPort() - 1); } UserInfo srcUser = getUserBySocketAddress(srcAddress); if (srcUser != null) { //確定消息將要顯示到哪個用戶對應窗口上。 UserInfo alertUser = single ? srcUser : getUser(0); //如果該用戶對應的窗口為空,顯示該窗口 if (alertUser.getChatFrame() == null) { alertUser.setChatFrame(new ChatFrame(null , alertUser)); } //定義添加的提示信息 String tipMsg = single ? "對您說:" : "對大家說:"; //顯示提示信息 alertUser.getChatFrame().addString(srcUser.getName() + tipMsg + "......................(" + formatter.format(new Date()) + ")\n" + new String(packet.getData() , 0 , packet.getLength()) + "\n"); if (!alertUser.getChatFrame().isShowing()) { alertUser.getChatFrame().setVisible(true); } } } //主方法,程序的入口 public static void main(String[] args) { LanChat lc = new LanChat(); new LoginFrame(lc , "請輸入用戶名、頭像后登陸"); }}//定義用于改變JList列表項外觀的類class ImageCellRenderer extends JPanel implements ListCellRenderer{ private ImageIcon icon; private String name; //定義繪制單元格時的背景色 private Color background; //定義繪制單元格時的前景色 private Color foreground; public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { UserInfo userInfo = (UserInfo)value; icon = new ImageIcon("ico/" + userInfo.getIcon() + ".gif"); name = userInfo.getName(); background = isSelected ? list.getSelectionBackground() : list.getBackground(); foreground = isSelected ? list.getSelectionForeground() : list.getForeground(); //返回該JPanel對象作為單元格繪制器 return this; } //重寫paintComponent方法,改變JPanel的外觀 public void paintComponent(Graphics g) { int imageWidth = icon.getImage().getWidth(null); int imageHeight = icon.getImage().getHeight(null); g.setColor(background); g.fillRect(0, 0, getWidth(), getHeight()); g.setColor(foreground); //繪制好友圖標 g.drawImage(icon.getImage() , getWidth() / 2 - imageWidth / 2 , 10 , null); g.setFont(new Font("SansSerif" , Font.BOLD , 18)); //繪制好友用戶名 g.drawString(name, getWidth() / 2 - name.length() * 10 , imageHeight + 30 ); } //通過該方法來設置該ImageCellRenderer的最佳大小 public Dimension getPreferredSize() { return new Dimension(60, 80); }}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -