Cambiar colores de un JComboBox

En el foro de java preguntaron solog java swingbre cómo cambiar los colores de un JComboBox. El asunto no era sencillo, buscando por google, encontré este enlace que es lo que respondí en el foro. Sin embargo no me convenció, me parecía demasiado complejo. Sobre todo no me gustaba el comentario «Es obligatorio que el Editable sea verdadero, de lo contrario, las modificaciones del renderizador y del editor no funcionarán».

Así que me puse a hacer pruebas por mi cuenta a ver si existía una forma de cambiar los colores de manera más sencilla. Y la hay, no fue fácil, pero conseguí hacerlo … con pegas, al final tuve que tirar del editable.

La parte del desplegable es fácil, es similar a un JList normal. De hecho, se cambia definiendo tu propio BasicComboBoxRenderer y sobreescribiendo un método igual que el de un ListCellRenderer

Pero el valor visible cuando el menú desplegable está oculto, eso es otro cantar. Casi todos los intentos y búsquedas en google fracasaban o me daban soluciones complejas, como la que quería evitar.

Pero enconré una forma, no fue fácil porque al final tuve que ir al código java, localizar dónde se hacía el dibujo de ese valor seleccionado y mirar la lógica. La clase  que hace el dibujo es BasicComboBoxUI propia de java y el método es paintCurrentValue(). Te pego aquí una foto con el trozo del código de interés

codigo de BasicComboBoxUI

La lógica de todo esto:

  1. Si el JComboBox tiene el foco y el desplegable no es visible, se usa el render que hayamos definido. Fíjate que se le pasa como posción en la lista un -1. Así que este caso podemos contemplarlo en el render que hayamos hecho para el desplegable.
  2. En caso contrario, lo mismo pero … se machaca el color del background con el valor por defecto del look and feel que tengamos. Así que en caso de que el JComboBox no tenga el foco o el desplegable esté visible, no nos hará ni caso al color de background que pongamos en el render. Vete tú a saber por qué han tomado esta decisión al hacer el código.
  3. En el punto 1 dijimos que no tendriamos problemas con el render. Pues si los tenemos, si vas al siguiente bloque de código, se vuelve a repetir la condición de si el JComboBox tiene el foco y el desplegable no es visible para cambiar el color usando los colores de selección de listBox, es decir, el Jlist. Así que en nuestro render, si nos pasan -1 como posición, debemos cambiar los colores de selección del JList que nos pasan como parámetro.
  4. Y el else de ese bloque, es decir, si el JComboBox no tiene el foco o el desplegable es visible, nos metemos en nuevo if-else, en función de si el combo esta enabled o disabled.
    1. En el primer caso, se usan los colores de defecto del JComboBox. Así que para este caso, tenemos que tener cambiados los colores de defecto.
    2. Y para el otro caso, combo disabled, hace una extrañas llamadas a DefaultLookup que tras mirar, no he visto forma fácil de meter mano. Acaban devolviendo colores por defecto. Así que la solución pasa por hacer una chapuza, justo la que quería evitar. Cuando deshabilitemos el combo, lo hacemos editable. El color del editor se puede cambiar fácilmente y como está deshabilitado, el usuario no podrá editar nada.

Me llama la atención lo complejo que han hecho esto los de java.

El código resultante de toda esta investigación está explicado en Cómo cambiar los colores de  un JComboBox.

 

 

Esta entrada ha sido publicada en java y etiquetada como , , , . Guarda el enlace permanente.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.