2015-08-17 18 views
0

我有一個包含的JLabel與圖標JList的實例:檢索JLabel,它的JList

JList list = new JList(); 
list.setModel(model); 
list.setCellRenderer(new DefaultListCellRenderer(){ 
    @Override 
    public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) { 
     JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); 
     label.setIcon(icon); 
     return label; 
    } 
    }); 

它工作得很好,但我想不出我如何編程可以檢索從JLabel的這個圖標。 我想,也許它可能與模型的援助,這樣做的:

DefaultListModel model = list.getModel(); 

或單元格渲染器:

DefaultListCellRenderer model = list.getCellRenderer(); 

但尚未他們都沒有檢索標籤適當的方法,更不用說圖標。我在尋求你的幫助:是否有可能從JList實例的行中獲取圖標?

+0

什麼是問題?你問'JLabel.getIcon()'? –

+1

@馬丁弗蘭克是的,但我怎麼能從JList的第一個地方檢索JLabel? – void

+0

爲了更好地提供幫助,請張貼[MCVE]或[簡短,獨立,正確的示例](http://www.sscce.org/)。 –

回答

1

,如果你不知道你的名單是如何呈現的,你必須重新呈現在你自己和retrive圖標...

int index = 0; //the index of the desired list entry 
boolean isSelected = false; //icons my differ if they are selected 
boolean cellHasFocus = false; //or have focus 
Object value = list.getModel().getElementAt(index); //your 'string' or whatever is in your List 
Component comp = list.getCellRenderer().getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); 
if (comp instanceof JLabel){ 
    JLabel pan = (JLabel) comp; 
    Icon icon = pan.getIcon(); 

} 
1

有一個包含的JLabel與JList的實例圖標:

你不明白模型和渲染器的概念。

You JList不包含JLabels。 JList的渲染器是恰好顯示一個圖標的JLabel。您的渲染器是錯誤的,因爲您正在爲列表中的每一行顯示相同的圖標。這不是使用JList的方式。

而是將數據添加到JList的ListModel。 JList的默認渲染器能夠顯示字符串數據或圖標數據。因此,所有你需要做的就是添加一個圖標到模型和JList中顯示的圖標:

Icon[] items = 
{ 
    new ImageIcon("copy16.gif"), 
    new ImageIcon("about16.gif"), 
    new ImageIcon("add16.gif") 
}; 

JList<Icon> list = new JList<Icon>(items); 

然後,如果你要訪問的數據列表中的任何給定行,你可以使用:

Icon icon = list.getModel().getElementAt(...);