javax.swing.JComboBox

Es un componente que contiene una lista de objetos. Inicialmente solo muestra uno, y al seleccionarlo nos muestra los demás objetos con una barra de desplazamiento si se excede el límite de objetos que puede mostrar.

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 el comboBox y una serie de operaciones que podemos realizar sobre los objetos, como insertar, eliminar, etc.... Existen clases ya definidas para realizar este trabajo como DefaultComboBoxModel.

Algunas propiedades mostradas en Netbeans son:
  • maximumRowCount: Máximo número de filas a mostrar al seleccionarlo.
  • model: Modelo que usa el componente para mostrar datos.
  • editable: Si true, el usuario puede introducir valores.

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

Cargar una lista de objetos en un comboBox:
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);
        
// Cargar datos en el modelo
DefaultComboBoxModel model = new DefaultComboBoxModel(colores.toArray());
this.comboColor.setModel(model);


Al cargar objetos en el comboBox el texto que se muestra es el que devuelve el método toString() del objeto, pero algunas veces los objetos que cargamos en el comboBox no son clases creadas por nosotros o no se puede modificar este método. Para mostrar un texto o imagen personalizado, inicializamos el componente con el siguiente código:
this.comboColor.setRenderer(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;

    }

            

});


Clase  DefaultListCellRenderer:
public class DefaultListCellRenderer extends JLabel
    implements ListCellRenderer



La interfaz ListCellRendered:
public interface ListCellRenderer{
    Component getListCellRendererComponent(
        JList list,
        E value,
        int index,
        boolean isSelected,
        boolean cellHasFocus);
}

El método setRenderer() del comboBox 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.


Descargar el código del proyecto.

Comentarios

Entradas populares de este blog

Java. Texto de colores en la consola

javax.swing.JPasswordField

javax.swing.JList