2011-08-06 44 views
1

我有一個簡單的JList示例,它從ArrayList中獲取數據,但我想在列表中的每個字符串旁邊顯示圖像。我已經寫了一個自定義的單元格渲染器(IconListRenderer),它假定顯示一個圖標和對象並排。帶圖像和文本的JList:其中文本來自ArrayList <String>

這是一個正在運行的示例。但目前沒有圖像

//Test class showing the list in a frame 
import java.awt.Color; 
import java.awt.Dimension; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.Map; 
import javax.swing.*; 
import javax.swing.border.LineBorder; 


public class Test extends JFrame{ 

    public static void main(String[] args) { 


    final JFileChooser chooser = new JFileChooser(); 
    JButton button = new JButton(); 
    button.setText("Upload"); 
    JFrame frame = new JFrame("My Frame"); 
    JList list = new JList(); 
    Map<Object, ImageIcon> icons = new HashMap<Object, ImageIcon>(); 
    list.setBorder(new LineBorder(Color.BLACK)); 

    ImageIcon icon = new ImageIcon("/Images/400px-Greek_uc_sigma.png"); 

    ArrayList<String> arrayList = new ArrayList<String>(); 

    icons.put("Name", icon); 

    //populate the arrayList for testing 
    arrayList.add("Smith"); 
    arrayList.add("John"); 
    arrayList.add("Bob"); 
    arrayList.add("Kim"); 

    frame.setSize(new Dimension(400, 400)); 
    //set the list data 
    list.setListData(arrayList.toArray()); 
    final JFrame imageFrame = new JFrame(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 


    list.setCellRenderer(new IconListRenderer(icons)); 
    frame.add(list); 
    frame.setVisible(true); 
    frame.repaint(); 
} 



} 

// IconListRenderer類

import java.awt.Component; 
import java.util.Map; 
import javax.swing.DefaultListCellRenderer; 
import javax.swing.Icon; 
import javax.swing.ImageIcon; 
import javax.swing.JLabel; 
import javax.swing.JList; 


public class IconListRenderer 
          extends DefaultListCellRenderer { 

private Map<Object, ImageIcon> icons = null; 

public IconListRenderer(Map<Object, ImageIcon> icons) { 
    this.icons = icons; 
} 

@Override 
public Component getListCellRendererComponent(
    JList list, Object value, int index, 
    boolean isSelected, boolean cellHasFocus) { 

    // Get the renderer component from parent class 

    JLabel label = 
     (JLabel) super.getListCellRendererComponent(list, 
      value, index, isSelected, cellHasFocus); 

    // Get icon to use for the list item value 

    Icon icon = icons.get(value); 

    // Set icon to display for value 

    label.setIcon(icon); 
    return label; 
} 
    } 

的列表顯示了?

+1

怎麼看這個作品。您可以發佈SSCCE並在幾分鐘內獲得答案。一週前你問同樣的問題(http://stackoverflow.com/questions/6884973/displaying-an-imageicon-in-a-jlist-that-uses-a-different-object-to-load-the-jlist )。那麼我可以給你答案,但你拒絕發佈SSCCE,所以我拒絕回答。 – camickr

+0

好吧。我並沒有拒絕搭建SSCCE,只是因爲我沒有完全知道如何在沒有發佈大量代碼的情況下製作一個小例子。 – Warz

+0

這就是我關於SSCCE的觀點。如果你不知道如何簡化代碼,那麼你就不會真正理解你所問的問題。正如你現在看到的,StudentListener類與問題完全無關,如果你看錯了地方,你不能解決問題。現在你知道如何創建一個SSCCE,我希望我們將在未來看到更多:) – camickr

回答

2

這不是真正令人吃驚:

  • 您使用JList的項目值作爲一鍵搞定從圖標地圖圖標;
  • 圖標地圖包含了一個關鍵:「姓名」
  • JList中包含「史密斯」,「約翰」,「鮑勃」和「金」,但沒有「名稱」
+0

好吧,我將它添加到我的列表中,現在圖標確實顯示出來。你知道如何設置列表中顯示的圖標的大小。 – Warz

+0

圖標的大小是基礎png圖像的大小。如果圖片太大,請減少圖片。 –