从JList检索JLabel

时间:2015-08-17 10:21:15

标签: java swing icons jlabel jlist

我有一个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实例的行中获取一个图标?

2 个答案:

答案 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(...);