TWaver - 专注UI技术

http://twaver.servasoft.com/
posts - 171, comments - 191, trackbacks - 0, articles - 2
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理
让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] = (bytein.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

评论

# re: 让JTextField添加“自动完成”功能(续)  回复  更多评论   

2013-07-25 15:52 by 研究报告
这篇文章好简短 不过还不错

# re: 让JTextField添加“自动完成”功能(续)  回复  更多评论   

2013-07-26 17:36 by 行业报告
博主好文 讲的很不错 谢谢博主分享

# re: 让JTextField添加“自动完成”功能(续)  回复  更多评论   

2013-12-30 10:25 by 渣浆泵
要实现下拉列表的这种功能,不用太难,给ComboBox设置一个Renderer 即可

只有注册用户登录后才能发表评论。


网站导航: