Java 2D es una API que permite dibujar gráficos en Java, incluyendo texto, imágenes, formas geométricas como líneas, curvas, rectángulos y elipses. Ofrece características como transformaciones, pinceles, composiciones y renderizado para crear interfaces gráficas, programas de dibujo y editores de imágenes.
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