Gráficos Con Java 2D - Juan Antonio Palos

download Gráficos Con Java 2D - Juan Antonio Palos

of 120

Transcript of Gráficos Con Java 2D - Juan Antonio Palos

  • TutorJava recomienda...

    Grficos con Java 2DAutor-Traductor: Juan Antonio Palos (Ozito)Puedes encontrar la Version Original en Ingles en ( http://java.sun.com)Leer comentarios (0) | Escribir comentario | Puntuacin: (1 voto) Vota

    Indice de contenidosGrficos en 2 Dimensionesl Introduccin al API 2D de Javal Renderizado en Java 2D

    Contexto de Renderizado de Graphics2Dm Mtodos de renderizado de Graphics2Dm

    l

    Sistema de Coordenadasl Formas 2D

    Formas Rectangularesm QuadCurve2D y CubicCurve2Dm GeneralPathm Areasm

    l

    Texto en Java 2DFuentesm Distribucin de Textom

    l

    Imgenesl Impresinl Mostrar Grficos con Graphics2Dl Punteado y Relleno de Grficos Primitivos

    Dibujar Curvasm Ejemplo: Quadm Ejemplo: Cubicm Dibujar formas arbitrariasm Ejemplo: Odd_Shapem Definir Estilos de lnea divertidos y Patrones de relleno.m Estilos de Lneam Patrn de Rellenom Ejemplo: StrokeAndFillm

    l

    Transformar Formas, Texto e ImgenesEjemplo: Transformm

    l

    Recortar la Regin de DibujoEjemplo: ClipImagem Ejemplo: Starrym

    l

    Componer GrficosEjemplo: Compositem

    l

    Controlar la Calidad del Dibujol Construir Formas Complejas desde Geomtricos Primitivos

    Ejemplo: Areasm l

  • Soportar Interaccin con el UsuarioEjemplo: ShapeMoverm Ejemplo: HitTestSamplem

    l

    Trabajar con Texto y FuentesCrear y Derivar Fuentesm Dibujar Mltiples Lneas de Textom

    l

    Crear y Derivar FuentesEjemplo: FontSelectionm

    l

    Dibujar Mltiples Lneas de TextoEjemplo: LineBreakSamplem

    l

    Mostrar y Manipular ImgenesModo Inmediato con BufferedImagem Filtrado y BufferedImagem Usar un BufferedImage para doble bufferm

    l

    Modo Inmediato con BufferedImagel Filtrar un BufferedImage

    Ejemplo: ImageOpsm l

    Usar un BufferedImage para Doble BufferEjemplo: BufferedShapeMoverm

    l

    Imprimir en JavaIntroduccin a la Impresin en Javam Imprimir los Contenidos de un Componentem Mostrar el dilogo 'Page Setup'm Imprimir una Coleccin de Pginasm

    l

    Introduccin a la Impresin en JavaJob Controlm Imagingm Printable Jobsm Pageable Jobsm

    l

    Imprimir los Contenidos de un ComponenteEjemplo: ShapesPrintm

    l

    Mostrar el Dilogo de Configuracin de Pginal Imprimir una Coleccin de Pginas

    Ejemplo: SimpleBookm l

    Problemas Ms Comunes en los Grficos en Java 2Dl

    Leer comentarios (0) | Escribir comentario | Puntuacin: (1 voto) Vota

  • TutorJava recomienda...

    Grficos con Java 2D

    En esta pgina:Grficos en 2 Dimensionesl

    Grficos en 2 Dimensiones

    Esta seccin nos presenta el API 2D de Java y no ensea como mostrar e imprimir grficos en 2dimensiones en nuestros programas Java. El API 2D de Java nos permite fcilmente:

    Dibujar lneas de cualquier anchural Rellenar formas con gradientes y texturasl Mover, rotar, escalar y recortar texto y grficos.l Componer texto y grficos solapados.l

    Por ejemplo, podramos usar el API 2D de Java para mostrar grficos y charts complejos que usanvarios estilos de lnea y de relleno para distinguir conjuntos de datos, como se muestra en lasiguiente figura:

    El API 2D de Java tambin nos permite almacenar datos de imgenes--por ejemplo, podemosrealizar fcilmente filtros de imgenes, como blur o recortado, como se muestra en la siguientefigura:

    Esta ruta cubre los usos ms frecuentes del API 2D de Java y describe brevemente algunas de lascaractersticas ms avanzadas. Para ms informacin sobre el uso del API 2D de Java, puedes verJava 2D Programmer's Guide.

    Introduccin al API 2D de Java presenta los conceptos claves del 2D y describe su modelo dedibujado.

    Mostrar Grficos con Graphics2D nos ensea como configurar el contexto de dibujado Graphics2Dpara usar estilos de punteado y relleno divertidos, realizar transformaciones, recortar la regin dedibujo, componer grficos solapados, y especificar preferencias de dibujado.

    Trabajar con Texto y Fuentes muestra como usar un objeto Font para crear una fuente con losatributos deseados, y para deribar una nueva fuente cambiando los atributos, determinar losnombres de las fuentes que estn disponibles en nuestro sistema y la posicin del texto dentro deun componente.

    Manipular y Mostrar Imgenes esta leccin explica como implementar doble buffer y cmo realizaroperaciones de filtrado de imgenes con objetos BufferedImage.

    Imprimir nos ensea como renderizar grficos 2D en una impresora y cmo imprimir documentoscomplejos.

    Resolver Problemas ms Comunes con los Grficos 2D ofrece las soluciones a algunos de losproblemas que nos podramos encontrar al escribir applets y aplicaciones 2D.

  • TutorJava recomienda...

    Grficos con Java 2D

    En esta pgina:Introduccin al API 2D de Javal

    Introduccin al API 2D de Java

    El API 2D de Java introducido en el JDK 1.2 proporciona grficos avanzados en dos dimensiones,texto, y capacidades de manejo de imgenes para los programas Java a travs de la extensin delAWT. Este paquete de rendering soporta lneas artsticas, texto e imgenes en un marco de trabajoflexible y lleno de potencia para desarrollar interfaces de usuario, programas de dibujo sofisticadosy editores de imgenes.

    El API 2D de Java proporciona:

    Un modelo de renderizado uniforme para pantallas e impresoras.l Un amplio conjunto de grficos primitivos geomtricos, como curvas, rectngulos, y elipses y unmecanismo para renderizar virtualmente cualquier forma geomtrica.

    l

    Mecanismos para detectar esquinas de formas, texto e imgenes.l Un modelo de composicin que proporciona control sobre cmo se renderizan los objetos solapados.l Soporte de color mejorado que facilita su manejo.l Soporte para imprimir documentos complejos.l

    Estos tpicos se explican en las siguiente pginas.

  • TutorJava recomienda...

    Grficos con Java 2D

    En esta pgina:Renderizado en Java 2D

    Contexto de Renderizado de Graphics2Dm

    Mtodos de renderizado de Graphics2Dm

    l

    Renderizado en Java 2D

    El mecanismo de renderizado bsico es el mismo que en las versiones anteriores del JDK -- elsistema de dibujo controla cundo y cmo dibuja un programa. Cuando un componente necesita sermostrado, se llama automticamente a su mtodo paint o update dentro del contexto Graphicsapropiado.

    El API 2D de Java presenta java.awt.Graphics2D, un nuevo tipo de objeto Graphics. Graphics2Ddesciende de la clase Graphics para proporcionar acceso a las caractersticas avanzadas derenderizado del API 2D de Java.

    Para usar las caractersticas del API 2D de Java, tenemos que forzar el objeto Graphics pasado almtodo de dibujo de un componente a un objeto Graphics2D.

    public void Paint (Graphics g) { Graphics2D g2 = (Graphics2D) g; ...

    }

    Contexto de Renderizado de Graphics2D

    Al conjunto de atributos de estado asociados con un objeto Graphics2D se le conoce comoContexto de Renderizado de Graphics2D. Para mostrar texto, formas o imgenes, podemosconfigurar este contexto y luego llamar a uno de los mtodos de renderizado de la claseGraphics2D, como draw o fill . Cmo muestra la siguiente figura, el contexto de renderizado deGraphics2D contiene varios atributos.

    El estilo de lpiz que se aplica al exterior de una forma. Este atributo stroke nospermite dibujar lneas con cualquier tamao de punto y patrn de sombreado yaplicar finalizadores y decoraciones a la lnea.

    El estilo de relleno que se aplica al interior de la forma. Este atributo paint nospermite rellenar formas con clores slidos, gradientes o patrones.

    El estilo de composicin se utiliza cuando los objetos dibujados se solapan conobjetos existentes.

  • La transformacin que se aplica durante el dibujado para convertir el objetodibujado desde el espacio de usuario a las coordenadas de espacio del dispositivo.Tambin se pueden aplicar otras transformaciones opcionales como la traduccin,rotacin escalado, recortado, a travs de este atributo.

    El Clip que restringe el dibujado al rea dentro de los bordes de la Shape se utilizapara 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 ycalidad. Por ejemplo, podemos especificar si se debera usar antialiasing, si estdisponible.

    Para configurar un atributo en el contexto de renderizado de Graphics2D, se usan los mtodos setAttribute.

    setStrokel setPaintl setCompositel setTransforml setClipl setFontl setRenderingHintsl

    Cuando configuramos un atributo, se el pasa al objeto el atributo apropiado. Por ejemplo, paracambiar el atributo paint a un relleno de gradiente azul-gris, deberamos construir el objetoGradientPaint 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 unobjeto atributo que forma parte del contexto Graphics2D, necesitamos llamar al mtodo set paranotificarlo al contexto. La modificacin de un atributo de un objeto durante el renderizado puedecausar comportamientos impredecibles.

    Mtodos de renderizado de Graphics2D

    Graphics2D proporciona los siguientes mtodos generales de dibujado que pueden usarser paradibujar cualquier primitivo geomtrico, texto o imagen.

    draw--dibuja el exterior de una forma geomtrica primitiva usando los atributos stroke y paint.l fill--dibuja cualquier forma geomtrica primitiva rellenado su interior con el color o patrnespecificado por el atributo paint.

    l

    drawString--dibuja cualquier cadena de texto. El atributo font se usa para convertir la fuente a glyphsque luego se rellenan con el color o patrn especificados por el atributo paint.

    l

    drawImage--dibuja la imagen especificada.l Adems, Graphics2D soporta los mtodos de renderizado de Graphics para formas particulares,como drawOval y fillRect.

  • TutorJava recomienda...

    Grficos con Java 2D

    En esta pgina:Sistema de Coordenadasl

    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 grficos primitivos.l El espacio de dispositivo es el sistema de coordenadas para un diopositivo de salida, como unapantalla, una ventana o una impresora.

    l

    El espacio de usuario es un sistema de coordenadas lgicas independiente del dispositivo: el espaciode coordenas que usan nuestros programas. Todos los geomtricos pasados a las rutinas Java 2Dde renderizado se especifican en coordenadas de espacio de usuario.

    Cuando se utiliza la transformacin por defecto desde el espacio de usuario al espacio dedispositivo, el origen del espacio de usuario es la esquina superior izquierda del rea de dibujo delcomponente. La coordena X se incrementa hacia la derecha, y la coordena Y hacia abajo.

    El espacio de dispositivo es un sistema de coordenadas dependiente del dispositivo que vara deacuerdo a la fuente del dispositivo. Aunque el sistema de coordenas para una ventana o unapantalla podra ser muy distinto que para una impresora, estas diferencias son invisibles para losprogramas Java. Las conversiones necesarias entre el espacio de usuario y el espacio de dispositivose realizan automticamente durante el dibujado.

  • TutorJava recomienda...

    Grficos con Java 2D

    En esta pgina:Formas 2D

    Formas Rectangularesm

    QuadCurve2D y CubicCurve2Dm

    GeneralPathm

    Areasm

    l

    Formas 2D

    Las clases del paquete java.awt.geom definen grficos primitivos comunes, como puntos, lneas,curvas, arcos, rectngulos y elipses.

    Clases en el paquete java.awt.geom

    Arc2D Ellipse2D QuadCurve2D

    Area GeneralPath Rectangle2D

    CubicCurve2D Line2D RectangularShape

    Dimension2D Point2D RoundRectangle2D

    Excepto para Point2D y Dimension2D, cada una de las otras clases geomtricas implementa elinterface Shape, que proporciona un conjunto de mtodos comunes para describir e inspeccionarobjetos geomtricos bi-dimensionales.

    Con estas clases podemos crear de forma virtual cualquiere forma geomtrica y dibujarla a travsde Graphics2D llamando al mtodo draw o al mtodo fill. Por ejemplo, las formas geomtricas delsiguiente applet estn definidas usando los geomtricos bsicos de Java 2D.

    Si tienes curiosidad, el cdigo del programa est en ShapesDemo2D.java. La forma de dibujar yrellenar formas se describe en la siguiente leccin Mostrar Grficos con Graphics2D.

    Formas Rectangulares

    Los primitivos Rectangle2D, RoundRectangle2D, Arc2D, y Ellipse2D descienden delRectangularShape, que define mtodos para objetos Shape que pueden ser descritos por unacaja rectngular. La geometra de un RectangularShape puede ser extrapolada desde unrectngulo que encierra completamente el exterior de la Shape.

  • QuadCurve2D y CubicCurve2DLa clase QuadCurve2D nos permite crear segmentos de curvas cuadrticos. Una curva cuadrticaest definida por dos puntos finales y un punto de control.

    La clase CubicCurve2D nos permite crear segmentos de curvas cbicos. Una curva cbica estdefinida por dos puntos finales y dos puntos de control. Las siguientes figuras muestran ejemplos decurvas cuadrticas y cbicas.

    GeneralPath

    La clase GeneralPath nos permite crear una curva arbitraria especificando una serie de posicionesa lo largo de los lmites de la forma. Estas posiciones pueden ser conectadas por segmentos delnea, curvas cuadrticas o curvas cbicas. La siguiente figura puede ser creada con 3 segmentos delnea y una curva cbica.

    Areas

    Con la clase Area podemos realizar operaciones boolenas, como uniones, intersecciones ysubstracciones, sobre dos objetos Shape cualesquiera. Esta tcnica, nos permite crear rpidamenteobjetos Shape complejos sin tener que describir cada lnea de segmento o cada curva.

  • TutorJava recomienda...

    Grficos con Java 2D

    En esta pgina:Texto en Java 2D

    Fuentesm

    Distribucin de Textom

    l

    Texto en Java 2D

    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 utilizaun componente de texto, mucho del trabajo lo hacen por nosotros--por ejemplo, los objetosJTextComponent proporcionan soporte interno para chequeo de pulsaciones y para mostrar textointernacional.

    Si queremos mostrar una cadena de texto esttica, podemos dibujarla directamente a travs deGraphics2D usando el mtodo drawString. Para especificar la fuente, podemos usar el mtodosetFont de Graphics2D.

    Si queremos implementar nuestras propias rutinas de edicin de texto o necesitamos ms controlsobre la distribuccin del texto que la que proporcionan los componentes de texto, podemos usarlas 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 combinacin de caracteres podra ser representada como uno o msglyphs. Por ejemplo, podra ser representado por dos glyphs, mientras que la ligadura fi podraser representada por un slo glyph.

    Se puede pensar en una fuente como en una coleccin de glyphs. Una sola fuente podra tenermuchas caras, como pesada, mdia, oblqua, gtica y regular, Todas las caras de una fuente tienencaractersticas tipogrficas similares y pueden ser reconocidas como miembros de la misma familia.En otras palabras, una coleccin de glyphs con un estilo particular forma una cara de fuente; yuna coleccin de caras de fuentes forman una familia de fuentes; y el conjunto de familias defuentes forman el juego de fuentes disponibles en el sistema.

    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 mtodo estticoGraphicsEnvironment.getLocalGraphicsEnvironment y preguntando al GraphicsEnvironmentdevuelto. El mtodo getAllFonts devuelve un array que contiene ejemplares Font para todas lasfuentes disponibles en el sistema; getAvailableFontFamilyNames devuelve una lista de lasfamilias de fuentes disponibles.

    GraphicsEnvironment tambin describe la coleccin de dispositivos de dibujo de la plataforma,como pantallas e impresoras, que un programa Java puede utilizar. Esta informacin es usadacuando el sistema realiza la conversin del espacio de usuario al espacio de dispositivo durante eldibujo.

    Nota:

    En el JDK 1.1, las fuentes se describan con nombres lgicos que eran mapeados en diferentescaras de fuentes, dependiendo de las fuentes que estaban disponibles en una plataformaparticular. Por razones de compatibilidad, Graphics2D tambin soporta la especificacin defuentes por el nombre lgico. Para obtener una lista de los nombres lgicos de la fuentes, sepuede llamar a java.awt.Toolkit.getFontList.

    Distribucin de Texto

    Antes de poder mostrar el texto, debe ser distribuido para que los caracteres sean representadospor los glyphs apropiados en las posiciones apropiadas. Si estamos usando Swing, podemos dejarque JLabel o JTextComponent manejen la distribucin de texto por nosotros. JTextComponent

  • soporta texto bidireccional y est diseada para manejar las necesidades de la mayora de lasaplicaciones internacionales. Para ms informacin sobre el uso de los componentes de texto Swing,puedes ver Usar Componentes de Texto.

    Si no estamos usando un componente de texto Swing para mostrar el texto automticamente,podemos usar uno de los mecanismos de Java 2D para manejar la distribucin de texto.

    Si queremos implementar nuestras propias rutinas de edicin de texto, podemos usar la claseTextLayout para manejar la distribucin de texto, iluminacin y deteccin de pulsacin. Lasfacilidades proporcionadas por TextLayout manejan muchos casos comunes, incluyendo cadenas confuentes mezcladas, lenguajes mezclados y texto bidireccinal. Para ms informacin sobreTextLayout, puedes ver Manejar la disttribucin de Texto.

    l

    Si queremos un control total sobre la forma y posicin de nuestro texto, podemos construir nuestropropio objeto GlyphVector usando Font y renderizando cada GlyphVector a travs de Graphics2D.Para ms informacin sobre la implementacin de nuestro propio mecanismo de distribucin de texto,puedes ver Implementar un Mecanismo Personalizado de Distribucin de Texto

    l

  • TutorJava recomienda...

    Grficos con Java 2D

    En esta pgina:Imgenesl

    Imgenes

    El API 2D de Java implementa un nuevo modelo de imagen que soporta la manipulacin deimgenes de resolucin fija almacenadas en memoria. Una nueva clase Image en el paquetejava.awt.image, se puede usar BufferedImage, para manipular datos de una imagenrecuperados desde un fichero o una URL. Por ejemplo, se puede usar un BufferedImage paraimplementar doble buffer -- los elementos grficos son dibujados fuera de la pantalla en elBufferedImage y luego son copiados a la pantalla a travs de llamadas al mtodo drawImage deGraphics2D. Las clases BufferedImage y BufferedImageOp tambin permiten realizar una granvariedad de operaciones de filtrado de imgenes como blur. El modelo de imagenproductor/consumidor proporcionado en las versiones anteriores del JDK sigue siendo soportado porrazones de compatibilidad.

  • TutorJava recomienda...

    Grficos con Java 2D

    En esta pgina:Impresinl

    Impresin

    Todos los grficos del AWT y de Java 2D, incluidos los grficos compuestos y las imgenes, puedenser dibujadas en una impresora usando el API de Java 2D. Este API proporciona caractersticas decomposicin de documentos que nos permite realizar dichas operaciones como cambiar el orden deimpresin de las pginas.

    Dibujar en la impresora es como dibujar en la pantalla. El sistema de impresin controla cuando sedibujan las pginas, como lo hace el sistema grfico de la pantalla cuando un componente se dibujaen la pantalla.

    Nuestra aplicacin proporciona al sistema de impresin la informacin sobre el documento aimprimir, y el sistema de impresin determina cuando necesita dibujar cada pgina. Cuando laspginas necesitan ser dibujadas, el sistema de impresin llama al mtodo print de la aplicacin conel contexto Graphics apropiado. Para usar las caractersticas del API 2D de Java en la impresin,debemos forzar el objeto Graphics a un objeto Graphics2D, igual que se hace cuando se dibuja enla pantalla.

  • TutorJava recomienda...

    Grficos con Java 2D

    En esta pgina:Mostrar Grficos con Graphics2Dl

    Mostrar Grficos con Graphics2D

    Esta leccin nos muestra cmo usar Graphics2D para mostrar grficos con lneas exteriores, estilosde relleno, transformacin de grficos mientras son dibujados, con restriccin de dibujo en un reaparticular y generalmente controla la forma y aspecto de los grficos. Tambin aprenderemos cmocrear objetos complejos combinando algunos simples y cmo detectar cuando el usuario pulsa sobreun grfico primitivo. Estos tpicos se describen en las siguientes pginas.

  • TutorJava recomienda...

    Grficos con Java 2D

    En esta pgina:Punteado y Relleno de Grficos Primitivos

    Dibujar Curvasm

    Ejemplo: Quadm

    Ejemplo: Cubicm

    Dibujar formas arbitrariasm

    Ejemplo: Odd_Shapem

    Definir Estilos de lnea divertidos y Patrones de relleno.m

    Estilos de Lneam

    Patrn de Rellenom

    Ejemplo: StrokeAndFillm

    l

    Punteado y Relleno de Grficos Primitivos

    Cambiando el punteado y los atributos de dibujo en el contexto de Graphics2D, antes del dibujo,podemos fcilmente aplicar estilos divertidos de lneas y patrones de relleno para grficosprimitivos. Por ejemplo, podemos dibujar una lnea punteada creando el objeto Stroke apropiado yllamando a setStroke para aadirlo al contexto Graphics2D antes de dibujar la lnea. De formasimilar, podemos aplicar un relleno de gradiente a un Shape creando un objeto GradientPaint yaadiendo al contexto Graphics2D llamando a setPaint antes de dibujar la Shape.

    El siguiente applet demuestra cmo podemos dibujar formas geomtricas usando los mtodosGraphics2D draw y fill.

    Esta es una imagen del GUI del applet. Para ajecutar el applet, pulsa sobre ella. El appletaparecer en una nueva ventana del navegador.

    ShapesDemo2D.java contiene el cdigo completo de este applet.

    Cada una de las formas dibujadas por el applet est construida de geometras y est dibujada a

  • travs de Graphics2D. Las variables rectHeight y rectWidth de este ejemplo definen lasdimensiones del espacio en que se dibuja cada forma, en pixels. La variables x e y cambian paracada forma para que sean dibujadas en formacin de parrilla.

    // draw Line2D.Doubleg2.draw(new Line2D.Double(x, y+rectHeight-1, x + rectWidth, y));

    // draw Rectangle2D.Doubleg2.setStroke(stroke);g2.draw(new Rectangle2D.Double(x, y, rectWidth, rectHeight));

    // draw RoundRectangle2D.Doubleg2.setStroke(dashed);g2.draw(new RoundRectangle2D.Double(x, y, rectWidth, rectHeight, 10, 10));

    // draw Arc2D.Doubleg2.setStroke(wideStroke);g2.draw(new Arc2D.Double(x, y, rectWidth, rectHeight, 90, 135, Arc2D.OPEN));

    // draw Ellipse2D.Doubleg2.setStroke(stroke);g2.draw(new Ellipse2D.Double(x, y, rectWidth, rectHeight));

    // draw GeneralPath (polygon)int x1Points[] = {x, x+rectWidth, x, x+rectWidth};int y1Points[] = {y, y+rectHeight, y+rectHeight, y};GeneralPath polygon = new GeneralPath(GeneralPath.WIND_EVEN_ODD, x1Points.length);polygon.moveTo(x1Points[0], y1Points[0]);

    for (int index = 1; index < x1Points.length; index++) { polygon.lineTo(x1Points[index], y1Points[index]);};

    polygon.closePath();g2.draw(polygon);

    // draw GeneralPath (polyline)int x2Points[] = {x, x+rectWidth, x, x+rectWidth};int y2Points[] = {y, y+rectHeight, y+rectHeight, y};GeneralPath polyline = new GeneralPath(GeneralPath.WIND_EVEN_ODD, x2Points.length);

    polyline.moveTo (x2Points[0], y2Points[0]);

    for (int index = 1; index < x2Points.length; index++) { polyline.lineTo(x2Points[index], y2Points[index]);};

  • g2.draw(polyline);

    // fill Rectangle2D.Double (red)g2.setPaint(red);g2.fill(new Rectangle2D.Double(x, y, rectWidth, rectHeight));

    // fill RoundRectangle2D.Doubleg2.setPaint(redtowhite);g2.fill(new RoundRectangle2D.Double(x, y, rectWidth, rectHeight, 10, 10));

    // fill Arc2Dg2.setPaint(red);g2.fill(new Arc2D.Double(x, y, rectWidth, rectHeight, 90, 135, Arc2D.OPEN));

    // fill Ellipse2D.Doubleg2.setPaint(redtowhite);g2.fill (new Ellipse2D.Double(x, y, rectWidth, rectHeight));

    // fill and stroke GeneralPathint x3Points[] = {x, x+rectWidth, x, x+rectWidth};int y3Points[] = {y, y+rectHeight, y+rectHeight, y};

    GeneralPath filledPolygon = new GeneralPath(GeneralPath.WIND_EVEN_ODD, x3Points.length);filledPolygon.moveTo(x3Points[0], y3Points[0]);

    for (int index = 1; index < x3Points.length; index++) { filledPolygon.lineTo(x3Points[index], y3Points[index]);

    };filledPolygon.closePath();g2.setPaint(red);g2.fill(filledPolygon);

    Observa que este ejemplo usa implementaciones de doble precision de las clases geomtricas.Donde sea posible, las implementaciones de los float y doble precisin de cada geomtrico estnproporcionados por clases internas.

    Dibujar CurvasLos applets Cubic y Quad demuestran como crear curvas cbicas y cuadrticas usandoCubicCurve2D y QuadCurve2D. Estos applets tambin demuestran como se dibujan las curvascon respecto al posicionamiento de los puntos de control permitiendonos mover interactivamentetanto los puntos de control como los puntos finales.

    Ejemplo: QuadEl applet Quad demuestra una curva cuadrtica, que es un segmento de curva que tiene dos puntosfinales y un nico punto de control. El punto de control determina la forma de la curva controlandotanto el punto de control como los vectores tangenciales de los puntos finales.

  • Esta es una imagen del GUI del applet. Para ajecutar el applet, pulsa sobre ella. El appletaparecer en una nueva ventana del navegador.

    Quad.java contiene el cdigo completo de este applet.

    Primero se crea una nueva curva cuadrtica con dos puntos finales y un punto de control y lasposiciones de los puntos se seleccionan con respecto al tamao de la ventana.

    QuadCurve2D.Double quad = new QuadCurve2D.Double();

    Point2D.Double start, end, control;start = new Point2D.Double();one = new Point2D.Double();control = new Point2D.Double();

    quad.setCurve(start, one, control);

    start.setLocation(w/2-50, h/2);end.setLocation(w/2+50, h/2);control.setLocation((int)(start.x)+50, (int)(start.y)-50);Cada vez que el usuario mueva uno de los puntos, la curva se resetear.

    quad.setCurve(start, control, end);

    Ejemplo: CubicEl ejemplo Cubic muestra una curva cbica, que es un segmento de curva que tiene dos puntosfinales y dos puntos de control. Cada punto de control determina la forma de la curva mediante elcontrol de uno de los vectores tangenciales de un punto final. En el ejemplo Cubic, las crucescoloreadas se dibujan donde se encuentran los puntos de control y los puntos finales. El punto decontrol azul controla el punto final rojo y el punto de control verde controla el punto final magenta.

  • Esta es una imagen del GUI del applet. Para ajecutar el applet, pulsa sobre ella. El appletaparecer en una nueva ventana del navegador.

    Cubic.java contiene el cdigo completo de este applet.

    Una curva cbica se crea con dos puntos finales y dos puntos de control y las localizaciones de lospuntos se seleccionan con respecto al tamao de la ventana.

    CubicCurve2D.Double cubic = new CubicCurve2D.Double();

    Point2D.Double start, end, one, two;start = new Point2D.Double();one = new Point2D.Double();two = new Point2D.Double();end = new Point2D.Double();

    cubic.setCurve(start, one, two, end);

    ...

    start.setLocation(w/2-50, h/2);end.setLocation(w/2+50, h/2);one.setLocation((int)(start.x)+25, (int)(start.y)-25);two.setLocation((int)(end.x)-25, (int)(end.y)+25);Como en el ejemplo Quad, la curva es reseteada cada vez que se mueven los puntos.

    cubic.setCurve(start, one, two, end);

    Dibujar formas arbitrariasEl ejemplo ShapesDemo usa GeneralPath para hacer polgonos en forma de cristales, perotambien podemos usar GeneralPath para hacer formas arbitrarias tanto con lneas rectas comocurvas.

    Ejemplo: Odd_ShapeEl ejemplo Odd_Shape usa GeneralPath para crear formas arbitrarias en la seccin Formas.

    Esta es una imagen del GUI del applet. Para ajecutar el applet, pulsa sobre ella. El appletaparecer en una nueva ventana del navegador.

    Odd_Shape.java contiene el cdigo completo de este applet.

    El siguiente cdigo crea un nuevo GeneralPath y aade el primer punto al path.

    GeneralPath oddShape = new GeneralPath();...

    x = w/2 + 50;y = h/2 - 25;

    x2 = x;y2 = y;

    oddShape.moveTo(x, y);

  • Despus de aadir el primer punto al path, se aaden tres lneas rectas.

    x -= 100;oddShape.lineTo(x, y);y += 50;oddShape.lineTo(x, y);x += 100;oddShape.lineTo(x, y);Finalmente, se aade una curva cbica.

    x += 10;y -= 10;x1 = x - 20;y1 = y - 20;oddShape.curveTo(x, y, x1, y1, x2, y2);

    Definir Estilos de lnea divertidos y Patrones de relleno.

    Probablemente habrs observado en el ejemplo anterior algunas de las formas tienen lneaspunteadas o estn rellenas con gradientes de dos colores. Usando las clases Stroke y Paint deJava 2D, podemos fcilmente definir estilos de lnea divertidos y patrones de relleno.

    Estilos de Lnea

    Los estilos de lnea estn definidos por el atributo stroke en el contexto Graphics2D. Paraseleccionar el atributo stroke podemos crear un objeto BasicStroke y pasarlo dentro del mtodoGraphics2D setStroke.

    Un objeto BasicStroke contiene informacin sobre la anchura de la lnea, estilo de uniones, estilosfinales, y estilo de punteado. Esta informacin se usa cuando se dibuja un Shape con el mtododraw.

    La anchura de lnea es la longitud de la lnea medida perpendicularmente a su trayectoria. Laanchura de la lnea se especificada como un valor float en las unidades de coordenadas de usuario,que es equivalente a 1/72 pulgadas cuando se utiliza la transformacin por defecto.

    El estilo de unin es la decoracin que se aplica cuando se encuentran dos segmentos de lnea.BasicStroke soporta tres estilos de unin:.

    JOIN_BEVEL

    JOIN_MITER

    JOIN_ROUND

    El estilo de finales es la decoracin que se aplica cuando un segmento de lnea termina.BasicStroke soporta tres estilos de finalizacin:

    CAP_BUTT

    CAP_ROUND

    CAP_SQUARE

    El estilo de punteado define el patrn de las secciones opacas y transparentes aplicadas a lo largode la longitud de la lnea. Este estilo est definido por un array de punteado y una fase depunteado. El array de punteado define el patrn de punteado. Los elementos alternativos en elarray representan la longitud del punteado y el espacio entre punteados en unidades decoordenadas de usuario.. El elemento 0 representa el primer punteado, el elemento 1 el primerespacio, etc. La fase de punteado es un desplazamiento en el patrn de punteado, tambinespecificado en unidades de coordenadas de usuario. La fase de punteado indica que parte delpatrn de punteado se aplica al principio de la lnea.

    Patrn de Relleno

    Los patrones de rellenos estn definidos por el atributo paint en el contexto Graphics2D. Paraseleccionar el atributo paint, se crea un ejemplar de un objeto que implemente el interface Paint yse pasa dentro del mtodo Graphics2D setPaint.

  • Tres clases implementan el interface Paint: Color, GradientPaint, y TexturePaint .GradientPaint y TexturePaint son nuevas en el JDK 1.2.

    Para crear un GradientPaint, se especifica una posicin inicial y un color y una posicin final y otrocolor. El gradiente cambia proporcionalmente desde un color al otro a lo largo de la lnea queconecta las dos posiciones.

    El patrn para una TexturePaint esta definido por un BufferedImage. Para crear unTexturePaint, se especifica una imagen que contiene el patrn y un rectngulo que se usa parareplicar y anclar el patrn.

    Ejemplo: StrokeAndFillEl applet StrokeAndFill permite al usuario seleccionar un grfico primitivo, un estilo de lnea, unestilo de dibujo y o bien puntear el exterior del objeto, rellenarlo con el dibujo seleccionado, opuntear el objeto en blanco y rellenar el dibujo con el dibujo seleccionado.

    Esta es una imagen del GUI del applet. Para ajecutar el applet, pulsa sobre ella. El appletaparecer en una nueva ventana del navegador.

    StrokeAndFill.java contiene el cdigo completo de este applet.

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

    shapes[0] = new Rectangle(0, 0, 100, 100);shapes[1] = new Ellipse2D.Double(0.0, 0.0, 100.0, 100.0);Para crear un objeto Shape desde una cadena de texto, primero debemos crear un objetoTextLayout desde el texto de la cadena.

    TextLayout textTl = new TextLayout("Text", new Font("Helvetica", 1, 96), new FontRenderContext(null, false, false));

  • Las siguientes lneas transforman el TextLayout para que sea centrado en el origen y luegointroduce el objeto Shape resultante de la llamda a getOutline dentro del array shapes.

    AffineTransform textAt = new AffineTransform();textAt.translate(0, (float)textTl.getBounds().getHeight());shapes[2] = textTl.getOutline(textAt);Podemos elegir un primitivo accediendo al ndice apropiado dentro del array shapes.

    Shape shape = shapes[Transform.primitive.getSelectedIndex()];Cmo se realiza el dibujo dependen de las opciones elegidas.

    Cuando el usuario elige stroke, se llama a Graphics2D.draw para realizar el dibujo, Si se elige textcomo primitivo, las lneas son recuperadas y el dibujo se hace con el mtodo draw.

    l

    Cuando el usuario elige fill, se llama a Graphics2D.fill o Graphics2D.drawString para realizar eldibujado.

    l

    Cuando el usuario elige stroke and fill, se llama a fill o drawString para rellenar el Shape, y luegose llama a draw para dibujar la lnea exterior.

    l

    Nota:

    Para rellenar y puntear un grfico primitivo, necesitamos hacer dos llamadas separadas amtodos: fill o drawString para rellenar el interior, y draw para dibujar el exterior.

    Los tres estilos de lnea usados en este ejemplo -- ancho, estrecho y punteado -- son ejemplares deBasicStroke.

    // Sets the Stroke....

    case 0 : g2.setStroke(new BasicStroke(3.0f)); break;case 1 : g2.setStroke(new BasicStroke(8.0f)); break;case 2 : float dash[] = {10.0f}; g2.setStroke(new BasicStroke(3.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 10.0f, dash, 0.0f)); break;

    El estilo de punteado de este ejemplo tiene 10 unidades de punteado alternados con 10 unidades deespacio. El principio del patrn del punteado se aplica al principio de la lnea -- la fase de punteadoes 0.0.

    En este ejemplo se usan tres estilos de dibujo -- slido, gradiente y polka. El dibujo de color slidoes un ejemplar de Color, el gradiente un ejemplar de GradientPaint, y el patrn un ejemplar deTexturePaint.

    // Sets the Paint....

    case 0 : g2.setPaint(Color.blue); break;case 1 : g2.setPaint(new GradientPaint(0, 0, Color.lightGray, w-250, h, Color.blue, false)); break;case 2 : BufferedImage bi = new BufferedImage(5, 5, BufferedImage.TYPE_INT_RGB); Graphics2D big = bi.createGraphics(); big.setColor(Color.blue); big.fillRect(0, 0, 5, 5); big.setColor(Color.lightGray); big.fillOval(0, 0, 5, 5); Rectangle r = new Rectangle(0,0,5,5); g2.setPaint(new TexturePaint(bi, r)); break;

  • TutorJava recomienda...

    Grficos con Java 2D

    En esta pgina:Transformar Formas, Texto e Imgenes

    Ejemplo: Transformm

    l

    Transformar Formas, Texto e Imgenes

    Podemos modificar el atributo transform en el contexto Graphics2D para mover, rotar, escalar ymodificar grficos primitivos mientras son dibujados. El atributo transform est definido por unejemplar de AffineTransform.

    Graphics2D proporciona varios mtodos para cambiar el atributo transform. Podemos construir unnuevo AffineTransform y cambiar el atributo transform de Graphics2D llamando al mtodosetTransform.

    AffineTransform define los siguientes mtodos para hacer ms sencilla la construccin de nuevastransformaciones:

    getRotateInstancel getScaleInstancel getShearInstancel getTranslateInstancel

    De forma alternativa podemos usar uno de los mtodos de transformacin de Graphics2D paramodificar la transformacin actual. Cuando se llama a uno de esos mtodos de conveniencia, latransformacin resultante se concatena con la transformacin actual y es aplicada durante eldibujado.

    rotate--para especificar un ngulo de rotacin en radianes.l scale--para especificar un factor de escala en direcciones x e y.l shear--para especificar un factor de comparticin en direcciones x e yl translate--para especificar un desplazamiento de movimiento en direcciones x e yl

    Tambin podemos construir directamente un AffineTransform y concatenarlo con latransformacin actual llamando al mtodo transform .

    El mtodo drawImage tambin est sobrecargado para permitirnos especificar unAffineTransform que es aplicado a la imagen a dibujar. Especificar un transform cuando se llama adrawImage no afecta al atributo transform de Graphics2D.

    Ejemplo: TransformEl siguiente programa es el mismo que StrokeandFill, pero tambin permite al usuario elegir unatransformacin para aplicarla al objeto selecciona cuando se dibuje.

  • Esta es una imagen del GUI del applet. Para ajecutar el applet, pulsa sobre ella. El appletaparecer en una nueva ventana del navegador.

    Transform.java contiene el cdigo completo de este applet.

    Cuando se elige una opcin de transformacin, se modifica un ejemplar de AffineTransform y seconcatena con una transformacin de movimiento que mueve la Shape hacia el centro de laventana. La transformacin resultante se pasa al mtodo setTransform para seleccionar el atributotransform de Graphics2D

    switch (Transform.trans.getSelectedIndex()){case 0 : at.setToIdentity(); at.translate(w/2, h/2); break;case 1 : at.rotate(Math.toRadians(45)); break;case 2 : at.scale(0.5, 0.5); break;case 3 : at.shear(0.5, 0.0); break;...

    AffineTransform toCenterAt = new AffineTransform();toCenterAt.concatenate(at);toCenterAt.translate(-(r.width/2), -(r.height/2));g2.setTransform(toCenterAt);

  • TutorJava recomienda...

    Grficos con Java 2D

    En esta pgina:Recortar la Regin de Dibujo

    Ejemplo: ClipImagem

    Ejemplo: Starrym

    l

    Recortar la Regin de DibujoCualquier Shape puede usarse como un path de recortado que restringe las porciones del rea dedibujo que sern renderizadas. El path de recortado forma parte del contexto Graphics2D; paraseleccionar el atributo clip, se llama a Graphics2D.setClip y se pasa a la Shape que define el pathde recortado que queramos usar. Podemos reducir el path de recortado llamando al mtodo clip ypasndolo en otra Shape; el atributo clip se configura a la interseccin entre el clip actual y elShape especificado.

    Ejemplo: ClipImageEste ejemplo anima un path de recortado para revelar diferentes porciones de una imagen:

    Esta es una imagen del GUI del applet. Para ajecutar el applet, pulsa sobre ella. El appletaparecer en una nueva ventana del navegador.

    ClipImage.java contiene todo el cdigo de este applet. El applet requiere el fichero de imagenclouds.jpg.

    El path de recortado est definido por la interseccin de una elipse y un rectngulo cuyasdimensiones son aleatorias. La elipse se pasa al mtodo setClip , y luego se llama al mtodo clippara seleccionar el path de recortado a la interseccin entre la elipse y el rectngulo.

    private Ellipse2D ellipse = new Ellipse2D.Float();private Rectangle2D rect = new Rectangle2D.Float();...

    ellipse.setFrame(x, y, ew, eh);g2.setClip(ellipse);rect.setRect(x+5, y+5, ew-10, eh-10);g2.clip(rect);

    Ejemplo: StarryUn rea de recortado tambin puede crearse desde una cadena de texto existente. El siguienteejemplo crea un TextLayout con la cadena The Starry Night. Luego, obtiene una lnea exterior delTextLayout. El mtodo TextLayout.getOutline devuelve un objeto Shape y un Rectanglecreado a partir de los lmites del objeto Shape. Los lmites contienen todos los pixels que layoutpuede dibujar. El color en el contexto grfico se selecciona a azul y se dibuja la figura exterior de la

  • forma, como ilustran la siguiente imagen y el fragmento de cdigo.

    FontRenderContext frc = g2.getFontRenderContext();Font f = new Font("Helvetica", 1, w/10);String s = new String("The Starry Night");TextLayout tl = new TextLayout(s, f, frc);AffineTransform transform = new AffineTransform();Shape outline = textTl.getOutline(null);Rectangle r = outline.getBounds();transform = g2.getTransform();transform.translate(w/2-(r.width/2), h/2+(r.height/2));g2.transform(transform);g2.setColor(Color.blue);g2.draw(outline);Luego, se selecciona un rea de recortado en el contexto grfico usando el objeto Shape creado apartir de getOutline. La imagen starry.gif, que es una pintura famosa de Van Gogh, The StarryNight, se dibuja dentro de rea de recortado que empieza en la esquina inferior izquierda del objetoRectangle.

    g2.setClip(outline);g2.drawImage(img, r.x, r.y, r.width, r.height, this);

    Esta es una imagen del GUI del applet. Para ajecutar el applet, pulsa sobre ella. El appletaparecer en una nueva ventana del navegador.

    Starry.java contiene el cdigo completo de este programa. El applet requiere el fichero de imagenStarry.gif.

  • TutorJava recomienda...

    Grficos con Java 2D

    En esta pgina:Componer Grficos

    Ejemplo: Compositem

    l

    Componer Grficos

    La clase AlphaComposite encapsula varios estilos de composicin, que determinan cmo sedibujan los objetos solapados. Un AlphaComposite tambin puede tener un valor alpha queespecifica el grado de transparencia: alpha = 1.0 es totalmente opaco, alpha = 0.0 es totalmentetransparente. AlphaComposite soporta la mayoria de los estandares de composicin como semuestra en la siguiente tabla.

    Source-over (SRC_OVER)

    Si los pixels del objeto que est siendo renderizado (la fuente)tienen la misma posicin que los pixels renderizados prviamente(el destino), los pixels de la fuente se renderizan sobre los pixelsdel destino.

    Source-in (SRC_IN)

    Si los pixels de la fuente y el destino se solapan, slo serenderizarn los pixels que haya en el rea solapada.

    Source-out (SRC_OUT)

    Si los pixels de la fuente y el destino se solapan, slo serenderizarn los pixels que haya fuera del rea solapada. Lospixels que haya en el rea solapada se borrarn.

    Destination-over (DST_OVER)

    Si los pixels de la fuente y del destino se solapan, slo serenderizarn los pixels de la fuente que haya fuera del reasolapada. 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 lafuente se aplica a los pixels del rea solapada del destino. Si elalpha = 1.0, los pixels del rea solapada no cambian; si alpha es0.0 los pixels del rea solapada se borrarn.

    Destination-out (DST_OUT)

    Si los pixels de la fuente y del destino se solapan, se aplica elalpha de la fuente a los pixels del rea solapada del destino. Si elalpha = 1.0, los pixels del rea solapada no cambian; si alpha es0.0 los pixels del rea solapada se borrarn.

  • Clear (CLEAR)

    Si los pixels de la fuente y del destino se solapan, los pixels delrea solapada se borrarn.

    Para cambiar el estilo de composicin usado por Graphics2D, creamos un objeto AlphaCompositey lo pasamos al mtodo setComposite.

    Ejemplo: CompositeEste programa ilustra los efectos de varias combinaciones de estilos de composicin y valores dealpha.

    Esta es una imagen del GUI del applet. Para ajecutar el applet, pulsa sobre ella. El appletaparecer en una nueva ventana del navegador.

    Composite.java contiene el cdigo completo de este applet.

    Se ha construido un nuevo objeto AlphaComposite ac llamando a AlphaComposite.getInstance y especificando las reglas de composicin deseadas.

    AlphaComposite ac = AlphaComposite.getInstance(AlphaComposite.SRC);Cuando se selecciona una regla de composicin o un valor alpha, se llama de nuevo aAlphaComposite.getInstance, y el nuevo AlphaComposite se asigna a ac. El alpha seleccionadose aplica al valor alpha de cada pixel y se le pasa un segundo parmetro aAlphaComposite.getInstance.

    ac = AlphaComposite.getInstance(getRule(rule), alpha);El atributo composite se modifica pasando el objeto AlphaComposite a Graphics 2DsetComposite. Los objetos son renderizados dentro de un BufferedImage y ms tarde se copianen la pantalla, por eso el atributo composite se configura con el contexto Graphics2D para elBufferedImage.

    BufferedImage buffImg = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);Graphics2D gbi = buffImg.createGraphics();...

    gbi.setComposite(ac);

  • TutorJava recomienda...

    Grficos con Java 2D

    En esta pgina:Controlar la Calidad del Dibujol

    Controlar la Calidad del DibujoPodemos usar el atributo 'rendering hint' de Graphics2D para especificar si queremos que losobjetos sean dibujados tan rpido como sea posible o si preferimos que se dibujen con la mayorcalidad posible.

    Para seleccionar o configurar el atributo 'rendering hint' en el contexto, Graphics2D podemosconstruir un objeto RenderingHints y pasarlo dentro de Graphics2D.setRenderingHints. Si sloqueremos seleccionar un hint, podemos llamar a Graphics2D. setRenderingHint y especificar lapareja clave-valor para el hint que queremos seleccionar. (Estas parejas estn definidas en la claseRenderingHints.)

    Nota:

    No todas las plataformas soportan la modificacin del modo de dibujo, por eso el especificar loshints de dibujo no garantiza que sean utilizados.

    RenderingHints soporta los siguientes tipos de hints.

    Alpha interpolation--por defecto, calidad, o velocidad.l Antialiasing--por defecto, on, u offl Color rendering-por defecto, calidad, o velocidadl Dithering--por defecto, activado o desactivadol Fractional metrics--por defecto, on u offl Interpolation--vecino ms cercano, bilinear, o bicbicol Rendering--por defecto, calidad, o velocidadl Text antialiasing--por defecto, on u off.l

  • TutorJava recomienda...

    Grficos con Java 2D

    En esta pgina:Construir Formas Complejas desde Geomtricos Primitivos

    Ejemplo: Areasm

    l

    Construir Formas Complejas desde Geomtricos PrimitivosConstruir un rea geomtrica (CAG) es el proceso de crear una nueva forma geomtrica realizandooperaciones con las ya existentes. En el API Java 2D un tipo especial de Shape llamado Areasoporta operaciones booleanas. Podemos construir un Area desde cualquier Shape .

    Area soporta la siguientes operaciones booleanas:

    Unin

    Subtraccin

    Interseccin

    Or-Exclusivo (XOR)

    Ejemplo: AreasEn este ejemplo, los objetos Area construyen una forma de pera partiendo de varias elipses.

    Esta es una imagen del GUI del applet. Para ajecutar el applet, pulsa sobre ella. El appletaparecer en una nueva ventana del navegador.

    Pear.java contiene el cdigo completo de este applet.

    Las hojas son creadas realizando una intereseccin entre dos crculos solapados:

    leaf = new Ellipse2D.Double();...

  • leaf1 = new Area(leaf);leaf2 = new Area(leaf);...

    leaf.setFrame(ew-16, eh-29, 15.0, 15.0);leaf1 = new Area(leaf);leaf.setFrame(ew-14, eh-47, 30.0, 30.0);leaf2 = new Area(leaf);leaf1.intersect(leaf2);g2.fill(leaf1);...

    leaf.setFrame(ew+1, eh-29, 15.0, 15.0);leaf1 = new Area(leaf);leaf2.intersect(leaf1);g2.fill(leaf2);Los crculos solapados tambin se usan para cosntruir el rabo mediante una operacin desubtraccin:

    stem = new Ellipse2D.Double();...

    stem.setFrame(ew, eh-42, 40.0, 40.0);st1 = new Area(stem);stem.setFrame(ew+3, eh-47, 50.0, 50.0);st2 = new Area(stem);st1.subtract(st2);g2.fill(st1);El cuerpo de la pera est construido mediante una operacin unin de un crculo y un valo:

    circle = new Ellipse2D.Double();oval = new Ellipse2D.Double();circ = new Area(circle);ov = new Area(oval);...

    circle.setFrame(ew-25, eh, 50.0, 50.0);oval.setFrame(ew-19, eh-20, 40.0, 70.0);circ = new Area(circle);ov = new Area(oval);circ.add(ov);g2.fill(circ);

  • TutorJava recomienda...

    Grficos con Java 2D

    En esta pgina:Soportar Interaccin con el Usuario

    Ejemplo: ShapeMoverm

    Ejemplo: HitTestSamplem

    l

    Soportar Interaccin con el Usuario

    Para permitir que el usuario interacte con los graficos que hemos dibujado, necesitamos poderdeterminar cuando el usuario pulsa sobre uno de ellos. El mtodo hit de Graphics2D proporcionauna forma para determinar fcilmente si ha ocurrido una pulsacin de ratn sobre una Shapeparticular. De forma alternativa podemos obtener la posicin del click de ratn y llamar a containssobre la Shape para determinar si el click ocurri dentro de los lmites de la Shape.

    Si estamos usando texto primitvo, podemos realizar una simple comprobacin obteniendo la lneaexterior de la Shape que corresponde al texto y luego llamando a hit o contains con esa Shape.El soporte de edicin de texto requiere una comprobacin mucho ms sofisticada. Si queremospermitir que el usuario edite el texto, generalmente deberamos usar uno de los componentes detexto editable de Swing. Si estamos trabajando con texto primitivo y estamos usando TextLayoutpara manejar la forma y posicin del texto, tambin podemos usar TextLayout para realizar lacomprobacin para la edicin de texto. Para ms informacin puedes ver Java 2D Programmer'sGuide.

    Ejemplo: ShapeMoverEste applet permite al usuario arrastrar la Shape por la ventana del applet. La Shape se redibujaen cada nueva posicin del ratn para proporcionar informacin al usuario mientras la arrastra.

    Esta es una imagen del GUI del applet. Para ajecutar el applet, pulsa sobre ella. El appletaparecer en una nueva ventana del navegador.

    ShapeMover.java contiene el cdigo completo de este applet.

    Se llama al mtodo contains para determinar si el cursor est dentro de los lmites del rectngulocuando se pulsa el botn. Si es as, se actualiza la posicin del rectngulo.

    public void mousePressed(MouseEvent e){ last_x = rect.x - e.getX(); last_y = rect.y - e.getY(); if(rect.contains(e.getX(), e.getY())) updateLocation(e);

  • ...

    public void updateLocation(MouseEvent e){ rect.setLocation(last_x + e.getX(), last_y + e.getY()); ...

    repaint();Podras haber sobservado que redibujar la Shape en cada posicin del ratn es muy lento, porqueel rectngulo relleno es renderizado cada vez que se mueve, Usando el doble buffer podemoseliminar este problema. Si estamos usando Swing, el dibujo usar doble buffer automticamente; sino es as tendremos que cambiar todo el cdigo de renderizado. El cdigo para una versin swingde este programa es SwingShapeMover.java . Para ejecutar la versin Swing, visitaSwingShapeMover.

    Si no estamos usando Swing, el Ejemplo: BufferedShapeMover en la siguiente leccin nos muestracmo podemos implementar el doble buffer usando un BufferedImage. Podemos dibujar en unBufferedImage y luego copiar la imagen en la pantalla.

    Ejemplo: HitTestSampleEsta aplicacin ilustra la comprobacin de pulsaciones dibujando el cursor por defecto siempre queel usuario pulse sobre el TextLayout, como se muestra en la siguiente figura.

    Esta es una imagen del GUI del applet. Para ajecutar el applet, pulsa sobre ella. El appletaparecer en una nueva ventana del navegador.

    HitTestSample.java contiene el cdigo completo de este applet.

    El mtodo mouseClicked usa TextLayout.hitTestChar para devolver un objetojava.awt.font.TextHitInfo que contiene la posicin del click (el ndice de insercin) en el objetoTextLayout.

    La informacin devuelta por los mtodos de TextLayout, getAscent, getDescent y getAdvancese utiliza para calcular la posicin del origen del objeto TextLayout para que est centrado tantohorizontal como verticalmente.

    ...

    private Point2D computeLayoutOrigin() { Dimension size = getPreferredSize(); Point2D.Float origin = new Point2D.Float();

    origin.x = (float) (size.width - textLayout.getAdvance()) / 2; origin.y = (float) (size.height - textLayout.getDescent() + textLayout.getAscent())/2; return origin;}

    ...

    public void paintComponent(Graphics g) { super.paintComponent(g); setBackground(Color.white); Graphics2D graphics2D = (Graphics2D) g; Point2D origin = computeLayoutOrigin(); graphics2D.translate(origin.getX(), origin.getY());

    // Draw textLayout.

  • textLayout.draw(graphics2D, 0, 0);

    // Retrieve caret Shapes for insertionIndex. Shape[] carets = textLayout.getCaretShapes(insertionIndex);

    // Draw the carets. carets[0] is the strong caret and // carets[1] is the weak caret. graphics2D.setColor(STRONG_CARET_COLOR); graphics2D.draw(carets[0]); if (carets[1] != null) { graphics2D.setColor(WEAK_CARET_COLOR); graphics2D.draw(carets[1]); }}

    ...

    private class HitTestMouseListener extends MouseAdapter {

    /** * Compute the character position of the mouse click. */ public void mouseClicked(MouseEvent e) {

    Point2D origin = computeLayoutOrigin();

    // Compute the mouse click location relative to // textLayout's origin. float clickX = (float) (e.getX() - origin.getX()); float clickY = (float) (e.getY() - origin.getY());

    // Get the character position of the mouse click. TextHitInfo currentHit = textLayout.hitTestChar(clickX, clickY); insertionIndex = currentHit.getInsertionIndex();

    // Repaint the Component so the new caret(s) will be displayed. hitPane.repaint(); }

  • TutorJava recomienda...

    Grficos con Java 2D

    En esta pgina:Trabajar con Texto y Fuentes

    Crear y Derivar Fuentesm

    Dibujar Mltiples Lneas de Textom

    l

    Trabajar con Texto y FuentesEsta leccin muestra como determinar las fuentes disponibles en nuestro sistema, crear fuentes conatributos particulares, derivar nuevas fuentes modificando atributos de alguna fuente existente, yposicionar mltiples lneas de texto dentro de un componente.

    Estos tpicos se explican en las siguientes secciones.

    Crear y Derivar Fuentes

    Esta seccin ilustra cmo usar el GraphicsEnvironment para determinar las fuentes disponibles ennuestro sistema, cmo crear un objeto Font y como cambiar los atributos de la fuente de unacadena de texto.

    Dibujar Mltiples Lneas de TextoEsta seccin nos muestra cmo posicionar y dibujar un prrafo de texto con estilo usandoTextLayout y LineBreakMeasurer.

  • TutorJava recomienda...

    Grficos con Java 2D

    En esta pgina:Crear y Derivar Fuentes

    Ejemplo: FontSelectionm

    l

    Crear y Derivar Fuentes

    Podemos mostrar una cadena de texto con cualquier fuente disponible en nuestro sistema, encualquier estilo y tamao que elijamos. Para determinar las fuentes disponibles en nuestro sistema,podemos llamar al mtodo GraphicsEnvironment.getAvailableFontFamilyNames. Este mtododevuelve un array de strings que contiene los nombres de familia de las fuentes disponibles. Sepuede usar c ualquiera de las cadenas, junto con un argumento tamao y otro de estilo, para crearun nuevo objeto Font. Despus de crear un objeto Font, podemos cambiar su nombre de familia,su tamao o su estilo para crear una fuente personalizada.

    Ejemplo: FontSelectionEl siguiente applet nos permite cambiar la fuente, el tamao y el estilo del texto dibujado.

    Esta es una imagen del GUI del applet. Para ajecutar el applet, pulsa sobre ella. El appletaparecer en una nueva ventana del navegador.

    El cdigo completo del applet est en FontSelection.java .

    El mtodo getAvailableFontFamilyNames de GraphicsEnvironment devuelve los nombres defamilia de todas las fuentes disponibles en nuestro sistema.

    GraphicsEnvironment gEnv = GraphicsEnvironment.getLocalGraphicsEnvironment();String envfonts[] = gEnv.getAvailableFontFamilyNames();Vector vector = new Vector();for ( int i = 1; i < envfonts.length; i++ ) { vector.addElement(envfonts[i]);}El objeto Font inicial se crea con estilo Font.PLAIN y tamao 10. Los otros estilos disponibles sonITALIC, BOLD y BOLD+ITALIC.

  • Font thisFont;...

    thisFont = new Font("Arial", Font.PLAIN, 10);Un nuevo Font se crea a partir de un nombre de fuente, un estilo y un tamao.

    public void changeFont(String f, int st, String si){ Integer newSize = new Integer(si); int size = newSize.intValue(); thisFont = new Font(f, st, size); repaint();}Para usar la misma familia de fuentes, pero cambiando uno o los dos atributos de estilo y tamao,podemos llamar a uno de los mtodos deriveFont.

    Para controlar la fuente utilizada para renderizar texto, podemos seleccionar el atributo font en elcontexto Graphics2D antes de dibujarlo. Este atributo se selecciona pasando un objeto Font almtodo setFont. En este ejemplo, el atributo font se configura para usar un objeto fontrecientemente construido y luego se dibuja la cadena de texto en el centro del componente usandola fuente especificada.

    En el mtodo paint, el atributo font del contecto Graphics2D se configura como el nuevo Font. Lacadena se dibuja en el centro del componente con la nueva fuente.

    g2.setFont(thisFont);String change = "Pick a font, size, and style to change me";FontMetrics metrics = g2.getFontMetrics();int width = metrics.stringWidth( change );int height = metrics.getHeight();g2.drawString( change, w/2-width/2, h/2-height/2 );Nota:

    Debido al bug # 4155852, FontSelection podra no funcionar de forma apropiada con todos losnombres de fuentes devueltos por la llamada a getFontFamilyNames. La forma podra nocorresponder con cambios en el tamao o el estilo y el texto podra no mostrarse cuando seselecionan algunos nombres de fuentes. En general, Courier y Helvetica funcionan bien. Mientrastanto, compruebalo peridicamente para ver si se han resuelto estos problemas.

  • TutorJava recomienda...

    Grficos con Java 2D

    En esta pgina:Dibujar Mltiples Lneas de Texto

    Ejemplo: LineBreakSamplem

    l

    Dibujar Mltiples Lneas de TextoSi tenemos un prrafo de texto con estilo que queremos que quepa dentro de una anchuraespecifica, podemos usar LineBreakMeasurer, que permite que el texto con estilo se rompa enlneas que caben dentro de un espacio visual. Como hemos aprendido en Mostrar Grficos conGraphics2D, un objeto TextLayout representa datos de caracteres con estilo, que no se puedencambiar, pero tambin permite acceder a la informacin de distribucin. Los mtodos getAscent ygetDescent de TextLayout devuelven informacin sobre la fuente usada para posicionar las lneasen el componente. El texto se almacena como un AttributedCharacterIterator para que losatributos de fuente y tamao de punto puedan ser almacenados con el texto.

    Ejemplo: LineBreakSampleEl siguiente applet posiciona un prrafo de texto con estilo dentro de un componente, usandoLineBreakMeasurer, TextLayout y AttributedCharacterIterator.

    Esta es una imagen del GUI del applet. Para ajecutar el applet, pulsa sobre ella. El appletaparecer en una nueva ventana del navegador.

    El cdigo completo del applet est en LineBreakSample.java .

    El siguiente cdigo crea un bucle con la cadena vanGogh. El inicio y final del bucle se recupera y secrea una nueva lnea.

    AttributedCharacterIterator paragraph = vanGogh.getIterator();paragraphStart = paragraph.getBeginIndex();paragraphEnd = paragraph.getEndIndex();

    lineMeasurer = new LineBreakMeasurer(paragraph, new FontRenderContext(null, false, false));El tamao de la ventana se utiliza para determinar dnde se debera romper la lnea y se crea unobjeto TextLayout por cada lnea del prrafo.

    Dimension size = getSize();float formatWidth = (float) size.width;

  • float drawPosY = 0;lineMeasurer.setPosition(paragraphStart);

    while (lineMeasurer.getPosition() < paragraphEnd) { TextLayout layout = lineMeasurer.nextLayout(formatWidth);

    // Move y-coordinate by the ascent of the layout. drawPosY += layout.getAscent();

    /* Compute pen x position. If the paragraph is rogth-to-left, we want to align the TextLayouts to the right edge of the panel. */ float drawPosX; if (layout.isRIGHTToLEFT()) { drawPosX = 0; } else { drawPosX = formatWidth - layout.getAdvance(); }

    // Draw the TextLayout at (drawPosX, drawPosY). layout.draw(graphics2D, drawPosX, drawPosY);

    // Move y-coordinate in preparation for next layout. drawPosY += layout.getDescent() + layout.getLeading();}

  • TutorJava recomienda...

    Grficos con Java 2D

    En esta pgina:Mostrar y Manipular Imgenes

    Modo Inmediato con BufferedImagem

    Filtrado y BufferedImagem

    Usar un BufferedImage para doble bufferm

    l

    Mostrar y Manipular Imgenes

    Esta leccin muestra cmo realizar operaciones de filtrado con BufferedImages y cmo usar unBufferedImage como un buffer fuera de pantalla.

    Modo Inmediato con BufferedImage

    Esta seccin describe el modelo de modo inmediato implementado en el API Java 2D y explica comoBufferedImage permite la manipulacin de datos de imgenes.

    Filtrado y BufferedImage

    Esta seccin muestra cmo usar las clases BufferedImageOp para realizar operaciones de filtradosobre BufferedImage.

    Usar un BufferedImage para doble buffer

    Esta seccin nos ensea cmo usar un BufferedImage como un buffer fuera de pantalla paraaumentar el rendimiento de las imgenes.

  • TutorJava recomienda...

    Grficos con Java 2D

    En esta pgina:Modo Inmediato con BufferedImagel

    Modo Inmediato con BufferedImage

    El modelo de imgenes "modo inmediato" permite manipular y mostrar imgenes de pixelsmapeados cuyos datos estn almacenados en memoria. Podemos acceder a los datos de la imagenen una gran variedad de formatos y usar varios tipos de operaciones de filtrado para manipular losdatos.

    BufferedImage es la clase clave del API del modo-inmediato. Esta clase maneja una imagen enmemoria y proporciona mtodos para almacenar, interpretar y dibujar cada dato de pixel. UnBufferedImage puede ser renderizado en un contexto Graphics o on un contexto Graphics2D.

    Un BufferedImage es esencialmente un Image un buffer de datos accesible. Un BufferedImagetiene un ColorModel y un Raster de los datos de la imagen.

    El ColorModel proporciona una interpretacin de color de los datos de los pixels de la imagen. ElRaster representa las coordenadas rectangulares de la imagen, mantiene los datos de la imagen enmemoria, y proporciona un mecanismo para crear mltiples subimagenes de un slo buffer deimagen. El Raster tambin proporciona mtodos para acceder a pixels especficos dentro de laimagen. Para ms informacin sobre como manipular directamente los datos de los pixels y escribirfiltros para objetos BufferedImage, puedes ver el captulo Imaging de Java 2D Programmer'sGuide.

  • TutorJava recomienda...

    Grficos con Java 2D

    En esta pgina:Filtrar un BufferedImage

    Ejemplo: ImageOpsm

    l

    Filtrar un BufferedImage

    El API Java 2D define varias operaciones de filtrado para objetos BufferedImage . Cada operacinde proceso de imgenes est incluida en una clase que implementa el interface BufferedImageOp.La manipulacin de imgenes se realiza en el mtodo filter. La clase BufferedImageOp en el APIJava 2D soporta:

    Tranformacin afin.l Escalado.l Modificacin de Aspecto.l Combinacin Linear de Bandas.l Conversin de color.l Convolucin.l

    Para filtrar un BufferedImage usando una de las clases de operacin de imagen, debemos

    Constuir un ejemplar de una de las clases BufferedImageOp: AffineTransformOp,BandCombineOp, ColorConvertOp, ConvolveOp, LookupOp , o RescaleOp.

    1.

    Llamar al mtodo de operacin filter, pasando en el BufferedImage que queremos filtrar y elBufferedImage donde queremos almacenar el resultado.

    2.

    Ejemplo: ImageOpsEl siguiente applet ilustra el uso de cuatro operaciones de filtrado de imagenes: low-pass, sharpen,lookup, y rescale.

  • Esta es una imagen del GUI del applet. Para ajecutar el applet, pulsa sobre ella. El appletaparecer en una nueva ventana del navegador.

    El cdigo completo del applet est en ImageOps.java. El applet usa estos dos ficheros de imagen:bld.jpg y boat.gif .

    El filtro sharpen se realiza usando un ConvolveOp. Convolucin es el proceso de hacer ms pesadoel valor de cada pixel en una imagen con los valores de los pixels vecinos. La mayora de losalgoritmos de filtrado espacial estan basados en las operaciones de convolucin.

    Para construir y aplicar este tipo de filtrado al BufferedImage, este ejemplo usa un cdigo similaral del siguiente fragmento.

    public static final float[] SHARPEN3x3 = { 0.f, -1.f, 0.f, -1.f, 5.0f, -1.f, 0.f, -1.f, 0.f};BufferedImage dstbimg = new BufferedImage(iw,ih,BufferedImage.TYPE_INT_RGB);Kernel kernel = new Kernel(3,3,SHARPEN3x3);ConvolveOp cop = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null);cop.filter(srcbimg,dstbimg);El objeto Kernel define matemticamente cmo se ve afectada la salida de cada pixels en su reainmediata. La definicin del Kernel determina el resultado del filtro. Para ms informacin sobrecmo trabaja el kernel con ConvolveOp puedes ver la seccin 'Image Processing and Enhancement'en Java 2D Programmer's Guide

  • TutorJava recomienda...

    Grficos con Java 2D

    En esta pgina:Usar un BufferedImage para Doble Buffer

    Ejemplo: BufferedShapeMoverm

    l

    Usar un BufferedImage para Doble Buffer

    Cuando un grfico es complejo o se usa repetidamente, podemos reducir el tiempo que tarda enmostrarse renderizndolo primero en un buffer fuera de pantalla y luego copiando el buffer en lapantalla. Esta tcnica, llamada doble buffer, se usa frecuentemente para animaciones.

    Nota:

    Cuando dibujamos sobre un componente Swing, ste utiliza automticamente el doble buffer.

    Un BufferedImage puede usarse fcilmente como un buffer fuera de pantalla. Para crear unBufferedImage cuyo espacio, color, profundidad y distribucin de pixels correspondenexactamente la ventana en la que son dibujados, se llama al mtodo Component. createImage.Si necesitamos control sobre el tipo de la imagen fuera de la pantalla, la transparencia, podemosconstruir directamente un objeto BufferedImage y usarlo como un buffer.

    Para dibujar dentro de una imagen almacenada, se llama al mtodoBufferedImage.createGraphics para obtener el objeto Graphics2D; luego se llama a losmtodos de dibujo apropiados del Graphics2D. Todo el API de dibujo de Java 2D puede usarsecuando se dibuja sobre un BufferedImage que est siendo utilizado como un buffer fuera depantalla.

    Cuando estemos listos para copiar el BufferedImage en la pantalla, simplemente llamamos almtodo drawImage sobre el Graphics2D de nuestro componente y pasarlo en BufferedImage.

    Ejemplo: BufferedShapeMoverEl siguiente applet permite al usuario arrastrar un rectngulo sobre la ventana del applet. En lugarde dibujar el rectngulo en cada posicin del cursor, para proporcionar informacin al usuario, seusa un BufferedImage como buffer fuera de la pantalla. Cuando se arrastra el rectngulo, esrenderizado dentro del BufferedImage en cada nueva posicin y el BufferedImage se copia en lapantalla.

    Esta es una imagen del GUI del applet. Para ajecutar el applet, pulsa sobre ella. El appletaparecer en una nueva ventana del navegador.

    El cdigo completo del applet est en BufferedShapeMover.java.

    Aqu est el cdigo usado para renderizar en el BufferedImage y mostrar la imagen en la pantalla.

    public void updateLocation(MouseEvent e){

  • rect.setLocation(last_x + e.getX(), last_y + e.getY()); ...

    repaint(); ...

    // In the update method... if(firstTime) { Dimension dim = getSize(); int w = dim.width; int h = dim.height; area = new Rectangle(dim); bi = (BufferedImage)createImage(w, h); big = bi.createGraphics(); rect.setLocation(w/2-50, h/2-25); big.setStroke(new BasicStroke(8.0f)); firstTime = false; }

    // Clears the rectangle that was previously drawn. big.setColor(Color.white); big.clearRect(0, 0, area.width, area.height);

    // Draws and fills the newly positioned rectangle // to the buffer. big.setPaint(strokePolka); big.draw(rect); big.setPaint(fillPolka); big.fill(rect);

    // Draws the buffered image to the screen. g2.drawImage(bi, 0, 0, this);}

  • TutorJava recomienda...

    Grficos con Java 2D

    En esta pgina:Imprimir en Java

    Introduccin a la Impresin en Javam

    Imprimir los Contenidos de un Componentem

    Mostrar el dilogo 'Page Setup'm

    Imprimir una Coleccin de Pginasm

    l

    Imprimir en Java

    Esta leccin nos ensea cmo usar el API de Impresin de Java para imprimir desde nuestrasaplicaciones Java. Aprenderemos cmo dibujar los contenidos de nuestros componentes a laimpresora en lugar de al dispositivo de pantalla y como componer documentos de mltiples pginas.Esta leccin asume que has leido la primera leccin de esta ruta, Introduccin al API 2D de Java, yque ests familiarizado con el uso del contexto de dibujo Graphics2D.

    Introduccin a la Impresin en Java

    Esta seccin nos ofrece una introduccin al soporte de impresin del AWT y el API 2D de Java ydescribe el modelo de impresin de Java.

    Imprimir los Contenidos de un Componente

    Esta seccin nos ensea cmo crear un PrinterJob y cmo usar un Printable para imprimir loscontenidos de un componente.

    Mostrar el dilogo 'Page Setup'

    Esta seccin describe el dilogo estandard de configuracin de pgina y nos ensea cmo usarlapara permitir que el usuario configure un trabajo de impresin.

    Imprimir una Coleccin de Pginas

    Esta seccin ensea cmo configurar un Book para imprimir una coleccin de pginas que no tienenni el mismo tamao ni orientacin.

  • TutorJava recomienda...

    Grficos con Java 2D

    En esta pgina:Introduccin a la Impresin en Java

    Job Controlm

    Imagingm

    Printable Jobsm

    Pageable Jobsm

    l

    Introduccin a la Impresin en Java

    El sistema controla totalmente el proceso de impresin, al igual que controla cmo y cundo puedendibujar los programas, nuestras aplicaciones proporcionan informacin sobre el documento aimprimir, y el sistema de impresin determina cuando necesita renderizar cada pgina.

    Este modelo de impresin permite soportar una amplio rango de impresoras y de sistemas. Inclusopermite al usuario imprimir en una impresora de bitmaps desde un ordenador que no tienesuficiente memoria o espacio en disco para contener el mapa de bits de una pgina completa. Enesta situacin el sistema de impresin le pedir a nuesta aplicacin que renderize la pgina deforma repetida para que pueda ser imprimida como una serie de pequeas imgenes.

    Para soportar impresin, una apliacin necesita realizar dos tareas.

    Job control--manejar el trabajo de impresinl Imaging--renderizar las pginas a imprimirl

    Job Control

    Aunque el sistema controla todo el proceso de impresin, nuestra aplicacin tiene que obtener laoportunidad de configurar un PrinterJob. El PrinterJob , el punto clave del control del proceso deimpresin, almacena las propiedades del trabajo de impresin, controla la visin de los dilogos deimpresin y se usa para inicializar la impresin.

    Para dirigir el PrinterJob a travs del proceso de impresin, nuestra aplicacin necesita

    Obtener un PrinterJob llamando a PrinterJob.getPrinterJob1. Decirle al PrinterJob dnde est el cdigo de dibujo llamando a setPrintable o setPageable2. Si se desea, mostrar los dilogos de configuracin de pgina e impresin llamando a pageDialog yprintDialog

    3.

    Iniciar la impresin llamando a print4.

    El dibujo de pginas est controlado por el sistema de impresin a travs de llamadas al cdigo deimgenes de la aplicacin.

    Imaging

    Nuestra aplicacin debe poder renderizar cualquier pgina cuando el sistema de impresin lo pida.Este cdigo de renderizado est contenido en el mtodo print de un page painter--una clase queimplementa el interface Printable. Nosotros implementamos print para renderizar el contenido dela pgina usando un Graphics o un Graphics2D. Podemos usar un nico 'page painter' pararenderizar todas las pginas de un 'print job' o diferentes 'page painters' para los diferentes tipos depginas. Cuando el sistema de impresin necesita renderizar una pgina, llama al mtodo print del'page painter' apropiado.

    Cuando se usa un nico 'page painter', al 'print job' se le llama un printable job. Usar un 'printablejob' es la forma ms sencilla de soportar impresin. Las operaciones de impresin ms complejasque usan mltiples 'page painters' son conocidas como pageable jobs. En un 'pageable job' se usaun ejemplar de una clase que implemente el interface Pageable para manejar los 'page painters'.

    Printable Jobs

  • En un 'printable job' todas las pginas usan el mismo 'page painter' y PageFormat, que define eltamao y orientacin de la pgina a imprimir. Se le pide al 'page painter' que renderice cada pginaen orden indexado, empezando en la pgina con ndice 0. Al'page painter' se le podra pedir querenderizar una pgina varias veces antes de pedir la siguiente pgina. Por ejemplo, si un usuarioquiere imprimir las pginas 2 y 3 de un documento, se le pide al 'page painter' que renderice laspginas con ndices 0,1 y 2 incluso aunque las dos primeras no sean impresas.

    Si se presenta un dilogo de impresin, no se mostrar el nmero de pginas, porque esainformacin no est disponible para el sistema de impresin, El 'page painter' informa al sistema deimpresin cuando se alcanza el final del documento.

    Pageable Jobs

    Los 'pageable jobs' son tiles si nuestra aplicacin construye una representacin explcita de undocumento, pgina por pgina. En un 'pageable job' diferentes pginas pueden usar diferentes'page paintes' y PageFormats. El sistema de impresin puede pedir a los 'page painters' querendericen las pginas en cualquier orden, incluso puede saltarse algunas. Por ejemplo si un usuarioquiere imprimir las pginas 2 y 3 de un documento, slo se le pedir al 'page painter' que rendericelas pginas con los ndices 1 y 2.

    Los distintos 'page painteres' de un 'pageable job' estn coordinados por una clase que implementael interface Pageable, como un Book. Un Book representa una coleccin de pginas que puedenusar diferentes 'page painter' y que pueden variar en tamao y orientacin, Tambin podemos usarnuestra propia implementaciun del interface Pageable si Book no cumple con las necesidades denuestra aplicacin.

  • TutorJava recomienda...

    Grficos con Java 2D

    En esta pgina:Imprimir los Contenidos de un Componente

    Ejemplo: ShapesPrintm

    l

    Imprimir los Contenidos de un Componente

    Cualquier cosa que podamos dibujar en la pantalla tambin puede ser imprimida. Podemosfcilmente usar un 'printable job' para imprimir el contenido de un componente.

    Ejemplo: ShapesPrintEn este ejmplo usamos el mismo cdigo de dibujo para mostrar e imprimir los contenidos de uncomponente. Cuando el usuario pulsa sobre el botn print, se crea un 'print job' y se llama aprintDialog para mostrar el dilogo de impresin. Si el usuario contnua con el trabajo, el procesode impresin se inicia, y el sistema de impresin llama a print cuando sea necesario renderizar eltrabajo a la impresora.

    ShapesPrint es el 'page painter'. Su mtodo print llama a drawShapes para realizar el dibujo del'print job'. (Tambin se llama al mtodo drawShapes por parte de paintComponent para dibujaren la pantalla.)

    public class ShapesPrint extends JPanel implements Printable, ActionListener {...

    public int print(Graphics g, PageFormat pf, int pi) throws PrinterException {

  • if (pi >= 1) { return Printable.NO_SUCH_PAGE; } drawShapes((Graphics2D) g); return Printable.PAGE_EXISTS;}...

    public void drawShapes(Graphics2D g2) { Dimension d = getSize(); int gridWidth = 400/6; int gridHeight = 300/2; int rowspacing = 5; int columnspacing = 7; int rectWidth = gridWidth - columnspacing; int rectHeight = gridHeight - rowspacing; ...

    int x = 85; int y = 87; ...

    g2.draw(new Rectangle2D.Double(x,y,rectWidth,rectHeight)); ...

    El cdigo de control del trabajo est en el mtodo actionPerformed de ShapesPrint

    public void actionPerformed(ActionEvent e) { if (e.getSource() instanceof JButton) { PrinterJob printJob = PrinterJob.getPrinterJob(); printJob.setPrintable(this); if (printJob.printDialog()) { try { printJob.print(); } catch (Exception ex) { ex.printStackTrace(); } } }}Puedes encontrar el cdigo completo de este programa en ShapesPrint.java .

  • TutorJava recomienda...

    Grficos con Java 2D

    En esta pgina:Mostrar el Dilogo de Configuracin de Pginal

    Mostrar el Dilogo de Configuracin de Pgina

    Podemos permitir que el usuario especifique las caractersitcas de la pgina, como el tamao delpapel y la orientacin, mostrndo el dilogo de Configuracin de Pgina. La informacin de la pginase almacena en un objeto PageFormat. Al igual que el dilogo de Impresin, el dilogo deConfiguracin de Pgina se muestra llamando un mtodo sobre el objeto PrinterJob, pageDialog.

    El dilogo de Configuracin de Pgina se inicializa usando el PageFormat pasado al mtodopageDialog . Si el usuario pulsa sobre el botn OK del dilogo, se clona PageFormat, alteradopara reflejar las selecciones del usuario, y luego retorna. si el usuario cancela el dilogo,pageDialog devuelve el original, sin modificar PageFormat.

    ShapesPrint podra fcilmente ser modificado para mostrar un dilogo de configuracin de pginaaadiendo una llamada a pageDialog despus de obtener el PrinterJob.

    // Get a PrinterJobPrinterJob job = PrinterJob.getPrinterJob();// Ask user for page format (e.g., portrait/landscape)PageFormat pf = job.pageDialog(job.defaultPage());

  • TutorJava recomienda...

    Grficos con Java 2D

    En esta pgina:Imprimir una Coleccin de Pginas

    Ejemplo: SimpleBookm

    l

    Imprimir una Coleccin de Pginas

    Cuando se necesite ms control sobre las pginas individuales en un trabajo de impresin, podemosusar un 'pageable job' en lugar de un 'printable job'. La forma ms sencilla de manejar un 'pageablejob' es utilizar la clase Book, que representa una coleccin de pginas.

    Ejemplo: SimpleBookEl programa SimpleBook usa un Book para manejar dos 'page painters': PaintCover se utilizapara la cubierta, y PaintContent para la pgina de contenido. La cubierta se imprime en modoapaisado, mientras que el contenido se imprime en modo vertical.

    Una vez creado el Book, las pginas se aaden con el mtodo append. Cuando se aade unapgina a un Book, se necesita especificar el Printable y el PageFormat para usar con cadapgina.

    // In the program's job control code...// Get a PrinterJobPrinterJob job = PrinterJob.getPrinterJob();

    // Create a landscape page formatPageFormat landscape = job.defaultPage();landscape.setOrientation(PageFormat.LANDSCAPE);

    // Set up a bookBook bk = new Book();bk.append(new PaintCover(), job.defaultPage());bk.append(new PaintContent(), landscape);

    // Pass the book to the PrinterJobjob.setPageable(bk);Se llama al mtodo setPageable sobre PrinterJob para decirle al sistema de control que utilice elBook para localizar el cdigo de dibujo adecuado.

    Puedes encontrar el programa completo en SimpleBook.java.

  • TutorJava recomienda...

    Grficos con Java 2D

    En esta pgina:Problemas Ms Comunes en los Grficos en Java 2Dl

    Problemas Ms Comunes en los Grficos en Java 2D

    Problema: Puedo ejecutar applets Java2D con appletviewer, pero no funcionan con mi navegador. La consola Java delnavegador dice: defn not found for java/awt/Graphics2D.

    Necesitas descargar el Java Plugin 1.2 para ejecutar Swing y applets 2D en un navegador. Puedes descargar el plugin aqu.http://java.sun.com/products/plugin/index.html Necesitars ajustar tus ficheros HTML para apuntar hacia elplugin. Aqu tienes una pgina con varios ejemplos, incluido un ejemplo 2D en la parte inferior:

    http://java.sun.com/products/plugin/1.2/demos/applets.html

    l

    Problema: Cmo puedo escribir sobre una imagen anterior? Nuestro problema es que nuestro applet muestra una imagende un mapa, pero cuando se dibuja una lnea sobre el mapa, la lnea sobreescribe el mapa.

    Deberas intentar dibujar tu imagen dentro de un BufferedImage. Luego, dibuja el BufferedImage dentro de un contextoGraphics2D y luego dibuja la lnea sobre el contexto Graphics2D un ejemplo de cdigo est en Map_Line.java Slo debessustituir el nombre de tu imagen por images/bld.jpg.

    l

    Problema: Cmo creo un BufferedImage desde un fichero gif o jpeg?

    Para crear un BufferedImage desde un gif o jpeg, debes cargar tu fichero gif o jpeg en un objeto Image y luego dibujar el Imageen el objeto BufferedImage. El siguiente fragmento de cdigo ilustra esto.

    Image img = getImage("picture.gif");int width = img.getWidth(this);int height = img.getHeight(this);

    BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);Graphics2D biContext = bi.createGraphics();biContext.drawImage(img, 0, 0, null);getImage es un mtodo Applet. Si tienes una aplicacin, puedes usar.

    Image img = Toolkit.getDefaultToolkit().getImage("picture.gif");BufferedImage.TYPE_INT_RGB es uno de los muchos tipos de BufferedImage. Para ms informacin, puedes ver.http://java.sun.com/products/java-media/2D/forDevelopers/2Dapi/java/awt/image/BufferedImage.html

    Necesitas crear un contexto Graphics2D para el BufferedImage usando el mtodo createGraphics. Luego, puedesusar el mtodo drawImage de la clase Graphics2D para dibujar la imagen dentro del buffer.

    l

    Problema: No puedo compilar el cdigo fuente de StrokeAndFill.java y Transform.java con jdk1.2beta4.

    La implementacin de TextLayout.getOutline se cambi entre la beta4 y el JDK actual. La nueva implementacin slo toma unAffineTransform como argumento. Necesitas descargar el nuevo JDK para ejecutar el ejemplo.

    l

    Problema: Existe alguna forma de especificar una frmula para una lnea y dibujar un grfico de acuerdo a ella?

    Usar los segmentos de lnea podra ser la forma ms sencilla. Pudes representar los segmentos de lnea rellenando unGeneralPath con ellos, o implementando Shape y PathIterator y leyendo los segmentos de lnea 'bajo demanda' para guardar elalmacenamiento intermedio del objeto GeneralPath. Observa que podras analizar tu frmula para determinar si corresponde concurvas cbicas o cuadrticas.

    l

    Problema: Cmo puedo aadir texto a un campo grfico en una cierta posicin?

    En el JDK 1.2 se aadi una clase llamada Graphics2D (ahora llamado Java 2 SDK). Esta clase desciende de Graphics. Hay dosmtodos drawString en Graphics2D que puedes utilizar. Si quieres rotar el texto, deberas usar Graphics2D en vez de Graphicspor lo que podrs realizar rotaciones y otras transformaciones en tu contexto Graphics2D.

    El ejemplo Transform en el tutorial de 2D no usa drawString para dibujar texto. Lo que sucede es que se crea unTextLayout desde la cadena "Text." El TextLayout nos permite crear un objeto Shape a partir del String obteniendosu forma exterior. Introducimos est Shape en el array de shapes, junto con las formas del rectngulo y de la elipse.Cuando dibujamos o rellenamos el Shape seleccionado del array de shapes, llamamos a g2.draw(Shape) o ag2.fill(Shape).

    Podras usar drawString para dibujar el texto en el contexto Graphics2D y luego llamar a g2.rotate (ngulo derotacin). Esto rotar todo lo que hayamos introducido dentro del contexto Graphics2D. Por eso, podramos resetear elcontexto g2 cada vez que querramos transformar una imagen particular o una parte del texto en el contexto de formaseparada de otras cadenas que hayan sido renderizadas en el contexto g2.

    l

    Problema: He leido su comentario en la parte inferior de Crear y Derivar fuentes sobre el bug 4155852. Este bug ha sidocerrado sin ninguna accin. Es cierto que no se puede aplicar un estilo a una fuente como Arial?

  • El problema es que la correspondencia fuente-a-estilo no funciona de forma apropiada para fuentes fsicas (como Arial oPalatino). Slo se pueden aplicar estilos a las fuentes lgicas en este momento (como Dialog o SansSerif).Como atajo hasta que se corrija el bug, podras hacer lo siguiente:

    Font f = new Font("Palatino Bold", Font.PLAIN, 12); en lugar de :

    Font f = new Font("Palatino", Font.BOLD, 12);

    l

  • /* * 1.2 version. */

    import java.awt.*;import java.awt.event.*;import java.awt.geom.*;import javax.swing.*;

    /* * This is like the FontDemo applet in volume 1, except that it * uses the Java 2D APIs to define and render the graphics and text. */

    public class ShapesDemo2D extends JApplet { final static int maxCharHeight = 15; final static int minFontSize = 6;

    final static Color bg = Color.white; final static Color fg = Color.black; final static Color red = Color.red; final static Color white = Color.white;

    final static BasicStroke stroke = new BasicStroke(2.0f); final static BasicStroke wideStroke = new BasicStroke(8.0f);

    final static float dash1[] = {10.0f}; final static BasicStroke dashed = new BasicStroke(1.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 10.0f, dash1, 0.0f); Dimension totalSize; FontMetrics fontMetrics;

    public void init() { //Initialize drawing colors setBackground(bg); setForeground(fg); }

    FontMetrics pickFont(Graphics2D g2, String longString, int xSpace) { boolean fontFits = false; Font font = g2.getFont(); FontMetrics fontMetrics = g2.getFontMetrics(); int size = font.getSize(); String name = font.getName(); int style = font.getStyle();

    while ( !fontFits ) { if ( (fontMetrics.getHeight()

  • } } }

    return fontMetrics; }

    public void paint(Graphics g) { Graphics2D g2 = (Graphics2D) g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,Renderin