Ya no busques más en internet porque llegaste al lugar necesario, contamos con la solución que deseas y sin complicarte.
Solución:
La respuesta breve a su pregunta es que “opaco” se define en inglés como completamente no transparente. Por lo tanto, un componente opaco es aquel que pinta todo su rectángulo, y cada píxel no es translúcido en ningún grado.
Sin embargo, la API de opacidad del componente Swing es una de esas API mal diseñadas y, por lo tanto, a menudo mal utilizadas.
Lo que es importante entender es que isOpaque
es un contrato entre el sistema Swing y un componente particular. si regresa true, el componente garantiza pintar de forma no translúcida cada píxel de su área rectangular. esta API debería han sido abstractos para obligar a todos los escritores de componentes a considerarlo. los isOpaque
API es utilizado por el sistema de pintura de Swing para determinar si el área cubierta por un componente determinado debe pintarse para componentes que se superponen y que están detrás de él, incluidos el contenedor y los antecesores del componente. Si un componente regresa true a esta API, el sistema Swing puede optimizar la pintura para no pintar nada en esa área hasta que se invoque el método de pintura del componente específico.
Debido a la implicación contractual de isOpaque
la API setOpaque
no debe existe, ya que en realidad es incorrecto que algo externo llame setOpaque
ya que, a su vez, la cosa externa no puede saber si el componente en cuestión la honrará (o incluso puede hacerlo). En su lugar, isOpaque debería haber sido anulado por cada componente concreto para devolver si realmente es, de hecho, opaco dadas sus propiedades actuales.
Porque el setOpaque
API lo hace existen, muchos componentes lo han implementado incorrectamente (comprensiblemente) para determinar si pintarán o no su “fondo” (por ejemplo, JLabel y JPanel se llenan con su color de fondo). El efecto de esto es crear una impresión con usuarios de la API para pensar que setOpaque
determina si ese fondo debe pintarse o no, pero no lo hace.
Además, si, por ejemplo, desea pintar un JLabel con un fondo translúcido, debe establecer un color de fondo con un valor alfa y hacer setOpaque(true)
pero en realidad no es opaco – es translúcido; los componentes detrás de él aún necesitan pintarse para que el componente se represente correctamente.
Este problema se expuso de manera significativa con el nuevo Nimbus Look & Feel de Java 6. Hay numerosos informes de errores relacionados con componentes transparentes presentados contra Nimbus (consulte la pregunta de desbordamiento de pila Java Nimbus LAF con campos de texto transparentes). La respuesta del equipo de desarrollo de Nimbus es esta:
Esto es un problema [in] el diseño original de Swing y cómo ha sido confuso durante años. El problema es setOpaque(false) ha tenido un efecto secundario en [existing] LAFs que es eso de ocultar el fondo que en realidad no es lo que es [meant] por. Está [meant] decir que el componente puede tener partes transparentes y [Swing] debe pintar el componente principal detrás de él.
Entonces, en resumen, no debes usar setOpaque
. Si lo usa, tenga en cuenta que la combinación de algunos Look & Feels y algunos componentes pueden hacer cosas “sorprendentes”. Y, al final, en realidad no hay una respuesta correcta.