Java Nimbus LAF con campos de texto transparentes

Tengo una aplicación que utiliza JTextFields deshabilitados en varios lugares que están destinados a ser transparentes, permitiendo que el fondo se muestre en lugar del fondo normal del campo de texto.

Al ejecutar el nuevo Nimbus LAF, estos campos son opacos (a pesar de establecer setOpaque (falso)) y mi IU está rota. Es como si el LAF ignorara la propiedad opaca. Establecer un color de fondoexplícitamente es difícil en varios lugares y menos que óptimo debido a las imágenes de fondo en realidad no funciona: todavía pinta su fondo predeterminado LAF sobre la parte superior, dejando una apariencia de borde (la pantalla de bienvenida a continuación tiene el fondo establecido explícitamente para que coincida con la imagen).

¿Alguna idea sobre cómo puedo hacer que Nimbus no pinte el fondo de un JTextField?

Nota: Necesito un JTextField, en lugar de un JLabel, porque necesito el setText () seguro para subprocesos y la capacidad de ajuste.

Nota: Mi posición alternativa es continuar usando el sistema LAF, pero Nimbus se ve sustancialmente mejor.

Ver imágenes de ejemplo a continuación.

Conclusiones

Lossorpres en este comportamiento se debe a una mala interpretación de lo que debe hacer setOpaque (), del informe de errores de Nimbus:

Esto es un problema el diseño original de Swing y cómo ha sido confuso durante años. El problema es que setOpaque (falso) ha tenido un efecto secundario al salir de los LAF, que es el de ocultar el fondo, que en realidad no es para lo que está destinado. Es importante decir que el componente puede tener partes transparentes y oscilar debe pintar el componente principal detrás de él.

Es lamentable que los componentes de Nimbus también parezcan no honrar a setBackground (nulo), que de lo contrario sería la forma recomendada de detener la pintura de fondo. Establecer un fondo totalmente transparente me parece poco intuitivo.

En mi opinión, setOpaque () / isOpaque () es una opción de API pública defectuosa que debería haber sido solo:

public boolean isFullyOpaque();

Digo esto, porque isOpaque () == true es un contrato con Swing de que la subclase de componentes se encargará de pintar todo su fondo, lo que significa que el padre puede omitir pintar esa región si lo desea (lo cual es una mejora importante del rendimiento) . Algo externo no puededirectament cambiar este contrato (legítimamente), cuyo cumplimiento puede codificarse en el componente.

Así que la opacidad del componente no debería haber sido configurable usando setOpaque (). En cambio, algo como setBackground (nulo) debería hacer que muchos componentes "no tengan un fondo" y, por lo tanto, no se vuelvan completamente opacos. A modo de ejemplo, en un mundo ideal, la mayoría de los componentes deberían tener un isOpaque () que se vea así:

public boolean isOpaque() { return (background!=null); }

Respuestas a la pregunta(4)

Su respuesta a la pregunta