setOpaque (verdadero / falso); Java

En Java2D cuando usas setOpaque, estoy un poco confundido sobre lo que hace el verdadero y el falso.

Por ejemplo, sé que en Swing Opaque significa que al pintar Swing no se pintará lo que hay detrás del componente. ¿O es esto al revés? ¿Cuál es?

Gracias

La respuesta corta a su pregunta es que “opaco” se define en inglés como completamente no transparente. Por lo tanto, un componente opaco es uno que pinta todo su rectángulo, y cada píxel no es en absoluto 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 en particular. Si devuelve verdadero, el componente garantiza pintar de forma no translúcida cada píxel de su área rectangular. Esta API debería haber sido abstracta para obligar a todos los escritores de componentes a considerarla. La API isOpaque es utilizada por el sistema de pintura de Swing para determinar si el área cubierta por un componente dado debe pintarse para los componentes que se superponen y que están detrás , incluidos el contenedor y los antepasados ​​del componente. Si un componente devuelve verdadero a esta API, el sistema Swing puede optimizar la pintura para no pintar nada en esa área hasta que invoque el método de pintura del componente específico.

Debido a la implicación contractual de isOpaque , la API setOpaque no debería existir, ya que en realidad es incorrecto que algo externo llame a setOpaque ya que, a su vez, lo externo no puede saber si el componente en cuestión lo honrará (o incluso lo puede) . En cambio, isOpaque debería haber sido anulado por cada componente concreto para devolver si realmente es, de hecho, opaco dadas sus propiedades actuales.

Como la API setOpaque existe, muchos componentes la han implementado erróneamente (bastante comprensiblemente) para determinar si van a pintar su “fondo” (por ejemplo, JLabel y JPanel rellenando con su color de fondo). El efecto de esto es crear una impresión con los usuarios de la API para pensar que setOpaque unidades setOpaque determinan si ese fondo debería pintar o no, pero no es así.

Además, si, por ejemplo, desea pintar una JLabel con fondo translúcido, necesita establecer un color de fondo con un valor alfa, y hacer setOpaque (verdadero), pero en realidad no es opaco, es translúcido ; los componentes detrás de él todavía necesitan pintar para que el componente se reproduzca correctamente.

Este problema fue expuesto de manera significativa con el nuevo Nimbus Look & Feel de Java 6. Existen numerosos informes de errores relacionados con los componentes transparentes archivados contra Nimbus (consulte la pregunta sobre desbordamiento de stack Java Nimbus LAF con campos de texto transparentes ). La respuesta del equipo de desarrollo de Nimbus es esta:

Este es un problema [en] el diseño original de Swing y cómo ha sido confuso durante años. El problema es setOpaque (falso) ha tenido un efecto secundario en las LAF [existentes] que es la de ocultar el fondo que no es realmente para lo que se [significó]. Se debe decir que el componente puede tener partes transparentes y [Swing] debería pintar el componente principal detrás de él.

Entonces, en resumen, no deberías usar setOpaque . Si lo usa, tenga en cuenta que la combinación de algunos Look & Feels y algunos componentes puede hacer cosas “sorprendentes”. Y, al final, en realidad no hay una respuesta correcta.

javadoc dice: Si es verdadero, el componente pinta cada píxel dentro de sus límites. De lo contrario, el componente puede no pintar algunos o todos sus píxeles, permitiendo que se muestren los píxeles subyacentes.

pruebe también este progtwig de ejemplo … http://www.java2s.com/Code/JavaAPI/javax.swing/JPanelsetOpaquebooleanisOpaque.htm

Creo que también se debe agregar lo siguiente:

El término opaco tiene diferentes significados en Java 2D y en Swing.

En Java 2D, la opacidad es un concepto de representación. Es una combinación de un valor alfa y el modo Composite . Es un grado en el que los colores de los píxeles que se dibujan deben mezclarse con los valores de píxeles ya presentes. Por ejemplo, dibujamos un rectángulo semitransparente sobre una forma oval existente. El óvalo es parcialmente visible. Este concepto a menudo se compara con la luz que atraviesa el vidrio o el agua.

En Swing, un componente opaco pinta cada píxel dentro de sus límites rectangulares. Un componente no opaco pinta solo un subconjunto de sus píxeles o ninguno, permitiendo que se muestren los píxeles debajo de él. La propiedad opaca se estableció por razones de eficiencia; Swing no tiene que pintar áreas detrás de componentes opacos.

Fuente: documentos de Java y clientes ricos asquerosos

package com.zetcode; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import static javax.swing.SwingConstants.CENTER; import net.miginfocom.swing.MigLayout; class DrawingPanel extends JPanel { @Override public void paintComponent(Graphics g) { super.paintComponent(g); doDrawing(g); } private void doDrawing(Graphics g) { Graphics2D g2d = (Graphics2D) g; g2d.setColor(Color.green); g2d.fillOval(20, 20, 100, 100); g2d.setColor(Color.blue); g2d.setComposite(AlphaComposite.getInstance( AlphaComposite.SRC_OVER, 0.1f)); g2d.fillRect(0, 0, 150, 150); } } class MyLabel extends JLabel { public MyLabel(String text) { super(text, null, CENTER); } @Override public boolean isOpaque() { return true; } } public class OpaqueEx2 extends JFrame { public OpaqueEx2() { initUI(); } private void initUI() { JLabel lbl1 = new JLabel("Java 2D opacity"); JLabel lbl2 = new JLabel("Swing opaque"); DrawingPanel dpanel = new DrawingPanel(); MyLabel mylbl = new MyLabel("isOpaque()"); mylbl.setBackground(Color.decode("#A9A9A9")); createLayout(lbl1, lbl2, dpanel, mylbl); setTitle("Opaque"); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } private void createLayout(JComponent... arg) { JPanel pnl = new JPanel(new MigLayout("ins 10")); pnl.add(arg[0], "w 150"); pnl.add(arg[1], "w 150, wrap"); pnl.add(arg[2], "w 150, h 150"); pnl.add(arg[3], "w 150, h 150"); add(pnl); pack(); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { OpaqueEx2 ex = new OpaqueEx2(); ex.setVisible(true); } }); } }
package com.zetcode; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import static javax.swing.SwingConstants.CENTER; import net.miginfocom.swing.MigLayout; class DrawingPanel extends JPanel { @Override public void paintComponent(Graphics g) { super.paintComponent(g); doDrawing(g); } private void doDrawing(Graphics g) { Graphics2D g2d = (Graphics2D) g; g2d.setColor(Color.green); g2d.fillOval(20, 20, 100, 100); g2d.setColor(Color.blue); g2d.setComposite(AlphaComposite.getInstance( AlphaComposite.SRC_OVER, 0.1f)); g2d.fillRect(0, 0, 150, 150); } } class MyLabel extends JLabel { public MyLabel(String text) { super(text, null, CENTER); } @Override public boolean isOpaque() { return true; } } public class OpaqueEx2 extends JFrame { public OpaqueEx2() { initUI(); } private void initUI() { JLabel lbl1 = new JLabel("Java 2D opacity"); JLabel lbl2 = new JLabel("Swing opaque"); DrawingPanel dpanel = new DrawingPanel(); MyLabel mylbl = new MyLabel("isOpaque()"); mylbl.setBackground(Color.decode("#A9A9A9")); createLayout(lbl1, lbl2, dpanel, mylbl); setTitle("Opaque"); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } private void createLayout(JComponent... arg) { JPanel pnl = new JPanel(new MigLayout("ins 10")); pnl.add(arg[0], "w 150"); pnl.add(arg[1], "w 150, wrap"); pnl.add(arg[2], "w 150, h 150"); pnl.add(arg[3], "w 150, h 150"); add(pnl); pack(); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { OpaqueEx2 ex = new OpaqueEx2(); ex.setVisible(true); } }); } } 

En el ejemplo del código, tenemos dos componentes. El componente de la izquierda es un panel que usa AlphaComposite para pintar un rectángulo altamente translúcido sobre un óvalo. El componente a la derecha es una etiqueta. Las tags no son opacas en la mayoría de los looks. isOpaque() método isOpaque() la etiqueta para establecer un fondo gris.

Opaco explicó