Java swing实现类似于vc中的CListCtrl的图标控件

最近在做一个程序,要用到类似于vc中的CListCtrl控件功能,和QQ好友列表的那种图标一样,选定图标后会变蓝,API看了很久都没有发现比较有用的信息,只看到一个JLabel和那个比较相似,但是JLabel直接加到JList里面的话会出现不能选定,也就是选定后不变蓝的情况,而后在网络上得到的信息实现ListCellRenderer接口,然后对选定的JLabel设定背景颜色,而为了实现绘制JLabel的背景颜色,你不得不重写一个类继承JLabel并且重写paintComponent方法进行背景颜色的绘制,

效果图如下:
Alt text

具体实现如下:
第一个类:继承Jlabel重写paintComponent方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import java.awt.Color;
import java.awt.FontMetrics;
import java.awt.Graphics;
import javax.swing.Icon;
import javax.swing.JLabel;
@SuppressWarnings("serial")
public class JLabelView extends JLabel
{
@Override
/**
* 我们只要重写这个JLabel的paintComponent方法来绘制我们选定时候的背景颜色
*/
protected void paintComponent(Graphics g)
{
FontMetrics fontMetrics = g.getFontMetrics(this.getFont()); //FontMetrics 对象用来获取JLabel中字体的像素宽度
int stringWidth = fontMetrics.stringWidth(this.getText()); //获取JLabel中字体的像素宽度
int x,y,width,heigth; //用来保存背景的边距
Icon icon = getIcon();
y = 0;
width = stringWidth+10;
if(icon==null)
{
x = 0;
heigth = fontMetrics.getHeight(); //字体高度
}else
{
x = icon.getIconWidth();
heigth = icon.getIconHeight(); //图标高度
}
Color oldColor = g.getColor();
g.setColor(getBackground());
g.fillRect(x, y, width, heigth);
g.setColor(oldColor);
super.paintComponent(g);
}
/**
* 以下方法可以不用看,都是实现父类的构造方法
*/
public JLabelView()
{
super();
// TODO Auto-generated constructor stub
}
public JLabelView(Icon image, int horizontalAlignment)
{
super(image, horizontalAlignment);
// TODO Auto-generated constructor stub
}
public JLabelView(Icon image)
{
super(image);
// TODO Auto-generated constructor stub
}
public JLabelView(String text, Icon icon, int horizontalAlignment)
{
super(text, icon, horizontalAlignment);
// TODO Auto-generated constructor stub
}
public JLabelView(String text, int horizontalAlignment)
{
super(text, horizontalAlignment);
// TODO Auto-generated constructor stub
}
public JLabelView(String text)
{
super(text);
// TODO Auto-generated constructor stub
}
}

第二个类:实现ListCellRenderer 接口,对选定的对象进行背景色的设定

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import java.awt.Color;
import java.awt.Component;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.ListCellRenderer;
public class JLabelViewRender implements ListCellRenderer
{
/**
* 实现ListCellRenderer接口,对当JLabel被选定的时候设置其的背景颜色
*/
@Override
public Component getListCellRendererComponent(JList list, Object value,int index, boolean isSelected, boolean cellHasFocus)
{
JLabel iconLabel = (JLabel)value;
if(isSelected)
iconLabel.setBackground(new Color(889580));//被选定时候背景颜色为绿色
else
iconLabel.setBackground(Color.white);//未被选定时颜色为白色
return iconLabel;
}
}

测试类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class Test extends JFrame
{
private JList jList;
public Test()
{
JLabelView jLabelView [] = new JLabelView[10];
for(int i=0;i<10;i++)
{
jLabelView[i] = new JLabelView("用户"+i, new ImageIcon("res/01.jpg"), JLabelView.LEFT);
}
jList = new JList(jLabelView); //将jLabelView放到JList中进行显示
jList.setCellRenderer(new JLabelViewRender()); //设定jList的渲染器,也就是设定选中处理背景颜色
add(jList);
setSize(250, 600);
setVisible(true);
}
/**
* @param args
*/
public static void main(String[] args)
{
new Test();
}
}