## Resolver problemas comunes con Gráficos 2D

Problema: Puedo ejecutar applets Java2D con appletviewer, pero no funcionan con mi navegador. La consola Java del navegador 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

  Necesitarás ajustar tus ficheros HTML para apuntar hacia el pugin. Aquí tienes una página con varios ejemplos, incluido un ejemplo 2D en la parte inferior:

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

Problema: ¿Cómo puedo escribir sobre una imagen anterir? Nuestro problema es que nuestro applet muestea una imagen de un mapa, pero cuando se dibuja una línea sobre el mapa, la línea sobreescribe el mapa.

- Deberías intentar dibujar tu imagen dentro de un BufferedImage. Luego, dibuja el BufferedImage dentro de un contexto Graphics2D y luego dibuje la línea sobre el contexto Graphics2D un ejemplo de código está en

  > Map_Line.java

  Sólo debes sustituir el nombre de tu imagen por images/bld.jpg.

Problema: ¿Cómo creo un BufferedImage desde un fichero gif o jpeg?

- Para crear un BufferedImage desde un gif o jpegfrom a gif or jpeg, debes cargar tu fichero fig o jpeg en un objeto Image y luego dibujar el Image en el objeto BufferedImage. El siguiente fragmento de código 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 método Applet. Si tiene una aplicación, puedes usar:

      Image img = Toolkit.getDefaultToolkit().getImage("picture.gif");

  BufferedImage.TYPE_INT_RGB es uno de los muchos tipos de BufferedImage. Para más información, 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 método createGraphics. Luego, puedesusar el método drawImage de la clase Graphics2D para dibujar la imagen dentro del buffer.

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

- La implementación de TextLayout.getOutline se cambió entre la beta4 y el JDK actual. La nueva implementación sólo toma un AffineTransform como argumento. Necesitas descargar el nuevo JDK para ejecutar el ejemplo.

Problema: ¿Existe alguna forma de especificar una fórmula para una línea y dibujar un gráfico de acuerdo a ella?

- Usar los segmentos de línea podría ser la forma más sencilla. Pudes representar los segmentos de línea rellenando un GeneralPath con ellos, o implementando Shape y PathIterator y leyendo los segmentos de línea 'bajo demanda' para guardar el almacenamiento intermedio del objeto GeneralPath. Observa que podrías analizar tu f´romula para dererminar si corresponde con curvas cúbicas o cuadráticas.

Problema: ¿Cómo puedo añadir texto a un campo gráfico en una cierta posición?

- En el JDK 1.2 se añadió una clase llamada Graphics2D (ahora llamado Java 2 SDK). Esta clase desciende de Graphics. Hay dos métodos drawString en Graphics2D que puedes utilizar. Si quieres rotar el texto, deberías usar Graphics2D en vez de Graphics por lo que podrás 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 un TextLayout desde la cadena "Text." El TextLayout nos permite crear un objeto Shape a partir del String obteniendo su forma exterior. Introducimos está Shape en el array de shapes, junto con las formas del rectángulo y de la elipse. Cuando dibujamos o rellenamos el Shape seleccionado del array de shapes, llamamos a g2.draw(Shape) o a g2.fill(Shape).

  Podrías usar drawString para dibujar el texto en el contexto Graphics2D y luego llamar a g2.rotate (ángulo de rotación). Esto ratará todo lo que hayamos introducido dentro del contexto Graphics2D. Por eso, podríamos resetear el contexto g2 cada vez que querramos transformar una imagen particular o una parte del texto en el contexto de forma separada de otras cadenas que hayan sido renderizadas en el contexto g2.

Problema: He leido su comentario en la parte inferior de Crear y Derivar fuentes sobre el bug 4155852. Este bug ha sido cerrado sin ninguna acción. ¿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 físicas (como Arial o Palatino). Sólo se pueden aplicar estilos a las fuentes lógicas en este momento (como Dialog o SansSerif).

Como atajo hasta que se corrija el bug, podrías hacer lo siguientes:

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

en lugar de :

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

Ozito