Java jList-添加元素并显示字符串?
怎么了 我在项目上创建了一个无法检索元素的jList。我知道jList只接受对象,但我在列表中添加了字符串,因为当我添加“规程”对象时,我在视图中看到类似“规程{id=21,name=pricidename}”。所以,我添加的是字符串,而不是对象 以下是我的代码:Java jList-添加元素并显示字符串?,java,swing,list,compiler-errors,jlist,Java,Swing,List,Compiler Errors,Jlist,怎么了 我在项目上创建了一个无法检索元素的jList。我知道jList只接受对象,但我在列表中添加了字符串,因为当我添加“规程”对象时,我在视图中看到类似“规程{id=21,name=pricidename}”。所以,我添加的是字符串,而不是对象 以下是我的代码: ArrayList<Discipline> query = myController.select(); for (Discipline temp : query){ model.addElement(temp.g
ArrayList<Discipline> query = myController.select();
for (Discipline temp : query){
model.addElement(temp.getNome());
}
我真的不知道“最终”是什么意思,但我能做些什么来解决这个问题呢?我想到的一件事是:
我是否可以添加规程来代替字符串,显示给用户规程.getName()并检索规程对象?是,添加规程对象。快速修复方法是更改规程的toString方法,但更好的修复方法是创建一个ListCellRenderer,以漂亮的字符串显示每个规程的数据 以下是我在一个项目中使用的两个ListCellRenders,用于将我的JList中显示的项目从文本更改为图像图标:
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功能非常强大,知道如何正确显示字符串或图像图标(因为它基于JLabel)。如何创建ListCellRenderer,您能给我看一段代码吗?@FernandoPaladini:yep,请看一下for示例代码。+1,但@FernandoPaladini,请注意,使用自定义呈现程序会破坏JList(或JCombobox)的默认行为。也就是说,不能再通过输入渲染值的第一个字符来选择列表中的项目。默认实现为此使用toString()值。根据您的要求,这可能是一个问题,也可能不是。@camickr:true,true,但我的建议基于kleopatra/Jeanette的建议。在我看来(在她看来)
toString()
应该用于调试目的,而不是用于最终产品的显示目的。我想这可以通过使用包装器对象来解决,包装器对象的唯一目的是创建toString()
覆盖。想法?我同意,总的来说,toString()不应该用于最终产品展示。我对包装器类没有问题,包装器类存在的原因是为最终产品显示提供了一个toString()实现(Jeanette有)。我关心的是应用程序功能。GUI是为用户构建的。用户不知道一个组件使用自定义渲染器,而另一个组件不知道。我只想在使用渲染器方法时得到一个警告,它会破坏默认功能。错误消息告诉您必须执行的操作:将列表1和索引final
通常,最好通过将JList设置为类的字段来解决错误。
imgList.setCellRenderer(imgRenderer);