📄 好友列表.java
字号:
//好友列表.java
/**
@author Joedan hongguangming@sohu.com
*/
import java.awt.event.*;
import javax.swing.*;
import myevent.*;
import java.awt.*;
import java.util.*;
/**
该类是实现程序界面中好类列表的类
继承自Jlist,加入显示多种状态的功能,能区别在线,下线,选中,有新消息四种状态
能发出鼠标双击事件的通知
*/
class 好友列表 extends JList
{
好友列表()
{
super();
setModel(Model);
// 设置独特的渲染方式,能区别在线,不在线,被选三种状态
setCellRenderer(new MyCellRenderer());
// 设置鼠标双击通知机制
addMouseListener(new MouseAdapter()
{
列表项 tmp;
public void mouseClicked(MouseEvent e)
{
if (e.getClickCount() == 2 && 监视器 != null)
{
tmp = (列表项)getSelectedValue();
tmp.hasNewMsg = false;//下一步将对新消息进行处理,所以在这里取消新消息标志
监视器.好友列表鼠标双击处理(tmp.id);
}
}
});
new java.util.Timer(true).scheduleAtFixedRate(new TimerTask()//加入定时渲染,为了对好友的新消息进行提示
{
public void run()
{
Model.refresh(1, Model.getSize());
}
}, 0, 800
);
}
public void 添加事件监视器(好友列表事件监视器 _监视器)
{
监视器 = _监视器;
}
public void 添加好友(String id, String name)
{
列表.put(id, new 列表项(id, name));
Model.addElement(列表.get(id));
}
public void 好友上线(String id)
{
列表项 tmp = (列表项)列表.get(id);
tmp.online = true;
int iTmp = Model.indexOf(tmp);
Model.refresh(iTmp, iTmp);
}
public void 新消息(String id)
{
((列表项)列表.get(id)).hasNewMsg = true;//为对应项加新消息标志,渲染时分别对待
}
public void 好友下线(String id)
{
列表项 tmp = (列表项)列表.get(id);
tmp.online = false;
int iTmp = Model.indexOf(tmp);
Model.refresh(iTmp, iTmp);
}
public void 删除好友(String id)
{
Model.removeElement(列表.get(id));
列表.remove(id);
}
public void 清除好友列表()
{
Model.clear();
列表.clear();
}
private class 列表项
{
列表项(String _id, String _name)
{
id = _id;
name = _name;
}
String id,//
name;//
boolean online = false;
boolean hasNewMsg = false;
}
private Color clrOnLine = Color.blue,//在线时字的颜色
clrOffLine = Color.gray,//不在线时字的颜色
clrSelected = Color.orange;//选中时字的颜色
private int size1 = 20,//正常字体
size2 = 22,//新消息提示字体
count = 0;//新消息提示时,字体选择计数器
private Font font1 = new Font("system", 0, size1),//正常字体
font2 = new Font("system", 0, size2);//提示字体
private int iNum = 4;
private Color [] clrNewMsg = {Color.red, Color.orange, Color.blue, Color.gray};
private class MyCellRenderer extends JLabel implements ListCellRenderer
{
public Component getListCellRendererComponent(
JList list,
Object value,// value to display
int index,// cell index
boolean isSelected,// is the cell selected
boolean cellHasFocus)// the list and the cell have the focus
{
列表项 tmp = (列表项)value;
setText(tmp.name);
if (tmp.online)
setForeground(clrOnLine);
else
setForeground(clrOffLine);
if (isSelected)
setForeground(clrSelected);
if (tmp.hasNewMsg)
setForeground(clrNewMsg[(int)(iNum * Math.random())]);
/*等待改进,我连这个方法什么时候被调用都不懂,观察它被调用的情况,有很多不同的情况,晕
if (tmp.hasNewMsg)
System.out.println(tmp.name);
if (tmp.hasNewMsg && (count = ++count % 2) == 1)//如果有新消息,提示
setFont(font2);
else
setFont(font1);
*/
setFont(font1);
setBackground(Color.white);
setOpaque(true);//??用途
return this;
}
}
private class MyListModel extends DefaultListModel
{
public void refresh(int frm, int to)
{
fireContentsChanged(this, frm, to);
}
}
private MyListModel Model = new MyListModel();
private 好友列表事件监视器 监视器;
private Hashtable 列表 = new Hashtable();//存放id和“列表项”类对象的对照
public static void main(String args[])
{
JFrame win = new JFrame("好友列表测试");
final 好友列表 list = new 好友列表();
list.添加事件监视器(new 好友列表事件监视器()
{
public void 好友列表鼠标双击处理(String ID)
{
System.out.println(ID + "is double clicked");
}
}
);
JButton btn = new JButton("上线");
btn.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
list.好友上线("413");
}
}
);
list.添加好友("413", "Joe");
list.添加好友("10000", "test");
list.新消息("413");
list.新消息("10000");
win.add(list, "Center");
win.add(btn, "South");
win.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
win.setSize(400, 300);
win.setVisible(true);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -