import javax.swing.Icon;
public class ListItem {
private String name;
private Icon icon;
public ListItem(String name,Icon icon){
this.name=name;
this.icon=icon;
}
public String getName() {
return name;
}
public Icon getIcon() {
return icon;
}
}
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.net.*;
public class MyFrame {
private Socket socket = null;
private class MyPane extends JPanel{
private PrintWriter out =
null;
private BufferedReader in =
null;
private JTextField t;
private JButton b;
private DefaultListModel data =
new DefaultListModel();
public MyPane(){
this.setLayout(new
BorderLayout());
//list
JList l = new
JList(data);
JScrollPane
sp = new JScrollPane(l);
this.add(sp,
BorderLayout.CENTER);
JPanel p =
new JPanel();
t = new
JTextField(20);
b = new
JButton("Send");
p.add(t);
p.add(b);
this.add(p,BorderLayout.SOUTH);
//stream
try{
out
= new PrintWriter(socket.getOutputStream(),true);
in
= new BufferedReader(new
InputStreamReader(socket.getInputStream()));
}catch(Exception
e){
e.printStackTrace();
}
//event
b.addActionListener(new
ActionListener(){
public
void actionPerformed(ActionEvent ae){
data.addElement(t.getText());
out.println(t.getText());
}
});
new
Thread(new Runnable(){
public
void run(){
while(true){
try{
data.addElement(in.readLine());
}catch(Exception
e){
return;
}
}
}
}).start();
}
}
public MyFrame(String cs, Socket socket){
this.socket = socket;
JFrame f = new JFrame();
f.setTitle(cs + "---" +
socket.getInetAddress().getHostAddress());
f.setLocation(200,300);
f.setSize(320,200);
f.getContentPane().add(new
MyPane());
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}
import java.awt.Color;
import java.awt.Component;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.ListCellRenderer;
class MyListRender extends JLabel implements ListCellRenderer
{// 列表单元渲染器
private final Color HIGHLIGHT_COLOR = new
Color(130, 160, 220);
public MyListRender() {
this.setOpaque(true);
this.setIconTextGap(5);
}
@Override
public Component
getListCellRendererComponent(JList list, Object value,
int index,
boolean isSelected, boolean cellHasFocus) {
ListItem item = (ListItem)
value;// list.add(value);其中的value就是现在的value
this.setIcon(item.getIcon());
this.setText(item.getName());
if (isSelected) {
this.setBackground(HIGHLIGHT_COLOR);
this.setForeground(Color.WHITE);
} else {
this.setBackground(Color.WHITE);
this.setForeground(Color.BLACK);
}
return this;
}
}
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.Iterator;
import javax.swing.DefaultListModel;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ListCellRenderer;
import javax.swing.ListModel;
public class QQMain extends JFrame{
private static String myname;
private static String myip=new String();
private
Map<String,String> users=new
HashMap<String,String>();
public QQMain(){
this.add(new MyPanel());
this.setSize(230,450);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
this.setVisible(true);
}
public static void run(){
myname=JOptionPane.showInputDialog("请输入自己的名字").trim();
if(myname!=null){
if(myname.equals(""))
myname="未知名";
new
QQMain();
}
}
public
Map<String,String> getUsers(){
return users;
}
class MyPanel extends JPanel{//主窗口面板列表
private JList user_list;
private JButton button;
private DefaultListModel
listmodel;
private JScrollPane sp;
private Icon ico=new
ImageIcon("img/1.jpg");
public MyPanel(){
super();
initComponent();
}
public void
initComponent(){
this.setLayout(new
BorderLayout());
user_list=new
JList();
user_list.setCellRenderer(new
MyListRender());
user_list.setFixedCellHeight(50);
user_list.addMouseListener(new
User_listAction(user_list,users));
sp=new
JScrollPane(user_list);
listmodel=new
DefaultListModel();
user_list.setModel(listmodel);
listmodel.addElement(new
ListItem(myname,ico));
button=new
JButton("刷新");
button.addActionListener(new
ActionListener(){
@Override
public
void actionPerformed(ActionEvent arg0) {
flush();
}
});
this.add(button,BorderLayout.SOUTH);//添加刷新按钮
this.add(sp);
new
Thread(new Runnable(){//增加一个监听用户的线程
InetAddress
ip=null;
DatagramPacket
data=null;
MulticastSocket
socket=null;
String
bye="bye";
byte[]
b=null;
@Override
public
void run() {
try
{
socket=new
MulticastSocket(5000);
ip=InetAddress.getByName("224.1.1.1");
socket.joinGroup(ip);
//发送广播说我上线了
myip=InetAddress.getLocalHost().getHostAddress().trim();
socket.send(new
DatagramPacket(myname.getBytes(),myname.getBytes().length,ip,5000));
users.put(myip,myname+"
"+myip);
while(true){//时刻监听是否有用户上线
b=new
byte[50];
data=new
DatagramPacket(b,b.length);
socket.receive(data);
String
sName=new String(data.getData()).trim();