Como cambiar el boton de un JComboBox en Java

De ChuWiki

Para cambiar el botón o los colores del botón de un JComboBox en java hay que crear una clase que herede de BasicComboBoxUI y sobreescribir el método createArrowButton().

Veamos los detalles.

Tienes el código completo de este ejemplo en JComboBoxRender.java. Ahí también se cambian los colores del JComboBox. Salvo que tengas interés, ignora toda la parte de heredar y cambiar el BasicComboBoxRenderer. Cualquier duda de este tutorial o de java en general suelo atender en el foro de java, python y otros.

Crear el botón para el JComboBox[editar]

El botón del JComboBox no es más que un JButton normal, así que podemos instanciar uno cualquiera, a nuestro gusto tanto en colores como icono, y usarlo. En este ejemplo, sin embargo, usaremos directamente la clase BasicArrowButton que es el botón por defecto del JComboBox. Eso sí, le daremos nuestros propios colores. El codigo para crear este botón es

            // Usamos BasicArrowButton que es el de defecto, poniéndole los colores que nos apetezcan.
            // Pero puedes crear aquí tu propio botón con el estilo que quieras.
            return new BasicArrowButton(SwingConstants.SOUTH, Color.YELLOW, Color.ORANGE, Color.RED, Color.WHITE);

Los parámetros son:

  • Dirección de la flecha. Por defecto es hacia abajo SwingConstants.SOUTH.
  • Color de background, es decir, el color del botón. Le hemos puesto Color.YELLOW
  • Color de sombra, se usa en los bordes del botón para conseguir el efecto relieve. Le hemos puesto Color.ORANGE
  • Color de sombra oscura, se usa en los bordes del botón para conseguir el efecto relieve. Le hemos puesto Çolor.RED
  • Color brillante, se usa en los bordes del botón para conseguir el efecto relieve. Le hemos puesto Color.WHITE

La siguiente imagen muestra al botón ampliado, para que veas dónde van los colores

Crear nuestro propio BasicComboBoxUI[editar]

Ahora que sabemos crear el botón, ponemos este código dentro de una clase que herede de BasicComboBoxUI, sobreescribiendo el método createArrowButton()

    public static class MyArrow extends BasicComboBoxUI {
        @Override
        protected JButton createArrowButton() {
            // Usamos BasicArrowButton que es el de defecto, poniéndole los colores que nos apetezcan.
            // Pero puedes crear aquí tu propio botón con el estilo que quieras.
            return new BasicArrowButton(SwingConstants.SOUTH, Color.YELLOW, Color.ORANGE, Color.RED, Color.WHITE);
        }
    }

Nada especilamente reseñable. Sólo fíjate que el método debe devolver un JButton, así que no estamos obligados a que sea un BasicArrowButton, podemos crear y modificar cualquier JButton a nuestro gusto.

Pasarle al JComboBox nuestro BasicComboBoxUI[editar]

Ahora solo queda crear el JComboBox y pasarle nuestro BasicComboBoxUI. El siguiente código muestra como hacerlo

        JComboBox<String> combo = new JComboBox<>();

        // Cambiamos la flecha
        combo.setUI(new MyArrow());

y esto es todo. Ya podemos usar el JComboBox de la forma habitual.

Cambiar los colores de los botones de todos los JComboBox[editar]

Si no queremos cambiar los colores del botón de un soloJComboBox específico, podemos cambiarlos todos de golpe poniéndolos de esta forma

UIManager.put("comboBox.buttonHighlight",Color.WHITE);
UIManager.put("comboBox.buttonDarkShadow",Color.RED);
UIManager.put("comboBox.buttonShadow",Color.ORANGE);
UIManager.put("comboBox.buttonDarkShadow",Color.RED);
UIManager.put("comboBox.buttonBackground",Color.RED);

Basta poner este código una sola vez antes de liarnos a construir o visualizar ventanas.