⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 好友列表.java

📁 用JAVA写的qq,为qq的跨平台使用提供了可能,一直都很讨厌tencent不为linux提供方便,自己写了一个qq,希望有人继续完善,我现在没空做了
💻 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 + -