Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java jList-添加元素并显示字符串?_Java_Swing_List_Compiler Errors_Jlist - Fatal编程技术网

Java jList-添加元素并显示字符串?

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

怎么了

我在项目上创建了一个无法检索元素的jList。我知道jList只接受对象,但我在列表中添加了字符串,因为当我添加“规程”对象时,我在视图中看到类似“规程{id=21,name=pricidename}”。所以,我添加的是字符串,而不是对象

以下是我的代码:

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);