JList: mostrar otra cosa que no sea almacenada

Tengo un componente JList y me gustaría almacenar rutas de las imágenes pero mostrar el nombre de la imagen, no la ruta. Tengo un código para presionar el botón Abrir archivo así:

 public void openButtonActionPerformed() {       

    int returnVal = fc.showDialog(null, "Open");

     if (returnVal == JFileChooser.APPROVE_OPTION) { 
           file = fc.getSelectedFile();
     }
    jList1.setCellRenderer(new JavaRenderer());
}

Y:

class JavaRenderer extends DefaultListCellRenderer {

public JavaRenderer(){
    //setOpaque(true);
}
 public File file;  

 public Component getListCellRendererComponent(JList list,
                                            Object value,
                                            int index,
                                            boolean isSelected,
                                            boolean hasFocus) {

if (value instanceof File) {
  File file = (file) value;

     return super.getListCellRendererComponent(list, file.getName(), index, isSelected, hasFocus);
}else {
     return super.getListCellRendererComponent(list, value, index, isSelected, hasFocus);
}
}
}

Pero todavía no funciona. ¿Me puede ayudar con eso?

preguntado el 22 de mayo de 12 a las 19:05

4 Respuestas

Puede usar el jList.setCellRenderer() por donde pasas new DefaultListCellRenderer() con método anulado

getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus)

value - es un objeto que inserta en JList, por lo que puede almacenarlo pero mostrar otra etiqueta:

if (value instanceof File) {
   File file = (File) value;
   return super.getListCellRendererComponent(list, file.getName(), index, isSelected, cellHasFocus);
} else {
   return super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
}

contestado el 23 de mayo de 12 a las 13:05

Edité mi publicación debido a tus pistas. No funciona y sé que el error es estúpido, pero no puedo encontrarlo. ¿Me puede ayudar con eso? - Doszi89

Necesitas llamar jList1.setCellRenderer(new JavaRenderer()); solo una vez, donde inicializa su jList. Luego debe agregar Archivo a jList usando listModel. Ver agregar elementos a jList - alaster

Gracias, en realidad el problema estaba en File file = (file) value; porque lo copié sin pensar y debería haber Archivo en lugar de archivo. Gracias por su ayuda y paciencia para principiantes :) - Doszi89

Necesitas escribir un ListModel por su cuenta, donde almacena List<File> internamente y devuelve fileName de getElementAt(int index) método.

contestado el 22 de mayo de 12 a las 19:05

Puede cambiar la forma en que su contenido se representa en JList creando su propio ListCellRenderer. (Mira esto: http://docs.oracle.com/javase/1.4.2/docs/api/javax/swing/ListCellRenderer.html)

contestado el 22 de mayo de 12 a las 19:05

Además de las respuestas proporcionadas aquí hay otra forma. Puede envolver el objeto File en su propia clase File. Luego, sobrecargue el método toString() para devolver el nombre del archivo.

class CustomFile extends File{
    public CustomFile(File f){super(f.getAbsolutePath());}
    public String toString(){return getName();}
}

contestado el 22 de mayo de 12 a las 19:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.