SlideShare una empresa de Scribd logo
2011
Api Java 2D




     Escuela Superior
   Politécnica del Litoral
  Carolina Dávila Llerena
API Java 2D
Java 2D es un API que nos sirve para dibujar gráficos. Podemos utilizar texto, y tiene
las capacidades de manejo de imágenes para los programas de Java, utilizando
extensión del AWT en Java. Cada dibujo en Java 2D puede tratarse como rellenar una
forma usando un pincel y componiendo el resultado en la pantalla.

En este paquete soporta líneas artísticas, imágenes en 2d, texto, marco, rellenos,
gradientes y todo lo necesario para desarrollar interfaces de usuarios, programas de
dibujos y editores de imágenes.

El API 2D de Java proporciona:

    Un modelo uniforme en las pantallas y las impresiones
    Una variedad de conjuntos y figuras geométricas, gráficos primitivos como lo
     son las curvas, rectángulos, eclipse.etc
    Tiene un mecanismo que permite detectar esquinas ya sea de formas,
     imágenes o texto.
    Tiene una variedad extensa de colores y permite una facilidad de manejo.
    Soporta impresiones de documentos de un nivel más complejo.




Renderizado en Java 2D

Java 2d posee un mecanismo de renderizado básico como en las otras versiones del
JDK, este sistema de dibujo controla cuando u como dibuja un programa.

Cuando se necesita mostrar un componente, automáticamente se llama al método
paint o la update que se encuentra dentro de un contexto Graphics apropiado.

El API 2D de Java presenta java.awt.Graphics2D, desciende de la clase Graphics para
proporcionar acceso a las características avanzadas de renderizado del API 2D de Java.

Para usar las características del API 2D de Java, tenemos que forzar el objeto Graphics
pasado al método de dibujo de un componente a un objeto Graphics2D.
Contexto de Renderizado de Graphics2D

A un conjunto de atributos que se asocian con un objeto se lo conoce como Renderizado.

Para poder mostrar texto, forma o imágenes podemos configurar esto llamando a uno de los
métodos de renderizado de la clase Graphics2D, como lo son draw o fill.


               El estilo de lápiz que se aplica al exterior de una forma. Este atributo stroke
               nos permite dibujar líneas con cualquier tamaño de punto y patrón de
               sombreado y aplicar finalizadores y decoraciones a la línea.




               El estilo de relleno que se aplica al interior de la forma. Este atributo paint nos
               permite rellenar formas con cólores sólidos, gradientes o patrones.




               El estilo de composición se utiliza cuando los objetos dibujados se solapan con
               objetos existentes.



               La transformación que se aplica durante el dibujado para convertir el objeto
               dibujado desde el espacio de usuario a las coordenadas de espacio del
               dispositivo. También se pueden aplicar otras transformaciones opcionales
               como la traducción, rotación escalado, recortado, a través de este atributo.



               El Clip que restringe el dibujado al área dentro de los bordes de la Shape se
               utiliza para definir el ára de recorte. Se puede usar cualquier Shape para
               definir un clip.




               La fuente se usa para convertir cadenas de texto.
Punto de Renderizado que especifican las preferencias en cuanto a velocidad y
               calidad. Por ejemplo, podemos especificar si se debería usar antialiasing, si
               está disponible.



Para configurar un atributo en el contexto de renderizado de Graphics2D, se usan los
métodos set Attribute.

      setStroke
      setPaint
      setComposite
      setTransform
      setClip
      setFont
      setRenderingHints

Cuando configuramos un atributo, se le pasa al objeto el atributo apropiado. Por
ejemplo, para cambiar el atributo paint a un relleno de gradiente azul-gris, deberíamos
construir el objeto GradientPaint y luego llamar a setPaint.

         gp = new GradientPaint(0f,0f,blue,0f,30f,green);
         g2.setPaint(gp);

Graphics2D contiene referencias a sus objetos atributos -- no son clonados. Si
modificamos un objeto atributo que forma parte del contexto Graphics2D,
necesitamos llamar al método set para notificarlo al contexto. La modificación de un
atributo de un objeto durante el renderizado puede causar comportamientos
impredecibles.

 Métodos de renderizado de Graphics2D

Graphics2D proporciona los siguientes métodos generales de dibujado que pueden
usarser para dibujar cualquier primitivo geométrico, texto o imagen.

      draw--dibuja el exterior de una forma geométrica primitiva usando los atributos stroke
       y paint.
      fill--dibuja cualquier forma geométrica primitiva rellenado su interior con el color o
       patrón especificado por el atributo paint.
      drawString--dibuja cualquier cadena de texto. El atributo font se usa para convertir la
       fuente a glyphs que luego se rellenan con el color o patrón especificados por el
       atributo paint.
      drawImage--dibuja la imagen especificada.

Además, Graphics2D soporta los métodos de renderizado de Graphics para formas
particulares, como drawOval y fillRect.
Sistema de Coordenadas

El sistema 2D de Java mantiene dos espacios de coordenadas:

       El espacio de usuario es el espacio en que se especifican los gráficos primitivos.
       El espacio de dispositivo es el sistema de coordenadas para un diopositivo de
        salida, como una pantalla, una ventana o una impresora.

El espacio de usuario es un sistema de coordenadas lógicas independiente del
dispositivo: el espacio de coordenadas que usan nuestros programas. Todos los
geométricos pasados a las rutinas Java 2D de renderizado se especifican en
coordenadas de espacio de usuario.

Cuando se utiliza la transformación por defecto desde el espacio de usuario al espacio
de dispositivo, el origen del espacio de usuario es la esquina superior izquierda del
área de dibujo del componente. La coordenada X se incrementa hacia la derecha, y la
coordenada y hacia abajo.

El espacio de dispositivo es un sistema de coordenadas dependiente del dispositivo
que varía de acuerdo a la fuente del dispositivo. Aunque el sistema de coordenadas
para una ventana o una pantalla podría ser muy distinto que para una impresora, estas
diferencias son invisibles para los programas Java. Las conversiones necesarias entre el
espacio de usuario y el espacio de dispositivo se realizan automáticamente durante el
dibujado.

Conceptos básicos

Estos objetos son parte necesaria de cada operación de dibujo Java 2D.

Formas
Java 2D tiene varias formas que pueden ser utilizadas como rectángulos, cuadrados, círculos
los cuales se les puede rellenar de color o pintar los filos de la forma.

Las formas están hechas por vectores, si se las amplia o se las reduce no se van a ser afectadas
ya que no son pixeles.
Formas 2D

Las clases del paquete java.awt.geom definen gráficos primitivos comunes, como
puntos, líneas, curvas, arcos, rectángulos y elipses.

Clases en el paquete java.awt.geom

    Arc2D
    Area
    CubicCurve2D
    Dimension2D
    Ellipse2D
    GeneralPath
    Line2D
    Point2D
    QuadCurve2D
    Rectangle2D
    RectangularShape
    RoundRectangle2D

Excepto para Point2D y Dimension2D, cada una de las otras clases geométricas
implementa el interface Shape, que proporciona un conjunto de métodos comunes para
describir e inspeccionar objetos geométricos bi-dimensionales.

Con estas clases podemos crear de forma virtual cualquiere forma geométrica y
dibujarla a través de Graphics2D llamando al método draw o al método fill. Por
ejemplo, las formas geométricas del siguiente applet están definidas usando los
geométricos básicos de Java 2D.




Formas Rectangulares

Los primitivos Rectangle2D, RoundRectangle2D, Arc2D, y Ellipse2D descienden del
RectangularShape, que define métodos para objetos Shape que pueden ser descritos
por una caja rectángular. La geometría de un RectangularShape puede ser extrapolada
desde un rectángulo que encierra completamente el exterior de la Shape.
QuadCurve2D y CubicCurve2D

La clase QuadCurve2D nos permite crear segmentos de curvas cuadráticos. Una curva
cuadrática está definida por dos puntos finales y un punto de control.

La clase CubicCurve2D nos permite crear segmentos de curvas cúbicos. Una curva
cúbica está definida por dos puntos finales y dos puntos de control. Las siguientes
figuras muestran ejemplos de curvas cuadráticas y cúbicas.




Gevth

La clase GeneralPath nos permite crear una curva arbitraria especificando una serie de
posiciones a lo largo de los límites de la forma. Estas posiciones pueden ser conectadas
por segmentos de línea, curvas cuadráticas o curvas cúbicas. La siguiente figura puede
ser creada con 3 segmentos de línea y una curva cúbica.




     Areas

Con la clase Area podemos realizar operaciones boolenas, como uniones, intersecciones
y substracciones, sobre dos objetos Shape cualesquiera. Esta técnica, nos permite crear
rápidamente objetos Shape complejos sin tener que describir cada línea de segmento o
cada curva.
Pinceles
                           Un pincel genera los colores que serán usados para cada píxel de la
                           operación de relleno. El pincel más simple es java.awt.Color, el cual
                           genera el mismo color para todos los píxeles.

                         Pinceles más complicados pueden producir gradientes, imágenes,
                         o cualquier combinación de colores. Rellenar una forma circular
                         usando el color amarillo resulta en un círculo sólido amarillo,
                         mientras rellenar la misma forma circular usando un pincel que
genera una imagen produce un recorte circular de la imagen.




Compuestos
Durante cualquier operación de dibujo, hay una fuente (los píxeles que son producidos por el
pincel) y un destino (los píxeles ya en la pantalla). Normalmente, los píxeles fuente
simplemente sobrescriben los píxeles de destino, pero el compuesto permite modificar este
comportamiento.

El compuesto, dados los píxeles fuente y destino, produce el resultado final que por último
aparece en la pantalla. El compuesto más común es java.awt.AlphaComposite, el cual trata los
píxeles que están siendo dibujados como parcialmente transparentes, para que los píxeles
destino se muestren en algún grado.




Rellenado
Para rellenar una forma, el primer paso es identificar que píxeles caen dentro de la forma.
Estos píxeles serán afectados por la operación de relleno. Los píxeles que están parcialmente
dentro y parcialmente fuera de la forma pueden ser afectados en menor grado si está activado
el Anti-aliasing.

El pincel es requerido para generar un color de cada uno de los píxeles que se van a pintar. En
el caso común del relleno de un color sólido, cada píxel será asignado al mismo color.

El compuesto toma los píxeles generados por el pincel y los combina con los píxeles que ya
están en la pantalla para producir el resultado final.
Texto
Cuando necesitemos mostrar texto, podemos usar uno de los componentes orientados a texto,
como los componentes Como usar Labels o Usar Componentes de Texto de Swing. Cuando se
utiliza un componente de texto, mucho del trabajo lo hacen por nosotros--por ejemplo, los
objetos JTextComponent proporcionan soporte interno para chequeo de pulsaciones y para
mostrar texto internacional.

Si queremos mostrar una cadena de texto estática, podemos dibujarla directamente a través
de Graphics2D usando el método drawString. Para especificar la fuente, podemos usar el
método setFont de Graphics2D.

Si queremos implementar nuestras propias rutinas de edición de texto o necesitamos más
control sobre la distribucción del texto que la que proporcionan los componentes de texto,
podemos usar las clases del paquete java.awt.font.




Fuentes
Las formas que una fuente usa para representar los caracteres de una cadena son llamadas
glyphs. Un caracter particular o una combinación de caracteres podría ser representada como
uno o más glyphs. Por ejemplo, á podría ser representado por dos glyphs, mientras que la
ligadura fi podría ser representada por un sólo glyph.
Cuando se utiliza el API 2D de Java, se especifican las fuentes usando un ejemplar de Font.
Podemos determinar las fuentes disponibles en el sistema llamando al método estático
GraphicsEnvironment.getLocalGraphicsEnvironment y preguntando al GraphicsEnvironment
devuelto. El método getAllFonts devuelve un array que contiene ejemplares Font para todas
las fuentes disponibles en el sistema; getAvailableFontFamilyNames devuelve una lista de las
familias de fuentes disponibles.

Objetos Avanzados

Estos objetos pueden ser entendidos en relación con los objetos más simples escritos antes.

Transformación
Cada operación Java 2D es sujeto a transformación, para que las formas pueden ser
traducidas, rotadas, y escaladas cuando son dibujadas. La transformación activa es a menudo
la transformación identidad, la cual no hace nada.

Rellenar usando una transformación puede verse como simplemente crear una nueva forma
transformada y entonces rellenar esa forma.

Movimiento
Además de la operación rellenar, Java 2D suministra una operación dibujar. Mientras rellenar
dibuja el interior de una forma, dibujar dibuja su contorno. El contorno puede ser tan simple
como una línea fina, o tan complicado como una línea con bordes redondeados.




El objeto responsable de generar el exterior es el movimiento. Dada una forma de entrada, el
movimiento produce una nueva forma que representa su exterior. Por ejemplo, un segmento
de línea infinitamente fino (sin interior) no puede ser movido a un rectángulo de ancho de un
píxel.

Una operación dibujar puede por lo tanto ser descrito como crear un nuevo, objeto movido y
entonces rellenar ese objeto.




Imágenes
El API 2D de Java implementa un nuevo modelo de imagen que soporta la manipulación de
imágenes de resolución fija almacenadas en memoria. Una nueva clase Image en el paquete
java.awt.image, puede usar BufferedImage, para manipular datos de una imagen recuperados
desde un fichero o una URL.




Por ejemplo, se puede usar un BufferedImage para implementar doble buffer -- los elementos
gráficos son dibujados fuera de la pantalla en el BufferedImage y luego son copiados a la
pantalla a través de llamadas al método drawImage de Graphics2D.

Las clases BufferedImage y BufferedImageOp también permiten realizar una gran variedad de
operaciones de filtrado de imágenes como blur. El modelo de imagen productor/consumidor
proporcionado en las versiones anteriores del JDK sigue siendo soportado por razones de
compatibilidad.

Impresión
Todos los gráficos del AWT y de Java 2D, incluidos los gráficos compuestos y las imágenes,
pueden ser dibujadas en una impresora usando el API de Java 2D. Este API proporciona
características de composición de documentos que nos permite realizar dichas operaciones
como cambiar el orden de impresión de las páginas.

Dibujar en la impresora es como dibujar en la pantalla. El sistema de impresión controla
cuando se dibujan las páginas, como lo hace el sistema gráfico de la pantalla cuando un
componente se dibuja en la pantalla.

Nuestra aplicación proporciona al sistema de impresión la información sobre el documento a
imprimir, y el sistema de impresión determina cuando necesita dibujar cada página. Cuando
las páginas necesitan ser dibujadas, el sistema de impresión llama al método print de la
aplicación con el contexto Graphics apropiado. Para usar las características del API 2D de Java
en la impresión, debemos forzar el objeto Graphics a un objeto Graphics2D, igual que se hace
cuando se dibuja en la pantalla.
Mostrar Gráficos con Graphics2D
Nos muestra cómo usar Graphics2D para mostrar gráficos con líneas exteriores, estilos de
relleno, transformación de gráficos mientras son dibujados, con restricción de dibujo en un
área particular y generalmente controla la forma y aspecto de los gráficos.

      Punteado y Relleno de Gráficos Primitivos
      Quad
      Cubic
      Dibujar formas arbitrarias
      Odd_Shape
      Definir Estilos de línea divertidos y Patrones de relleno.
      Estilos de Línea
      Patrón de Relleno

Punteado y Relleno de Gráficos Primitivos
Cambiando el punteado y los atributos de dibujo en el contexto de Graphics2D, antes del
dibujo, podemos fácilmente aplicar estilos divertidos de líneas y patrones de relleno para
gráficos primitivos. Por ejemplo, podemos dibujar una línea punteada creando el objeto Stroke
apropiado y llamando a setStroke para añadirlo al contexto Graphics2D antes de dibujar la
línea. De forma similar, podemos aplicar un relleno de gradiente a un Shape creando un objeto
GradientPaint y añadiendo al contexto Graphics2D llamando a setPaint antes de dibujar la
Shape.




                             GradientePaint                Stroke

Formas geométricas usando los métodos Graphics2D draw y fill.
Estilos de Línea
Los estilos de línea están definidos por el atributo stroke en el contexto Graphics2D. Para
seleccionar el atributo stroke podemos crear un objeto BasicStroke y pasarlo dentro del
método Graphics2D setStroke.

Un objeto BasicStroke contiene información sobre la anchura de la línea, estilo de uniones,
estilos finales, y estilo de punteado. Esta información se usa cuando se dibuja un Shape con el
método draw.

BasicStroke soporta tres estilos de unión:


                                    JOIN_BEVEL


                                    JOIN_MITER


                                    JOIN_ROUND

El estilo de finales es la decoración que se aplica cuando un segmento de línea termina.
BasicStroke soporta tres estilos de finalización:

                                      CAP_BUTT

                                    CAP_ROUND

                                   CAP_SQUARE

Patrón de Relleno
Los patrones de rellenos están definidos por el atributo paint en el contexto Graphics2D. Para
seleccionar el atributo paint, se crea un ejemplar de un objeto que implemente el interface
Paint y se pasa dentro del método Graphics2D setPaint.

Tres clases implementan el interface Paint: Color, GradientPaint, y TexturePaint, GradientPaint
y TexturePaint son nuevas en el JDK 1.2.
El patrón para una TexturePaint esta definido por un BufferedImage. Para crear un
TexturePaint, se especifica una imagen que contiene el patrón y un rectángulo que se usa para
replicar y anclar el patrón.




                                   StrokeAndFill
El applet StrokeAndFill permite al usuario seleccionar un gráfico primitivo, un estilo de línea,
un estilo de dibujo y o bien puntear el exterior del objeto, rellenarlo con el dibujo
seleccionado, o puntear el objeto en blanco y rellenar el dibujo con el dibujo seleccionado.




Los primitivos son inicializados e introducidos en un array de objetos Shape. El siguiente código
crea un Rectangle y un Ellipse2D.Double y los introduce en el array shapes.


             Transformar Formas, Texto e Imágenes
Podemos modificar el atributo transform en el contexto Graphics2D para mover, rotar, escalar
y modificar gráficos primitivos mientras son dibujados. El atributo transform está definido por
un ejemplar de AffineTransform.

Graphics2D proporciona varios métodos para cambiar el atributo transform. Podemos
construir un nuevo AffineTransform y cambiar el atributo transform de Graphics2D llamando al
método setTransform.

AffineTransform define los siguientes métodos para hacer más sencilla la construcción de
nuevas transformaciones:

                                        getRotateInstance
                                        getScaleInstance
                                        getShearInstance
   getTranslateInstance

De forma alternativa podemos usar uno de los métodos de transformación de Graphics2D para
modificar la transformación actual. Cuando se llama a uno de esos métodos de conveniencia,
la transformación resultante se concatena con la transformación actual y es aplicada durante
el dibujado.

       rotate--para especificar un ángulo de rotación en radianes.
       scale--para especificar un factor de escala en direcciones x e y.
       shear--para especificar un factor de compartición en direcciones x e y
       translate--para especificar un desplazamiento de movimiento en direcciones x e y




Cuando se elige una opción de transformación, se modifica un ejemplar de AffineTransform y
se concatena con una transformación de movimiento que mueve la Shape hacia el centro de la
ventana. La transformación resultante se pasa al método setTransform para seleccionar el
atributo transform de Graphics2D


                      Recortar la Región de Dibujo
Cualquier Shape puede usarse como un path de recortado que restringe las porciones del área
de dibujo que serán renderizadas. El path de recortado forma parte del contexto Graphics2D;
para seleccionar el atributo clip, se llama a Graphics2D.setClip y se pasa a la Shape que define
el path de recortado que queramos usar. Podemos reducir el path de recortado llamando al
método clip y pasándolo en otra Shape; el atributo clip se configura a la intersección entre el
clip actual y el Shape especificado.

ClipImage

un path de recortado para revelar diferentes porciones de una imagen:
Starry

Un área de recortado también puede crearse desde una cadena de texto existente. El
siguiente ejemplo crea un TextLayout con la cadena The Starry Night. Luego, obtiene
una línea exterior del TextLayout. El método TextLayout.getOutline devuelve un objeto
Shape y un Rectangle creado a partir de los límites del objeto Shape. Los límites
contienen todos los pixels que layout puede dibujar. El color en el contexto gráfico se
selecciona a azul y se dibuja la figura exterior de la forma, como ilustran la siguiente
imagen y el fragmento de código.




Componer Gráficos
La clase AlphaComposite encapsula varios estilos de composición, que determinan
cómo se dibujan los objetos solapados. Un AlphaComposite también puede tener un
valor alpha que especifica el grado de transparencia: alpha = 1.0 es totalmente opaco,
alpha = 0.0 es totalmente transparente. AlphaComposite soporta la mayoria de los
estandares de composición como se muestra en la siguiente tabla.

Source-over (SRC_OVER)        Si los pixels del objeto que está siendo renderizado (la
                              fuente) tienen la misma posición que los pixels
                              renderizados préviamente (el destino), los pixels de la
                              fuente se renderizan sobre los pixels del destino.

Source-in (SRC_IN)            Si los pixels de la fuente y el destino se solapan, sólo se
                              renderizarán los pixels que haya en el área solapada.




Source-out (SRC_OUT)          Si los pixels de la fuente y el destino se solapan, sólo se
                              renderizarán los pixels que haya fuera del área solapada. Los
                              pixels que haya en el área solapada se borrarán.




Destination-over              Si los pixels de la fuente y del destino se solapan, sólo se
(DST_OVER)                    renderizarán los pixels de la fuente que haya fuera del área
solapada. Los pixels que haya en el área solapada no se
                               cambian.




Destination-in (DST_IN)        Si los pixels de la fuente y del destino se solapan, el alpha de
                               la fuente se aplica a los pixels del área solapada del destino. Si
                               el alpha = 1.0, los pixels del área solapada no cambian; si
                               alpha es 0.0 los pixels del área solapada se borrarán.

Destination-out (DST_OUT) Si los pixels de la fuente y del destino se solapan, se aplica el
                          alpha de la fuente a los pixels del área solapada del destino. Si
                          el alpha = 1.0, los pixels del área solapada no cambian; si
                          alpha es 0.0 los pixels del área solapada se borrarán.

Clear (CLEAR)                  Si los pixels de la fuente y del destino se solapan, los pixels del
                               área solapada se borrarán.




Composite

Este programa ilustra los efectos de varias combinaciones de estilos de composición y
valores de alpha.
Controlar la Calidad del Dibujo
Podemos usar el atributo 'rendering hint' de Graphics2D para especificar si queremos
que los objetos sean dibujados tan rápido como sea posible o si preferimos que se
dibujen con la mayor calidad posible.

Para seleccionar o configurar el atributo 'rendering hint', Graphics2D podemos
construir    un     objeto      RenderingHints        y      pasarlo     dentro   de
Graphics2D.setRenderingHints. Si sólo queremos seleccionar un hint, podemos llamar
a Graphics2D. setRenderingHint y especificar la pareja clave-valor para el hint que
queremos seleccionar. (Estas parejas están definidas en la clase RenderingHints.)

RenderingHints soporta los siguientes tipos de hints.

      Alpha interpolation--por defecto, calidad, o velocidad.
      Antialiasing--por defecto, on, u off
      Color rendering-por defecto, calidad, o velocidad
      Dithering--por defecto, activado o desactivado
      Fractional metrics--por defecto, on u off
      Interpolation--vecino más cercano, bilinear, o bicúbico
      Rendering--por defecto, calidad, o velocidad
      Text antialiasing--por defecto, on u off.




Construir Formas Complejas desde Geométricos
Primitivos
Construir un área geométrica (CAG) es el proceso de crear una nueva forma
geométrica realizando operaciones con las ya existentes. En el API Java 2D un tipo
especial de Shape llamado Area soporta operaciones booleanas. Podemos construir un
Area desde cualquier Shape .

Area soporta la siguientes operaciones booleanas:




                             Unión                               Subtracción
Intersección                         Or-Exclusivo (XOR)




Áreas
En este ejemplo, los objetos Area construyen una forma de pera partiendo de varias
elipses.




Soportar Interacción con el Usuario
Para permitir que el usuario interactúe con los graficos que hemos dibujado,
necesitamos poder determinar cuando el usuario pulsa sobre uno de ellos. El método
hit de Graphics2D proporciona una forma para determinar fácilmente si ha ocurrido
una pulsación de ratón sobre una Shape particular. De forma alternativa podemos
obtener la posición del click de ratón y llamar a contains sobre la Shape para
determinar si el click ocurrió dentro de los límites de la Shape.

ShapeMover
Este applet permite al usuario arrastrar la Shape por la ventana del applet. La Shape se
redibuja en cada nueva posición del ratón para proporcionar información al usuario mientras
la arrastra.
Dibujar Múltiples Líneas de Texto
Si tenemos un párrafo de texto con estilo que queremos que quepa dentro de una
anchura especifica, podemos usar LineBreakMeasurer, que permite que el texto con
estilo se rompa en líneas que caben dentro de un espacio visual. Como hemos aprendido
en Mostrar Gráficos con Graphics2D, un objeto TextLayout representa datos de
caracteres con estilo, que no se pueden cambiar, pero también permite acceder a la
información de distribución. Los métodos getAscent y getDescent de TextLayout
devuelven información sobre la fuente usada para posicionar las líneas en el
componente. El texto se almacena como un AttributedCharacterIterator para que los
atributos de fuente y tamaño de punto puedan ser almacenados con el texto.


     Ejemplo: LineBreakSample

El siguiente applet posiciona un párrafo de texto con estilo dentro de un componente,
usando LineBreakMeasurer, TextLayout y AttributedCharacterIterator.
Impresión en Java
Java 2D controla en forma general el proceso de impresión, al igual que también
controla cómo y cuándo pueden dibujar los programas, nuestras aplicaciones
proporcionan información sobre el documento a imprimir, y el sistema de impresión
determina cuando necesita renderizar cada página.

Este modelo de impresión permite soportar una amplio rango de impresoras y de
sistemas. Incluso permite al usuario imprimir en una impresora de bitmaps desde un
ordenador que no tiene suficiente memoria o espacio en disco para contener el mapa de
bits de una página completa. En esta situación el sistema de impresión le pedirá a nuesta
aplicación que renderize la página de forma repetida para que pueda ser imprimida
como una serie de pequeñas imágenes.

Para soportar impresión, una apliación necesita realizar dos tareas.

       Job control--manejar el trabajo de impresión
       Imaging--renderizar las páginas a imprimir


       Job Control

Aunque el sistema controla todo el proceso de impresión, nuestra aplicación tiene que
obtener la oportunidad de configurar un PrinterJob. El PrinterJob , el punto clave del
control del proceso de impresión, almacena las propiedades del trabajo de impresión,
controla la visión de los diálogos de impresión y se usa para inicializar la impresión.

Para dirigir el PrinterJob a través del proceso de impresión, nuestra aplicación necesita

   1. Obtener un PrinterJob llamando a PrinterJob.getPrinterJob
   2. Decirle al PrinterJob dónde está el código de dibujo llamando a setPrintable o
      setPageable
   3. Si se desea, mostrar los diálogos de configuración de página e impresión
      llamando a pageDialog y printDialog

Iniciar la impresión llamando a print

Más contenido relacionado

PDF
Metodologias para el desarrollo de los sistemas expertos
PPTX
Introduccion a graficos mediante JAVA 2D
PDF
Introducción a los algoritmos y programación 1
PPTX
METODOLOGÍA UWE (UML-BASED WEB ENGINEERING)
PPTX
Mitos de-software.
PPT
Proceso Unificado De Rational
PDF
Concepto y extensiones de negocio de Eriksson Penker
PDF
Metodologia orientada a objeto
Metodologias para el desarrollo de los sistemas expertos
Introduccion a graficos mediante JAVA 2D
Introducción a los algoritmos y programación 1
METODOLOGÍA UWE (UML-BASED WEB ENGINEERING)
Mitos de-software.
Proceso Unificado De Rational
Concepto y extensiones de negocio de Eriksson Penker
Metodologia orientada a objeto

La actualidad más candente (20)

PPTX
Análisis y diseño estructurado
PDF
Diccionario de datos
PPT
Modelo de Objeto Semantico
 
PPTX
3.5.2 IDENTIFICACIÓN, IMPACTO Y PROYECCIÓN DEL RIEGOS
DOCX
Métodos y técnicas de encriptación
PPTX
Diseño Estructurado
PPTX
Fundamentos de Ingenieria de Software - Unidad 1 modelo de negocios
PDF
8b Curso de POO en java - paso de diagrama clases a java 1
PPT
Diagramas de Casos de Uso del Negocio y del Sistema
PPTX
Importancia del análisis de requerimientos
PPSX
Analisis estructurado
PPTX
2 2 estilos arquitectonicos
PPTX
Cálculo relacional
DOC
Formato ieee830
PPTX
Representación matricial
PPSX
Diagrama De Secuencia
DOCX
25 Estandares - IEEE Calidad de Software
PPT
Diseño a Nivel de Componentes
PDF
6 Curso de POO en Java - clases y objetos
Análisis y diseño estructurado
Diccionario de datos
Modelo de Objeto Semantico
 
3.5.2 IDENTIFICACIÓN, IMPACTO Y PROYECCIÓN DEL RIEGOS
Métodos y técnicas de encriptación
Diseño Estructurado
Fundamentos de Ingenieria de Software - Unidad 1 modelo de negocios
8b Curso de POO en java - paso de diagrama clases a java 1
Diagramas de Casos de Uso del Negocio y del Sistema
Importancia del análisis de requerimientos
Analisis estructurado
2 2 estilos arquitectonicos
Cálculo relacional
Formato ieee830
Representación matricial
Diagrama De Secuencia
25 Estandares - IEEE Calidad de Software
Diseño a Nivel de Componentes
6 Curso de POO en Java - clases y objetos
Publicidad

Destacado (8)

PDF
Java 2d
PDF
Tema 14 imágenes en java por gio
PDF
Java blackberry
PPTX
Ediciones Windows7 y Windows Server 2008
DOCX
PDF
Vectores r2 y r3
PPT
LibreríAs De Java
PDF
Vectores en R2 - 2
Java 2d
Tema 14 imágenes en java por gio
Java blackberry
Ediciones Windows7 y Windows Server 2008
Vectores r2 y r3
LibreríAs De Java
Vectores en R2 - 2
Publicidad

Similar a Api java 2D (20)

PPTX
Java 2 d
PPTX
Renderización en java
PDF
Tema 13 gráficas en java por gio
PDF
Java2 d
PDF
Java 2 d
PDF
PDF
Java 2d
PPT
Primitivas
PPTX
Primitivos gráficos en java - Part 1
PDF
Cesnavarra 2009-boletín 10
PDF
Java 3 d manual
PPT
Programas
PDF
E S T R U C T U R A G E N E R A L D E U N A A P L I C A C IÓ N G R A F I...
PPT
TUTORIAL DE ACTIVIDADES EN XO
PDF
7 y 8. interfaz grafica en java
PPTX
Presentacion aplicaciones en java
Java 2 d
Renderización en java
Tema 13 gráficas en java por gio
Java2 d
Java 2 d
Java 2d
Primitivas
Primitivos gráficos en java - Part 1
Cesnavarra 2009-boletín 10
Java 3 d manual
Programas
E S T R U C T U R A G E N E R A L D E U N A A P L I C A C IÓ N G R A F I...
TUTORIAL DE ACTIVIDADES EN XO
7 y 8. interfaz grafica en java
Presentacion aplicaciones en java

Más de ESPOL (15)

PPTX
Control de Acceso a Sistemas Operativos
DOCX
Widgets de Adove Captive
PPSX
Distribuciones de Linux
PPSX
Contadores de Eventos(Problema del productor y consumidor)
PPSX
Kanon wakeshima
PPTX
Software Multimedia
PPTX
Herramientas CASE
PPT
Base de Datos
PPTX
Lenguajes de programacion
PPTX
Utilitarios
PPTX
Sistamas Operativos parte1
PPTX
Sistemas operativos parte2
PPTX
Dispositivos de salida
PPTX
Dispositivos de entrada
PPT
C Saucedo
Control de Acceso a Sistemas Operativos
Widgets de Adove Captive
Distribuciones de Linux
Contadores de Eventos(Problema del productor y consumidor)
Kanon wakeshima
Software Multimedia
Herramientas CASE
Base de Datos
Lenguajes de programacion
Utilitarios
Sistamas Operativos parte1
Sistemas operativos parte2
Dispositivos de salida
Dispositivos de entrada
C Saucedo

Último (20)

PDF
Habilidades sociales en la era digital (25-2))
PDF
revista de historia Clio N|285 2025_.pdf
PPTX
Presentación: Cumplimiento del Empleador
PDF
Conecta con la Motivacion - Brian Tracy Ccesa007.pdf
PDF
benveniste-problemas-de-linguistica-general-i-cap-6 (1)_compressed.pdf
PDF
Unidad de Aprendizaje 5 de Matematica 1ro Secundaria Ccesa007.pdf
PPTX
Guía Esencial para Empleadores - Cumplimiento con el IESS
PDF
Breve historia de los Incas -- Patricia Temoche [Temoche, Patricia] -- Breve ...
PDF
Empieza Con El Porqué - Simon Sinek Ccesa007.pdf
DOCX
UNIDAD DE APRENDIZAJE 5 AGOSTO tradiciones
PDF
Gasista de unidades unifuncionales - pagina 23 en adelante.pdf
PDF
OK OK UNIDAD DE APRENDIZAJE 5TO Y 6TO CORRESPONDIENTE AL MES DE AGOSTO 2025.pdf
PDF
GUIA DE: CANVA + INTELIGENCIA ARTIFICIAL
PDF
Salcedo, J. et al. - Recomendaciones para la utilización del lenguaje inclusi...
PDF
Escuela Sabática 6. A través del Mar Rojo.pdf
DOCX
III Ciclo _ Plan Anual 2025.docx PARA ESTUDIANTES DE PRIMARIA
PPT
Cosacos y hombres del Este en el Heer.ppt
PDF
Crear o Morir - Andres Oppenheimer Ccesa007.pdf
PDF
CONFERENCIA-Deep Research en el aula universitaria-UPeU-EduTech360.pdf
DOCX
PROYECTO DE APRENDIZAJE para la semana de fiestas patrias
Habilidades sociales en la era digital (25-2))
revista de historia Clio N|285 2025_.pdf
Presentación: Cumplimiento del Empleador
Conecta con la Motivacion - Brian Tracy Ccesa007.pdf
benveniste-problemas-de-linguistica-general-i-cap-6 (1)_compressed.pdf
Unidad de Aprendizaje 5 de Matematica 1ro Secundaria Ccesa007.pdf
Guía Esencial para Empleadores - Cumplimiento con el IESS
Breve historia de los Incas -- Patricia Temoche [Temoche, Patricia] -- Breve ...
Empieza Con El Porqué - Simon Sinek Ccesa007.pdf
UNIDAD DE APRENDIZAJE 5 AGOSTO tradiciones
Gasista de unidades unifuncionales - pagina 23 en adelante.pdf
OK OK UNIDAD DE APRENDIZAJE 5TO Y 6TO CORRESPONDIENTE AL MES DE AGOSTO 2025.pdf
GUIA DE: CANVA + INTELIGENCIA ARTIFICIAL
Salcedo, J. et al. - Recomendaciones para la utilización del lenguaje inclusi...
Escuela Sabática 6. A través del Mar Rojo.pdf
III Ciclo _ Plan Anual 2025.docx PARA ESTUDIANTES DE PRIMARIA
Cosacos y hombres del Este en el Heer.ppt
Crear o Morir - Andres Oppenheimer Ccesa007.pdf
CONFERENCIA-Deep Research en el aula universitaria-UPeU-EduTech360.pdf
PROYECTO DE APRENDIZAJE para la semana de fiestas patrias

Api java 2D

  • 1. 2011 Api Java 2D Escuela Superior Politécnica del Litoral Carolina Dávila Llerena
  • 2. API Java 2D Java 2D es un API que nos sirve para dibujar gráficos. Podemos utilizar texto, y tiene las capacidades de manejo de imágenes para los programas de Java, utilizando extensión del AWT en Java. Cada dibujo en Java 2D puede tratarse como rellenar una forma usando un pincel y componiendo el resultado en la pantalla. En este paquete soporta líneas artísticas, imágenes en 2d, texto, marco, rellenos, gradientes y todo lo necesario para desarrollar interfaces de usuarios, programas de dibujos y editores de imágenes. El API 2D de Java proporciona:  Un modelo uniforme en las pantallas y las impresiones  Una variedad de conjuntos y figuras geométricas, gráficos primitivos como lo son las curvas, rectángulos, eclipse.etc  Tiene un mecanismo que permite detectar esquinas ya sea de formas, imágenes o texto.  Tiene una variedad extensa de colores y permite una facilidad de manejo.  Soporta impresiones de documentos de un nivel más complejo. Renderizado en Java 2D Java 2d posee un mecanismo de renderizado básico como en las otras versiones del JDK, este sistema de dibujo controla cuando u como dibuja un programa. Cuando se necesita mostrar un componente, automáticamente se llama al método paint o la update que se encuentra dentro de un contexto Graphics apropiado. El API 2D de Java presenta java.awt.Graphics2D, desciende de la clase Graphics para proporcionar acceso a las características avanzadas de renderizado del API 2D de Java. Para usar las características del API 2D de Java, tenemos que forzar el objeto Graphics pasado al método de dibujo de un componente a un objeto Graphics2D.
  • 3. Contexto de Renderizado de Graphics2D A un conjunto de atributos que se asocian con un objeto se lo conoce como Renderizado. Para poder mostrar texto, forma o imágenes podemos configurar esto llamando a uno de los métodos de renderizado de la clase Graphics2D, como lo son draw o fill. El estilo de lápiz que se aplica al exterior de una forma. Este atributo stroke nos permite dibujar líneas con cualquier tamaño de punto y patrón de sombreado y aplicar finalizadores y decoraciones a la línea. El estilo de relleno que se aplica al interior de la forma. Este atributo paint nos permite rellenar formas con cólores sólidos, gradientes o patrones. El estilo de composición se utiliza cuando los objetos dibujados se solapan con objetos existentes. La transformación que se aplica durante el dibujado para convertir el objeto dibujado desde el espacio de usuario a las coordenadas de espacio del dispositivo. También se pueden aplicar otras transformaciones opcionales como la traducción, rotación escalado, recortado, a través de este atributo. El Clip que restringe el dibujado al área dentro de los bordes de la Shape se utiliza para definir el ára de recorte. Se puede usar cualquier Shape para definir un clip. La fuente se usa para convertir cadenas de texto.
  • 4. Punto de Renderizado que especifican las preferencias en cuanto a velocidad y calidad. Por ejemplo, podemos especificar si se debería usar antialiasing, si está disponible. Para configurar un atributo en el contexto de renderizado de Graphics2D, se usan los métodos set Attribute.  setStroke  setPaint  setComposite  setTransform  setClip  setFont  setRenderingHints Cuando configuramos un atributo, se le pasa al objeto el atributo apropiado. Por ejemplo, para cambiar el atributo paint a un relleno de gradiente azul-gris, deberíamos construir el objeto GradientPaint y luego llamar a setPaint. gp = new GradientPaint(0f,0f,blue,0f,30f,green); g2.setPaint(gp); Graphics2D contiene referencias a sus objetos atributos -- no son clonados. Si modificamos un objeto atributo que forma parte del contexto Graphics2D, necesitamos llamar al método set para notificarlo al contexto. La modificación de un atributo de un objeto durante el renderizado puede causar comportamientos impredecibles. Métodos de renderizado de Graphics2D Graphics2D proporciona los siguientes métodos generales de dibujado que pueden usarser para dibujar cualquier primitivo geométrico, texto o imagen.  draw--dibuja el exterior de una forma geométrica primitiva usando los atributos stroke y paint.  fill--dibuja cualquier forma geométrica primitiva rellenado su interior con el color o patrón especificado por el atributo paint.  drawString--dibuja cualquier cadena de texto. El atributo font se usa para convertir la fuente a glyphs que luego se rellenan con el color o patrón especificados por el atributo paint.  drawImage--dibuja la imagen especificada. Además, Graphics2D soporta los métodos de renderizado de Graphics para formas particulares, como drawOval y fillRect.
  • 5. Sistema de Coordenadas El sistema 2D de Java mantiene dos espacios de coordenadas:  El espacio de usuario es el espacio en que se especifican los gráficos primitivos.  El espacio de dispositivo es el sistema de coordenadas para un diopositivo de salida, como una pantalla, una ventana o una impresora. El espacio de usuario es un sistema de coordenadas lógicas independiente del dispositivo: el espacio de coordenadas que usan nuestros programas. Todos los geométricos pasados a las rutinas Java 2D de renderizado se especifican en coordenadas de espacio de usuario. Cuando se utiliza la transformación por defecto desde el espacio de usuario al espacio de dispositivo, el origen del espacio de usuario es la esquina superior izquierda del área de dibujo del componente. La coordenada X se incrementa hacia la derecha, y la coordenada y hacia abajo. El espacio de dispositivo es un sistema de coordenadas dependiente del dispositivo que varía de acuerdo a la fuente del dispositivo. Aunque el sistema de coordenadas para una ventana o una pantalla podría ser muy distinto que para una impresora, estas diferencias son invisibles para los programas Java. Las conversiones necesarias entre el espacio de usuario y el espacio de dispositivo se realizan automáticamente durante el dibujado. Conceptos básicos Estos objetos son parte necesaria de cada operación de dibujo Java 2D. Formas Java 2D tiene varias formas que pueden ser utilizadas como rectángulos, cuadrados, círculos los cuales se les puede rellenar de color o pintar los filos de la forma. Las formas están hechas por vectores, si se las amplia o se las reduce no se van a ser afectadas ya que no son pixeles.
  • 6. Formas 2D Las clases del paquete java.awt.geom definen gráficos primitivos comunes, como puntos, líneas, curvas, arcos, rectángulos y elipses. Clases en el paquete java.awt.geom  Arc2D  Area  CubicCurve2D  Dimension2D  Ellipse2D  GeneralPath  Line2D  Point2D  QuadCurve2D  Rectangle2D  RectangularShape  RoundRectangle2D Excepto para Point2D y Dimension2D, cada una de las otras clases geométricas implementa el interface Shape, que proporciona un conjunto de métodos comunes para describir e inspeccionar objetos geométricos bi-dimensionales. Con estas clases podemos crear de forma virtual cualquiere forma geométrica y dibujarla a través de Graphics2D llamando al método draw o al método fill. Por ejemplo, las formas geométricas del siguiente applet están definidas usando los geométricos básicos de Java 2D. Formas Rectangulares Los primitivos Rectangle2D, RoundRectangle2D, Arc2D, y Ellipse2D descienden del RectangularShape, que define métodos para objetos Shape que pueden ser descritos por una caja rectángular. La geometría de un RectangularShape puede ser extrapolada desde un rectángulo que encierra completamente el exterior de la Shape.
  • 7. QuadCurve2D y CubicCurve2D La clase QuadCurve2D nos permite crear segmentos de curvas cuadráticos. Una curva cuadrática está definida por dos puntos finales y un punto de control. La clase CubicCurve2D nos permite crear segmentos de curvas cúbicos. Una curva cúbica está definida por dos puntos finales y dos puntos de control. Las siguientes figuras muestran ejemplos de curvas cuadráticas y cúbicas. Gevth La clase GeneralPath nos permite crear una curva arbitraria especificando una serie de posiciones a lo largo de los límites de la forma. Estas posiciones pueden ser conectadas por segmentos de línea, curvas cuadráticas o curvas cúbicas. La siguiente figura puede ser creada con 3 segmentos de línea y una curva cúbica. Areas Con la clase Area podemos realizar operaciones boolenas, como uniones, intersecciones y substracciones, sobre dos objetos Shape cualesquiera. Esta técnica, nos permite crear rápidamente objetos Shape complejos sin tener que describir cada línea de segmento o cada curva.
  • 8. Pinceles Un pincel genera los colores que serán usados para cada píxel de la operación de relleno. El pincel más simple es java.awt.Color, el cual genera el mismo color para todos los píxeles. Pinceles más complicados pueden producir gradientes, imágenes, o cualquier combinación de colores. Rellenar una forma circular usando el color amarillo resulta en un círculo sólido amarillo, mientras rellenar la misma forma circular usando un pincel que genera una imagen produce un recorte circular de la imagen. Compuestos Durante cualquier operación de dibujo, hay una fuente (los píxeles que son producidos por el pincel) y un destino (los píxeles ya en la pantalla). Normalmente, los píxeles fuente simplemente sobrescriben los píxeles de destino, pero el compuesto permite modificar este comportamiento. El compuesto, dados los píxeles fuente y destino, produce el resultado final que por último aparece en la pantalla. El compuesto más común es java.awt.AlphaComposite, el cual trata los píxeles que están siendo dibujados como parcialmente transparentes, para que los píxeles destino se muestren en algún grado. Rellenado Para rellenar una forma, el primer paso es identificar que píxeles caen dentro de la forma. Estos píxeles serán afectados por la operación de relleno. Los píxeles que están parcialmente dentro y parcialmente fuera de la forma pueden ser afectados en menor grado si está activado el Anti-aliasing. El pincel es requerido para generar un color de cada uno de los píxeles que se van a pintar. En el caso común del relleno de un color sólido, cada píxel será asignado al mismo color. El compuesto toma los píxeles generados por el pincel y los combina con los píxeles que ya están en la pantalla para producir el resultado final.
  • 9. Texto Cuando necesitemos mostrar texto, podemos usar uno de los componentes orientados a texto, como los componentes Como usar Labels o Usar Componentes de Texto de Swing. Cuando se utiliza un componente de texto, mucho del trabajo lo hacen por nosotros--por ejemplo, los objetos JTextComponent proporcionan soporte interno para chequeo de pulsaciones y para mostrar texto internacional. Si queremos mostrar una cadena de texto estática, podemos dibujarla directamente a través de Graphics2D usando el método drawString. Para especificar la fuente, podemos usar el método setFont de Graphics2D. Si queremos implementar nuestras propias rutinas de edición de texto o necesitamos más control sobre la distribucción del texto que la que proporcionan los componentes de texto, podemos usar las clases del paquete java.awt.font. Fuentes Las formas que una fuente usa para representar los caracteres de una cadena son llamadas glyphs. Un caracter particular o una combinación de caracteres podría ser representada como uno o más glyphs. Por ejemplo, á podría ser representado por dos glyphs, mientras que la ligadura fi podría ser representada por un sólo glyph.
  • 10. Cuando se utiliza el API 2D de Java, se especifican las fuentes usando un ejemplar de Font. Podemos determinar las fuentes disponibles en el sistema llamando al método estático GraphicsEnvironment.getLocalGraphicsEnvironment y preguntando al GraphicsEnvironment devuelto. El método getAllFonts devuelve un array que contiene ejemplares Font para todas las fuentes disponibles en el sistema; getAvailableFontFamilyNames devuelve una lista de las familias de fuentes disponibles. Objetos Avanzados Estos objetos pueden ser entendidos en relación con los objetos más simples escritos antes. Transformación Cada operación Java 2D es sujeto a transformación, para que las formas pueden ser traducidas, rotadas, y escaladas cuando son dibujadas. La transformación activa es a menudo la transformación identidad, la cual no hace nada. Rellenar usando una transformación puede verse como simplemente crear una nueva forma transformada y entonces rellenar esa forma. Movimiento Además de la operación rellenar, Java 2D suministra una operación dibujar. Mientras rellenar dibuja el interior de una forma, dibujar dibuja su contorno. El contorno puede ser tan simple como una línea fina, o tan complicado como una línea con bordes redondeados. El objeto responsable de generar el exterior es el movimiento. Dada una forma de entrada, el movimiento produce una nueva forma que representa su exterior. Por ejemplo, un segmento de línea infinitamente fino (sin interior) no puede ser movido a un rectángulo de ancho de un píxel. Una operación dibujar puede por lo tanto ser descrito como crear un nuevo, objeto movido y entonces rellenar ese objeto. Imágenes
  • 11. El API 2D de Java implementa un nuevo modelo de imagen que soporta la manipulación de imágenes de resolución fija almacenadas en memoria. Una nueva clase Image en el paquete java.awt.image, puede usar BufferedImage, para manipular datos de una imagen recuperados desde un fichero o una URL. Por ejemplo, se puede usar un BufferedImage para implementar doble buffer -- los elementos gráficos son dibujados fuera de la pantalla en el BufferedImage y luego son copiados a la pantalla a través de llamadas al método drawImage de Graphics2D. Las clases BufferedImage y BufferedImageOp también permiten realizar una gran variedad de operaciones de filtrado de imágenes como blur. El modelo de imagen productor/consumidor proporcionado en las versiones anteriores del JDK sigue siendo soportado por razones de compatibilidad. Impresión Todos los gráficos del AWT y de Java 2D, incluidos los gráficos compuestos y las imágenes, pueden ser dibujadas en una impresora usando el API de Java 2D. Este API proporciona características de composición de documentos que nos permite realizar dichas operaciones como cambiar el orden de impresión de las páginas. Dibujar en la impresora es como dibujar en la pantalla. El sistema de impresión controla cuando se dibujan las páginas, como lo hace el sistema gráfico de la pantalla cuando un componente se dibuja en la pantalla. Nuestra aplicación proporciona al sistema de impresión la información sobre el documento a imprimir, y el sistema de impresión determina cuando necesita dibujar cada página. Cuando las páginas necesitan ser dibujadas, el sistema de impresión llama al método print de la aplicación con el contexto Graphics apropiado. Para usar las características del API 2D de Java en la impresión, debemos forzar el objeto Graphics a un objeto Graphics2D, igual que se hace cuando se dibuja en la pantalla.
  • 12. Mostrar Gráficos con Graphics2D Nos muestra cómo usar Graphics2D para mostrar gráficos con líneas exteriores, estilos de relleno, transformación de gráficos mientras son dibujados, con restricción de dibujo en un área particular y generalmente controla la forma y aspecto de los gráficos.  Punteado y Relleno de Gráficos Primitivos  Quad  Cubic  Dibujar formas arbitrarias  Odd_Shape  Definir Estilos de línea divertidos y Patrones de relleno.  Estilos de Línea  Patrón de Relleno Punteado y Relleno de Gráficos Primitivos Cambiando el punteado y los atributos de dibujo en el contexto de Graphics2D, antes del dibujo, podemos fácilmente aplicar estilos divertidos de líneas y patrones de relleno para gráficos primitivos. Por ejemplo, podemos dibujar una línea punteada creando el objeto Stroke apropiado y llamando a setStroke para añadirlo al contexto Graphics2D antes de dibujar la línea. De forma similar, podemos aplicar un relleno de gradiente a un Shape creando un objeto GradientPaint y añadiendo al contexto Graphics2D llamando a setPaint antes de dibujar la Shape. GradientePaint Stroke Formas geométricas usando los métodos Graphics2D draw y fill.
  • 13. Estilos de Línea Los estilos de línea están definidos por el atributo stroke en el contexto Graphics2D. Para seleccionar el atributo stroke podemos crear un objeto BasicStroke y pasarlo dentro del método Graphics2D setStroke. Un objeto BasicStroke contiene información sobre la anchura de la línea, estilo de uniones, estilos finales, y estilo de punteado. Esta información se usa cuando se dibuja un Shape con el método draw. BasicStroke soporta tres estilos de unión: JOIN_BEVEL JOIN_MITER JOIN_ROUND El estilo de finales es la decoración que se aplica cuando un segmento de línea termina. BasicStroke soporta tres estilos de finalización: CAP_BUTT CAP_ROUND CAP_SQUARE Patrón de Relleno Los patrones de rellenos están definidos por el atributo paint en el contexto Graphics2D. Para seleccionar el atributo paint, se crea un ejemplar de un objeto que implemente el interface Paint y se pasa dentro del método Graphics2D setPaint. Tres clases implementan el interface Paint: Color, GradientPaint, y TexturePaint, GradientPaint y TexturePaint son nuevas en el JDK 1.2.
  • 14. El patrón para una TexturePaint esta definido por un BufferedImage. Para crear un TexturePaint, se especifica una imagen que contiene el patrón y un rectángulo que se usa para replicar y anclar el patrón. StrokeAndFill El applet StrokeAndFill permite al usuario seleccionar un gráfico primitivo, un estilo de línea, un estilo de dibujo y o bien puntear el exterior del objeto, rellenarlo con el dibujo seleccionado, o puntear el objeto en blanco y rellenar el dibujo con el dibujo seleccionado. Los primitivos son inicializados e introducidos en un array de objetos Shape. El siguiente código crea un Rectangle y un Ellipse2D.Double y los introduce en el array shapes. Transformar Formas, Texto e Imágenes Podemos modificar el atributo transform en el contexto Graphics2D para mover, rotar, escalar y modificar gráficos primitivos mientras son dibujados. El atributo transform está definido por un ejemplar de AffineTransform. Graphics2D proporciona varios métodos para cambiar el atributo transform. Podemos construir un nuevo AffineTransform y cambiar el atributo transform de Graphics2D llamando al método setTransform. AffineTransform define los siguientes métodos para hacer más sencilla la construcción de nuevas transformaciones:  getRotateInstance  getScaleInstance  getShearInstance
  • 15. getTranslateInstance De forma alternativa podemos usar uno de los métodos de transformación de Graphics2D para modificar la transformación actual. Cuando se llama a uno de esos métodos de conveniencia, la transformación resultante se concatena con la transformación actual y es aplicada durante el dibujado.  rotate--para especificar un ángulo de rotación en radianes.  scale--para especificar un factor de escala en direcciones x e y.  shear--para especificar un factor de compartición en direcciones x e y  translate--para especificar un desplazamiento de movimiento en direcciones x e y Cuando se elige una opción de transformación, se modifica un ejemplar de AffineTransform y se concatena con una transformación de movimiento que mueve la Shape hacia el centro de la ventana. La transformación resultante se pasa al método setTransform para seleccionar el atributo transform de Graphics2D Recortar la Región de Dibujo Cualquier Shape puede usarse como un path de recortado que restringe las porciones del área de dibujo que serán renderizadas. El path de recortado forma parte del contexto Graphics2D; para seleccionar el atributo clip, se llama a Graphics2D.setClip y se pasa a la Shape que define el path de recortado que queramos usar. Podemos reducir el path de recortado llamando al método clip y pasándolo en otra Shape; el atributo clip se configura a la intersección entre el clip actual y el Shape especificado. ClipImage un path de recortado para revelar diferentes porciones de una imagen:
  • 16. Starry Un área de recortado también puede crearse desde una cadena de texto existente. El siguiente ejemplo crea un TextLayout con la cadena The Starry Night. Luego, obtiene una línea exterior del TextLayout. El método TextLayout.getOutline devuelve un objeto Shape y un Rectangle creado a partir de los límites del objeto Shape. Los límites contienen todos los pixels que layout puede dibujar. El color en el contexto gráfico se selecciona a azul y se dibuja la figura exterior de la forma, como ilustran la siguiente imagen y el fragmento de código. Componer Gráficos La clase AlphaComposite encapsula varios estilos de composición, que determinan cómo se dibujan los objetos solapados. Un AlphaComposite también puede tener un valor alpha que especifica el grado de transparencia: alpha = 1.0 es totalmente opaco, alpha = 0.0 es totalmente transparente. AlphaComposite soporta la mayoria de los estandares de composición como se muestra en la siguiente tabla. Source-over (SRC_OVER) Si los pixels del objeto que está siendo renderizado (la fuente) tienen la misma posición que los pixels renderizados préviamente (el destino), los pixels de la fuente se renderizan sobre los pixels del destino. Source-in (SRC_IN) Si los pixels de la fuente y el destino se solapan, sólo se renderizarán los pixels que haya en el área solapada. Source-out (SRC_OUT) Si los pixels de la fuente y el destino se solapan, sólo se renderizarán los pixels que haya fuera del área solapada. Los pixels que haya en el área solapada se borrarán. Destination-over Si los pixels de la fuente y del destino se solapan, sólo se (DST_OVER) renderizarán los pixels de la fuente que haya fuera del área
  • 17. solapada. Los pixels que haya en el área solapada no se cambian. Destination-in (DST_IN) Si los pixels de la fuente y del destino se solapan, el alpha de la fuente se aplica a los pixels del área solapada del destino. Si el alpha = 1.0, los pixels del área solapada no cambian; si alpha es 0.0 los pixels del área solapada se borrarán. Destination-out (DST_OUT) Si los pixels de la fuente y del destino se solapan, se aplica el alpha de la fuente a los pixels del área solapada del destino. Si el alpha = 1.0, los pixels del área solapada no cambian; si alpha es 0.0 los pixels del área solapada se borrarán. Clear (CLEAR) Si los pixels de la fuente y del destino se solapan, los pixels del área solapada se borrarán. Composite Este programa ilustra los efectos de varias combinaciones de estilos de composición y valores de alpha.
  • 18. Controlar la Calidad del Dibujo Podemos usar el atributo 'rendering hint' de Graphics2D para especificar si queremos que los objetos sean dibujados tan rápido como sea posible o si preferimos que se dibujen con la mayor calidad posible. Para seleccionar o configurar el atributo 'rendering hint', Graphics2D podemos construir un objeto RenderingHints y pasarlo dentro de Graphics2D.setRenderingHints. Si sólo queremos seleccionar un hint, podemos llamar a Graphics2D. setRenderingHint y especificar la pareja clave-valor para el hint que queremos seleccionar. (Estas parejas están definidas en la clase RenderingHints.) RenderingHints soporta los siguientes tipos de hints.  Alpha interpolation--por defecto, calidad, o velocidad.  Antialiasing--por defecto, on, u off  Color rendering-por defecto, calidad, o velocidad  Dithering--por defecto, activado o desactivado  Fractional metrics--por defecto, on u off  Interpolation--vecino más cercano, bilinear, o bicúbico  Rendering--por defecto, calidad, o velocidad  Text antialiasing--por defecto, on u off. Construir Formas Complejas desde Geométricos Primitivos Construir un área geométrica (CAG) es el proceso de crear una nueva forma geométrica realizando operaciones con las ya existentes. En el API Java 2D un tipo especial de Shape llamado Area soporta operaciones booleanas. Podemos construir un Area desde cualquier Shape . Area soporta la siguientes operaciones booleanas: Unión Subtracción
  • 19. Intersección Or-Exclusivo (XOR) Áreas En este ejemplo, los objetos Area construyen una forma de pera partiendo de varias elipses. Soportar Interacción con el Usuario Para permitir que el usuario interactúe con los graficos que hemos dibujado, necesitamos poder determinar cuando el usuario pulsa sobre uno de ellos. El método hit de Graphics2D proporciona una forma para determinar fácilmente si ha ocurrido una pulsación de ratón sobre una Shape particular. De forma alternativa podemos obtener la posición del click de ratón y llamar a contains sobre la Shape para determinar si el click ocurrió dentro de los límites de la Shape. ShapeMover Este applet permite al usuario arrastrar la Shape por la ventana del applet. La Shape se redibuja en cada nueva posición del ratón para proporcionar información al usuario mientras la arrastra.
  • 20. Dibujar Múltiples Líneas de Texto Si tenemos un párrafo de texto con estilo que queremos que quepa dentro de una anchura especifica, podemos usar LineBreakMeasurer, que permite que el texto con estilo se rompa en líneas que caben dentro de un espacio visual. Como hemos aprendido en Mostrar Gráficos con Graphics2D, un objeto TextLayout representa datos de caracteres con estilo, que no se pueden cambiar, pero también permite acceder a la información de distribución. Los métodos getAscent y getDescent de TextLayout devuelven información sobre la fuente usada para posicionar las líneas en el componente. El texto se almacena como un AttributedCharacterIterator para que los atributos de fuente y tamaño de punto puedan ser almacenados con el texto. Ejemplo: LineBreakSample El siguiente applet posiciona un párrafo de texto con estilo dentro de un componente, usando LineBreakMeasurer, TextLayout y AttributedCharacterIterator.
  • 21. Impresión en Java Java 2D controla en forma general el proceso de impresión, al igual que también controla cómo y cuándo pueden dibujar los programas, nuestras aplicaciones proporcionan información sobre el documento a imprimir, y el sistema de impresión determina cuando necesita renderizar cada página. Este modelo de impresión permite soportar una amplio rango de impresoras y de sistemas. Incluso permite al usuario imprimir en una impresora de bitmaps desde un ordenador que no tiene suficiente memoria o espacio en disco para contener el mapa de bits de una página completa. En esta situación el sistema de impresión le pedirá a nuesta aplicación que renderize la página de forma repetida para que pueda ser imprimida como una serie de pequeñas imágenes. Para soportar impresión, una apliación necesita realizar dos tareas.  Job control--manejar el trabajo de impresión  Imaging--renderizar las páginas a imprimir Job Control Aunque el sistema controla todo el proceso de impresión, nuestra aplicación tiene que obtener la oportunidad de configurar un PrinterJob. El PrinterJob , el punto clave del control del proceso de impresión, almacena las propiedades del trabajo de impresión, controla la visión de los diálogos de impresión y se usa para inicializar la impresión. Para dirigir el PrinterJob a través del proceso de impresión, nuestra aplicación necesita 1. Obtener un PrinterJob llamando a PrinterJob.getPrinterJob 2. Decirle al PrinterJob dónde está el código de dibujo llamando a setPrintable o setPageable 3. Si se desea, mostrar los diálogos de configuración de página e impresión llamando a pageDialog y printDialog Iniciar la impresión llamando a print