該類主要實現底層的網絡通信功能
在該類中用到了本程序的一個主類
程序清單
public class LanChat extends JFrame
{
private DefaultListModel listModel = new DefaultListModel()
//定義一個JList對象
private JList friendsList = new JList(listModel)
//定義一個用於格式化日期的格式器
private DateFormat formatter = DateFormat
public LanChat()
{
super(
//設置該JList使用ImageCellRenderer作為單元格繪制器
friendsList
listModel
friendsList
add(new JScrollPane(friendsList))
setDefaultCloseOperation(JFrame
setBounds(
}
//向用戶列表中添加用戶
public void addUser(UserInfo user)
{
listModel
}
//從用戶列表中刪除用戶
public void removeUser(int pos)
{
listModel
}
//根據地址來查詢用戶
public UserInfo getUserBySocketAddress(SocketAddress address)
{
for (int i =
{
UserInfo user = getUser(i)
if (user
user
{
return user;
}
}
return null;
}
//
//獲取該聊天窗口的用戶數量
public int getUserNum()
{
return listModel
}
//獲取指定位置的用戶
public UserInfo getUser(int pos)
{
return (UserInfo)listModel
}
//實現JList上的鼠標雙擊監聽器
class ChangeMusicListener extends MouseAdapter
{
public void mouseClicked(MouseEvent e)
{
//如果鼠標的擊鍵次數大於
if (e
{
//取出鼠標雙擊時選中的列表項
UserInfo user = (UserInfo)friendsList
//如果該列表項對應用戶的交談窗口為null
if (user
{
//為該用戶創建一個交談窗口
user
}
//如果該用戶的窗口沒有顯示
if (!user
{
user
}
}
}
}
/**
* 處理網絡數據報
* 並將信息顯示在聊天對話框中
* @param packet 需要處理的數據報
* @param single 該信息是否為私聊信息
*/
public void processMsg(DatagramPacket packet
{
//獲取該發送該數據報的SocketAddress
InetSocketAddress srcAddress = (InetSocketAddress)packet
Address()
//如果是私聊信息
//對應的MulticastSocket的地址
if (single)
{
srcAddress = new InetSocketAddress(srcAddress
srcAddress
}
UserInfo srcUser = getUserBySocketAddress(srcAddress)
if (srcUser != null)
{
//確定消息將要顯示到哪個用戶對應窗口上
UserInfo alertUser = single ? srcUser : getUser(
//如果該用戶對應的窗口為空
if (alertUser
{
alertUser
}
//定義添加的提示信息
String tipMsg = single ?
//顯示提示信息
alertUser
+
+ new String(packet
if (!alertUser
{
alertUser
}
}
}
//主方法
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
index
{
UserInfo userInfo = (UserInfo)value;
icon = new ImageIcon(
name = userInfo
background = isSelected ? list
ground()
foreground = isSelected ? list
getForeground()
//返回該JPanel對象作為單元格繪制器
return this;
}
//重寫paintComponent方法
public void paintComponent(Graphics g)
{
int imageWidth = icon
int imageHeight = icon
g
g
g
//繪制好友圖標
g
g
//繪制好友用戶名
g
}
//通過該方法來設置該ImageCellRenderer的最佳大小
public Dimension getPreferredSize()
{
return new Dimension(
}
}
上面類中提供的addUser和removeUser方法用於暴露給通信類ComUtil使用
上面講解的只是本程序的關鍵類
返回目錄
編輯推薦
Java程序性能優化
新手學Java
Java程序設計培訓視頻教程
From:http://tw.wingwit.com/Article/program/Java/hx/201311/27255.html