El documento explica cómo utilizar transparencias en Java2D para dibujar figuras geométricas. Define la clase AlphaComposite para establecer valores alfa que controlan la transparencia, y muestra código para dibujar varios rectángulos con diferentes niveles de transparencia superpuestos.
2. * Java2D ofrece una amplia gama de posibilidades para
tratamiento de imágenes y figuras geométricas en dos
dimensiones. En este capítulo se van a tratar los conceptos
relacionados con el renderizado de imágenes bidimensionales
mediante la clase Graphics2D.
* Como ya se ha comentado, el verbo renderizar es una
adaptación al español del verbo inglés render y que define
un proceso de cálculo más o menos complejo desarrollado
por un ordenador destinado a producir una imagen o
secuencia de imágenes. En otros contextos, se habla de
renderizado para definir el proceso por el cual se pretende
dibujar, en un lienzo de dos dimensiones, un entorno en tres
dimensiones formado por estructuras poligonales
tridimensionales, luces, texturas y materiales, simulando
ambientes y estructuras físicas verosímiles. También se habla
de Renderización en el contexto de procesos 2D que
requieren cálculos complejos como la edición de vídeo, la
animación o el desarrollo de efectos visuales.
*
3. import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;
import java.awt.image.*;
public class Ventana extends JFrame {
public Ventana() {
super ("Prueba de Ventana");
Container c = getContentPane();
c.setLayout(new FlowLayout());
this.setSize(250,250);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setVisible(true);
}
public static void main (String [] args) {
Ventana v = new Ventana();
}
public void paint (Graphics g) {
Rectangle2D r2 = new Rectangle2D.Float(75, 50, 100, 25);
Graphics2D g2 = (Graphics2D)g;
g2.draw(r2);
}
}
*
4. * Si se desea pintar un rectángulo mas grueso se debe tener en
cuenta el siguiente código
public void paint (Graphics g) {
Graphics2D g2 = (Graphics2D)g;
Rectangle2D r2 = new Rectangle2D.Float(75, 50, 100, 25);
Stroke pincel = new BasicStroke(4.0f, BasicStroke.CAP_ROUND,
BasicStroke.JOIN_MITER);
g2.setStroke(pincel);
g2.draw(r2);
}
* Tan sólo hay que cambiar el atributo del contexto llamado stroke o
pincel, para lo cual se suministra el método setStroke(). Una vez
definido el pincel o lápiz, tan sólo hay que invocar a draw() como
se ha hecho antes
5. * Java2D mantiene dos sistemas de coordenadas: las coordenadas de
usuario (user space) y las coordenadas de dispositivo (device
space):
Coordenadas de Usuario: constituyen un sistema de coordenadas
totalmente independiente del dispositivo final en el que se vaya a
hacer el renderizado.
* El origen de las coordenadas de usuario está situado en la esquina
superior izquierda del objeto Graphics2D: este punto sería el (0,0). A
medida que se incrementa la x (primer valor de la coordenada) habrá
un desplazamiento hacia la derecha y a medida que se incrementa la y
(segundo valor de la coordenada) habrá un desplazamiento hacia abajo.
Coordenadas de Dispositivos: constituyen un sistema de
coordenadas que sí depende del dispositivo en el cual va a
renderizarse realmente.
* Java2D define tres bloques de información necesarios para soportar la
conversión entre las coordenadas de usuario y las de dispositivo. Esta
información se representa mediante tres objetos de las clases:
GraphicsEnvironment, GraphicsDevice y GraphicsConfiguration.
*
6. * En la tabla siguiente, a modo de resumen, se muestran las
clases que intervienen en el sistema de coordenadas:
Una situación común en la práctica es la programación en un sistema
multipantalla. Java tiene tres configuraciones distintas de multipantalla, que consisten
en:
• Dos o más pantallas independientes
• Dos o más pantallas en la que una es la principal y las otras visualizan copias de lo
que aparece en la principal.
• Dos o más pantallas que forman un escritorio virtual, al que también se llama
dispositivo virtual (virtual device).
En estas tres configuraciones, cada modo de pantalla se representa con un objeto
GraphicsDevice y cada uno de ellos puede tener muchos objetos GraphicsConfiguration
asociados. Estos objetos permiten crear un objeto Frame, JFrame, Window o JWindow
según un modo de pantalla en el cual va a renderizarse.; por ejemplo, la clase JFrame
posee un constructor que admite como parámetro un objeto GraphicsConfiguration que
sirve para indicar qué configuración debe usarse en su renderizado.
7. * Si se dispone de un entorno de pantalla virtual entonces,
debido a que el sistema de coordenadas es relativo al escritorio
virtual, es necesario usar esas coordenadas virtuales al llamar
al método setLocation() cuando se quiere colocar o recolocar
un objeto de tipo Frame o Window en el escritorio. Un ejemplo
de ello es el siguiente:
JFrame f = new JFrame(GraphicsConfiguration gc);
Rectangle limites = gc.getBounds(gc);
f.setLocation (25 + bounds.x, 25 + bounds.y)
8. * En este apartado se va a implementar un ejemplo algo más
avanzado, aunque sigue siendo muy sencillo. El objetivo es
ilustrar cómo es posible utilizar transparencias en el momento
de dibujar figuras geométricas o cualquier otra cosa; en otras
palabras, cuando se dibuja una figura sobre otra, la última
dibujada no oculta a la de abajo sino que la deja entrever.
*
9. public void paint (Graphics g) {
Graphics2D g2 = (Graphics2D)g;
g2.setColor(Color.red);
Rectangle2D r1 = new Rectangle2D.Float(250.0f,50.0f,100.0f,100.0f);
g2.fill(r1);
AlphaComposite ac =
AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f);
g2.setColor(Color.green);
g2.setComposite(ac);
Rectangle2D r2 = new Rectangle2D.Float(200.0f,100.0f,100.0f,100.0f);
g2.fill(r2);
ac = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f);
g2.setColor(Color.magenta);
g2.setComposite(ac);
Rectangle2D r3 = new Rectangle2D.Float(150.0f,150.0f,100.0f,100.0f);
g2.fill(r3);
ac = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.8f);
g2.setColor(Color.yellow);
g2.setComposite(ac);
Rectangle2D r4 = new Rectangle2D.Float(100.0f,200.0f,100.0f,100.0f);
}
La línea de código en la que se define la transparencia es:
AlphaComposite ac = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f);
10. * Cuando se construye un objeto de la clase AlphaComposite (con la función estática getInstance() ya que
la clase AlphaComposite carece de constructor), puede especificarse un valor para el canal alfa. Cuando
se incorpora este objeto AlphaComposite al contexto de Graphics2D, este valor alfa extra incrementa la
* transparencia de cualquier objeto gráfico que se renderice posteriormente. El valor que pueda tener
cada objeto gráfico por sí mismo es multiplicado por el valor alfa del AlphaComposite.
* En la tabla siguiente se pueden apreciar los dos métodos para definir transparencias de la clase
AlphaComposite:
11. * Desarrolle la siguiente imagen utilizando transparencias
*