怎么了?
我在项目中创建了一个无法检索元素的jList。我知道jList只接受对象,但是我在我的列表中添加了Strings,因为当我添加“Discipline”对象时,我看到类似“ Discipline {id = 21,name = DisciplineName} “在我看来。所以,我正在添加字符串而不是对象。
以下是我的代码:
ArrayList<Discipline> query = myController.select();
for (Discipline temp : query){
model.addElement(temp.getNome());
}
当我在一个元素中获得双击的索引时,我尝试检索我的String以进行查询并知道这个规则是什么。但是我收到了一些错误,看看我已经尝试了什么:
Object discipline = lista1.get(index);
// Error: local variable lista1 is accessed from within inner class; needs to be declared final
String nameDiscipline = (String) lista1.get(index);
// Error: local variable lista1 is accessed from within inner class; needs to be declared final
我真的不知道“最终”是什么意思,但我该怎么做才能解决这个问题呢?我想到的一件事是:
答案 0 :(得分:3)
是的,添加Discipline对象。快速解决方法是更改Discipline的toString方法,但更好的解决方法是创建一个ListCellRenderer,以一个漂亮的String显示每个Discipline的数据。
以下是我在我的项目中使用的两个ListCellRenderers,用于将我的JList中显示的项目从文本更改为ImageIcon:
private class ImgListCellRenderer extends DefaultListCellRenderer {
@Override
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
if (value != null) {
BufferedImage img = ((SimpleTnWrapper) value).getTnImage();
value = new ImageIcon(img); // *** change value parameter to an ImageIcon
}
return super.getListCellRendererComponent(list, value, index,
isSelected, cellHasFocus);
}
}
private class NonImgCellRenderer extends DefaultListCellRenderer {
@Override
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
// all this does is use the item held by the list, here value
// to extract a String that I want to display
if (value != null) {
SimpleTnWrapper simpleTn = (SimpleTnWrapper) value;
String displayString = simpleTn.getImgHref().getImgHref();
displayString = displayString.substring(displayString.lastIndexOf("/") + 1);
value = displayString; // change the value parameter to the String ******
}
return super.getListCellRendererComponent(list, value, index,
isSelected, cellHasFocus);
}
}
他们被声明如下:
private ListCellRenderer imgRenderer = new ImgListCellRenderer();
private ListCellRenderer nonImgRenderer = new NonImgCellRenderer();
我这样使用它们:
imgList.setCellRenderer(imgRenderer);
DefaultListCellRenderer非常强大,并且知道如何正确显示String或ImageIcon(因为它基于JLabel)。