我有一个JList实例,其中包含带有图标的JLabel:
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 :(得分:1)
如果你不知道你的列表是如何呈现的,你必须自己重新渲染它并重新检索图标......
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 :(得分:1)
有一个JList实例,其中包含带有图标的JLabel:
您不了解模型和渲染器的概念。
您的JList不包含JLabel。 JList的渲染器是一个恰好显示Icon的JLabel。您的渲染器错误,因为您为列表中的每一行显示相同的图标。这不是使用JList的方法。
而是将数据添加到JList的ListModel。 JList的默认渲染器能够显示字符串数据或图标数据。所以你需要做的就是在模型中添加一个Icon,JList将显示Icon:
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(...);