Posted on 2013-07-22 17:31
TWaver 閱讀(1596)
評論(3) 編輯 收藏
在
讓JTextField添加“自動完成”功能 一文中收到了許多user 的反饋,其中有user提到需要能夠在下拉列表中同時顯示文字和圖片。要實現(xiàn)下拉列表的這種功能,不用太難,給ComboBox設(shè)置一個Renderer 即可,ComboBox的Renderer默認是一個JLabel,而JLabel 本身就有設(shè)置Icon的功能,所以直接用默認的Renderer,并設(shè)置上圖片即可,代碼如下:
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 });
在上面的代碼中,通過文字去查找對應(yīng)的圖片,并設(shè)置Renderer 的Icon,其中g(shù)etImageIcon方法如下,緩存了圖片資源,這樣不用每次刷新的時候去每次生成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