javax.swing.JList

JList es un componente que contiene una lista de objetos. Es parecido a JComboBox, pero posee algunas diferencias:
  • Se utilizan cuando se quiere ver varios elementos de la lista a la vez.
  • Se puede seleccionar uno o varios elementos a la vez.

Para trabajar con este componente es necesario establecerle un modelo (Model). Una clase modelo es la que contiene los datos a representar en la interfaz gráfica. Los cambios en el objeto modelo actualizan automáticamente los cambios en la interfaz gráfica. Básicamente un modelo contiene una lista de objetos a mostrar en la lista y una serie de operaciones que podemos realizar sobre los objetos, como insertar, eliminar, etc.... Existen clases ya definidas para realizar este trabajo como DefaultListModel.

Las propiedades importantes en Netbeans son:
  • model: Modelo que usa el componente para mostrar datos.
  • selectionMode: El modo de selección, simple o múltiple.

Propiedades de JList en Netbeans:



Métodos más usados de DefaultListModel:
  • addElement(E anObject): Añadir un objeto al final de la lista.
  • insertElementAt(E anObject, int index): Insertar un objeto en una posición determinada de la lista.
  • E getElementAt(int index): Obtener el elemento de la posición indicada.
  • removeElementAt(int index): Eliminar de la lista el elemento de la posición indicada.
  • removeElement(Object anObject): Eliminar el objeto de la lista.

Cargar una lista con objetos Color:
List<Color> colores = new ArrayList<>();
colores.add(Color.black);
colores.add(Color.blue);
colores.add(Color.cyan);
colores.add(Color.darkGray);
colores.add(Color.gray);
colores.add(Color.green);
colores.add(Color.magenta);
colores.add(Color.orange);
colores.add(Color.red);
colores.add(Color.white);
        
DefaultListModel model = new DefaultListModel();
for (Color color : colores) {
    model.addElement(color);
}
this.list.setModel(model);


El método setCellRenderer() de la lista acepta la interfaz ListCellRenderer, se puede crear una clase que implemente esta interfaz o utilizar DefaultListCellRenderer que ya tiene el funcionamiento básico. Creamos una clase anónima que sobrescriba el método de la interfaz, llamamos al método padre para realizar la funcionalidad básica y modificamos los datos en nuestro método sobrescrito. De esta forma nos centramos solo en los datos que queremos mostrar y no debemos preocuparnos de cambiar el color del seleccionado, etc...

Ejemplo:
this.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);
        if (value instanceof Color) {
            Color color = (Color) value;
            label.setBackground(color);// Color de fondo del label
            String txt = "r="+color.getRed()+" g="+color.getGreen()+" b="+color.getBlue();
            label.setText(txt);// Texto del label
        }
                
        return label;
    }
            
});

Obtener los objetos seleccionados de una lista:
List selectedValues = this.list.getSelectedValuesList();


Cuidado al eliminar varios objetos de lista consecutivamente:
  1. Si se utiliza public int[] getSelectedIndices() para obtener todos los indices a eliminar.
  2. En un for se van eliminando uno a uno mediante public E remove(int index).

El resultado será erróneo, ya que al eliminar un objeto model reorganiza los índices.

Una forma de eliminar:
DefaultListModel model = (DefaultListModel) this.list.getModel();
List selectedValues = this.list.getSelectedValuesList();
for (Object selectedValue : selectedValues) {
    model.removeElement(selectedValue);
}

Si el objeto es de una clase de tipo entidad y tiene un campo id (clave primaria) que es el que diferencia entre distintas filas en la base de datos, sobrescribe el método public boolean equals(Object obj) para que al utilizar el método public boolean removeElement(Object obj) funcione correctamente.

Código del proyecto.

Comentarios

  1. Muchas gracias por compartir tus conocimientos, me han sido de gran ayuda

    ResponderEliminar

Publicar un comentario

Entradas populares de este blog

Java. Texto de colores en la consola

javax.swing.JPasswordField