Posted on 2013-07-22 17:31
TWaver 阅读(1594)
评论(3) 编辑 收藏
在
让JTextField添加“自动完成”功能 一文中收到了许多user 的反馈,其中有user提到需要能够在下拉列表中同时显示文字和图片。要实现下拉列表的这种功能,不用太难,给ComboBox设置一个Renderer 即可,ComboBox的Renderer默认是一个JLabel,而JLabel 本身就有设置Icon的功能,所以直接用默认的Renderer,并设置上图片即可,代码如下:
1 cbInput.setRenderer(new DefaultListCellRenderer(){
2 public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
3 super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
4 if(value != null){
5 this.setText(value.toString());
6 String url = value.toString().replaceAll(" ", "_") + ".png";
7 ImageIcon icon = getImageIcon(url, IMAGE_ICON_CACHE);
8 if(icon != null){
9 this.setIcon(icon);
10 }
11 }
12 return this;
13 }
14 });
在上面的代码中,通过文字去查找对应的图片,并设置Renderer 的Icon,其中getImageIcon方法如下,缓存了图片资源,这样不用每次刷新的时候去每次生成ImageIcon:
1 public static ImageIcon getImageIcon(String url,Map IMAGE_ICON_CACHE) {
2 if (url == null) {
3 return null;
4 }
5 if (IMAGE_ICON_CACHE.get(url) == null) {
6 ImageIcon image = null;
7 InputStream in =ResourceAgent.class.getResourceAsStream(url);
8 if (in != null) {
9 try {
10 byte buffer[] = new byte[in.available()];
11 for (int i = 0, n = in.available(); i < n; i++) {
12 buffer[i] = (byte) in.read();
13 }
14 Toolkit toolkit = Toolkit.getDefaultToolkit();
15 Image img = toolkit.createImage(buffer);
16 image = new ImageIcon(img);
17 in.close();
18 } catch (IOException ex) {
19 ex.printStackTrace();
20 return null;
21 }
22 }
23 if (image == null) {
24 if (ClassLoader.getSystemResource(url) != null) {
25 image = new ImageIcon(ClassLoader.getSystemResource(url));
26 } else {
27 image = new ImageIcon(url);
28 }
29 }
30 if (image == null) {
31 System.err.println("can't load image '" + url + "'");
32 } else {
33 IMAGE_ICON_CACHE.put(url, image);
34 }
35 }
36 return (ImageIcon) IMAGE_ICON_CACHE.get(url);
37 }
38
效果如下:
全部代码:
Source Code