miércoles, 3 de febrero de 2010
sábado, 30 de enero de 2010
Introducción
En este capitulo beremos varias de las herramientas de java para dibujar figuras bidimensionales, controlar colores y fuentes. Uno de los principales atractivos de java era su soporte para gráficos, el cual permitirá alos programadores mejorar la apariencia visual de sus aplicaciones. Ahora java continúe muchas mas herramientas sofisticado en el dibujo como parte API java 2D. Comenzamos este capitulo con una introducción a muchas de la herramientas de dibujo digitales de java. Después presentaremos varias de las más poderosas herramientas de java 2D. Como el control del estilo de línea utilizada para dibujar figura y el control de rellenos de la figura con colores y patrones (ya hemos cubierto varios de los concepto de este capitulo ejemplo practico opcional de GUI y gráficos de os capítulos 3 a 10. Por lo tanto parte de material será repetitivo si usted leyó el ejemplo practico; sin embargo si no lo a leído no es necesario para comprender este capitulo).
El figura12.1 se muestra un función de la jerarquía de clase de java que incluye varias de la clase de grafico básicos y la clase de interface de al API java que cubriremos el este capitulo. La clase color contiene métodos contantes para manipular lo colores. La clase Componentes contienen el método paintcomponent que se utiliza para dibujar gráficos en sus componentes. La clase Font contiene métodos y constantes para manejar los tipos de letras. La clase fontmatrises contiene métodos para dibujar cadenas líneas y rectángulos y demás figuras. La clase graphics2d que extiende ala clase graphics se utiliza para dibujar con la API java 2Dla clase contiene métodos para dibujar polígonos la mitad inferior de la figura muestra varias clase interfaces de la API java 2D la clase basicstroke ayuda especificar las características para rellanar de las figuras con colores o patrones las clases generales path line2d arc2D rectangle2D y roundRectangle2D representan varias figuras de java 2D .
Para empezar dibujar en java, primero debemos entender su sistema de coordenadas (FIGURAS 12.2) el cual es un esquema para identificar a cada uno delos posibles puntos en la pantalla. De manera predeterminada la esquina superior izquierda de un componente de la GUI ( como una ventana) tiene las coordenadas (0,0). Un par de coordenadas esta compuesto por una coordenadas x (las coordenadas horizontales) y unas coordenadas y (la coordenada vertical). La coordenada x es la distancia vertical que se desplaza hacia ala derecha desde la `parte izquierda de la pantalla. El eje x describe cada una de las coordenadas horizontal el je describe cada una de las coordenadas verticales. Las coordenadas se utilizan para indicar en donde deben mostrarse los gráficos en una pantalla. las unidades de las coordenadas se miden en pixeles (elementos de imagen) un pixel es la unidad mas pequeña de resolución de un monitor de computadoras .
Panel Color
import java.awt.Color;
import javax.swing.JPanel;
public class JPanelColor extends JPanel
{
// dibuja rectángulos y objetos String en distintos colores
public void paintComponent( Graphics g )
{
super.paintComponent( g ); // llama el método paintComponent de la superclase
this.setBackground( Color.WHITE );
// establece nuevo color de dibujo, usando valores enteros
g.setColor( new Color( 255, 0, 0 ) );
g.fillRect( 15, 25, 100, 20 );
g.drawString( "RGB actual: " + g.getColor(), 130, 40 );
// establece nuevo color de dibujo, usando valores de punto flotante
g.setColor( new Color( 0.50f, 0.75f, 0.0f ) );
g.fillRect( 15, 50, 100, 20 );
g.drawString( "RGB actual: " + g.getColor(), 130, 65 );
// establece nuevo color de dibujo, usando objetos Color static
g.setColor( Color.BLUE );
g.fillRect( 15, 75, 100, 20 );
g.drawString( "RGB actual: " + g.getColor(), 130, 90 );
// muestra los valores RGB individuales
Color color = Color.MAGENTA;
g.setColor( color );
g.fillRect( 15, 100, 100, 20 );
g.drawString( "Valores RGB: " + color.getRed() + ", " +
color.getGreen() + ", " + color.getBlue(), 130, 115 );
} // fin del método paintComponent
} // fin de la clase JPanelColor
--------------------------------------------------------------------------------------------------
import javax.swing.JFrame;
public class MostrarColores
{
// ejecuta la aplicación
public static void main( String args[] )
{
// crea marco para objeto JPanelColor
JFrame frame = new JFrame( "Uso de colores" );
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
JPanelColor jPanelColor = new JPanelColor(); // create JPanelColor
frame.add( jPanelColor ); // agrega jPanelColor a marco
frame.setSize( 400, 180 ); // establece el tamaño del marco
frame.setVisible( true ); // muestra el marco
} // fin de main
} // fin de la clase MostrarColores

Lineas Rectas y Ovalos
import java.awt.Graphics;
import javax.swing.JPanel;
public class LineasRectsOvalosJPanel extends JPanel
{
// muestra varias líneas, rectángulos y óvalos
public void paintComponent( Graphics g )
{
super.paintComponent( g ); // llama al método paintComponent de la superclase
this.setBackground( Color.WHITE );
g.setColor( Color.RED );
g.drawLine( 5, 30, 380, 30 );
g.setColor( Color.BLUE );
g.drawRect( 5, 40, 90, 55 );
g.fillRect( 100, 40, 90, 55 );
g.setColor( Color.BLACK );
g.fillRoundRect( 195, 40, 90, 55, 50, 50 );
g.drawRoundRect( 290, 40, 90, 55, 20, 20 );
g.setColor( Color.YELLOW );
g.draw3DRect( 5, 100, 90, 55, true );
g.fill3DRect( 100, 100, 90, 55, false );
g.setColor( Color.MAGENTA );
g.drawOval( 195, 100, 90, 55 );
g.fillOval( 290, 100, 90, 55 );
} // fin del método paintComponent
} // fin de la clase LineasRectsOvalosJPanel
---------------------------------------------------------------------------------------------------
import java.awt.Color;
import javax.swing.JFrame;
public class LineasRectsOvalos
{
// ejecuta la aplicación
public static void main( String args[] )
{
// crea marco para LineasRectsOvalosJPanel
JFrame marco =
new JFrame( "Dibujo de lineas, rectangulos y ovalos" );
marco.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
LineasRectsOvalosJPanel lineasRectsOvalosJPanel =
new LineasRectsOvalosJPanel();
lineasRectsOvalosJPanel.setBackground( Color.WHITE );
marco.add( lineasRectsOvalosJPanel ); // agrega el panel al marco
marco.setSize( 400, 210 ); // establece el tamaño del marco
marco.setVisible( true ); // muestra el marco
} // fin de main
} // fin de la clase LineasRectsOvalos

Mostrar los Colores
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JColorChooser;
import javax.swing.JPanel;
public class MostrarColores2JFrame extends JFrame
{
private JButton cambiarColorJButton;
private Color color = Color.LIGHT_GRAY;
private JPanel coloresJPanel;
// establece la GUI
public MostrarColores2JFrame()
{
super( "Uso de JColorChooser" );
// crea objeto JPanel para mostrar color
coloresJPanel = new JPanel();
coloresJPanel.setBackground( color );
// establece cambiarColorJButton y registra su manejador de eventos
cambiarColorJButton = new JButton( "Cambiar color" );
cambiarColorJButton.addActionListener(
new ActionListener() // clase interna anónima
{
// muestra JColorChooser cuando el usuario hace clic con el botón
public void actionPerformed( ActionEvent evento )
{
color = JColorChooser.showDialog(
MostrarColores2JFrame.this, "Seleccione un color", color );
// establece el color predeterminado, si no se devuelve un color
if ( color == null )
color = Color.LIGHT_GRAY;
// cambia el color de fondo del panel de contenido
coloresJPanel.setBackground( color );
} // fin del método actionPerformed
} // fin de la clase interna anónima
); // fin de la llamada a addActionListener
add( coloresJPanel, BorderLayout.CENTER ); // agrega coloresJPanel
add( cambiarColorJButton, BorderLayout.SOUTH ); // agrega botón
setSize( 400, 130 ); // establece el tamaño del marco
setVisible( true ); // muestra el marco
} // fin del constructor de MostrarColores2JFrame
} // fin de la clase MostrarColores2JFrame
--------------------------------------------------------------------------------------------------
import javax.swing.JFrame;
public class MostrarColores2
{
// ejecuta la aplicación
public static void main( String args[] )
{
MostrarColores2JFrame aplicacion = new MostrarColores2JFrame();
aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
} // fin de main
} // fin de la clase MostrarColores2

Tipos de Letra
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;
public class FontJPanel extends JPanel
{
// muestra objetos String en distintos tipos de letra y colores
public void paintComponent( Graphics g )
{
super.paintComponent( g ); // llama al método paintComponent de la superclase
// establece el tipo de letra a Serif (Times), negrita, 12 puntos y dibuja una cadena
g.setFont( new Font( "Serif", Font.BOLD, 12 ) );
g.drawString( "Serif 12 puntos, negrita.", 20, 50 );
// establece el tipo de letra a Monospaced (Courier), cursiva, 24 puntos y dibuja una cadena
g.setFont( new Font( "Monospaced", Font.ITALIC, 24 ) );
g.drawString( "Monospaced 24 puntos, cursiva.", 20, 70 );
// establece el tipo de letra a SansSerif (Helvetica), simple, 14 puntos y dibuja una cadena
g.setFont( new Font( "SansSerif", Font.PLAIN, 14 ) );
g.drawString( "SansSerif 14 puntos, simple.", 20, 90 );
// establece el tipo de letra a Serif (Times), negrita/cursiva, 18 puntos y dibuja una cadena
g.setColor( Color.RED );
g.setFont( new Font( "Serif", Font.BOLD + Font.ITALIC, 18 ) );
g.drawString( g.getFont().getName() + " " + g.getFont().getSize() +
" puntos, negrita cursiva.", 20, 110 );
} // fin del método paintComponent
} // fin de la clase FontJPanel
--------------------------------------------------------------------------------------------------
import javax.swing.JFrame;
public class TiposDeLetra
{
// ejecuta la aplicación
public static void main( String args[] )
{
// crea marco para FontJPanel
JFrame marco = new JFrame( "Uso de tipos de letra" );
marco.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
FontJPanel fontJPanel = new FontJPanel(); // crea objeto FontJPanel
marco.add( fontJPanel ); // agrega objeto fontJPanel al marco
marco.setSize( 475, 170 ); // establece el tamaño del marco
marco.setVisible( true ); // muestra el marco
} // fin de main
} // fin de la clase TiposDeLetra

Metrica
import java.awt.FontMetrics;
import java.awt.Graphics;
import javax.swing.JPanel;
public class MetricaJPanel extends JPanel
{
// muestra la métrica de los tipos de letra
public void paintComponent( Graphics g )
{
super.paintComponent( g ); // llama al método paintComponent de la superclase
g.setFont( new Font( "SansSerif", Font.BOLD, 12 ) );
FontMetrics metrica = g.getFontMetrics();
g.drawString( "Tipo de letra actual: " + g.getFont(), 10, 40 );
g.drawString( "Ascendente: " + metrica.getAscent(), 10, 55 );
g.drawString( "Descendente: " + metrica.getDescent(), 10, 70 );
g.drawString( "Altura: " + metrica.getHeight(), 10, 85 );
g.drawString( "Interlineado: " + metrica.getLeading(), 10, 100 );
Font tipoLetra = new Font( "Serif", Font.ITALIC, 14 );
metrica = g.getFontMetrics( tipoLetra );
g.setFont( tipoLetra );
g.drawString( "Tipo de letra actual: " + tipoLetra, 10, 130 );
g.drawString( "Ascendente: " + metrica.getAscent(), 10, 145 );
g.drawString( "Descendente: " + metrica.getDescent(), 10, 160 );
g.drawString( "Altura: " + metrica.getHeight(), 10, 175 );
g.drawString( "Interlineado: " + metrica.getLeading(), 10, 190 );
} // fin del método paintComponent
} // fin de la clase MetricaJPanel
--------------------------------------------------------------------------------------------------
import javax.swing.JFrame;
public class Metrica
{
// ejecuta la aplicación
public static void main( String args[] )
{
// crea marco para objeto MetricaJPanel
JFrame marco = new JFrame( "Demostracion de FontMetrics" );
marco.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
MetricaJPanel metricaJPanel = new MetricaJPanel();
marco.add( metricaJPanel ); // agrega metricaJPanel al marco
marco.setSize( 530, 250 ); // establece el tamaño del marco
marco.setVisible( true ); // muestra el marco
} // fin de main
} // fin de la clase Metrica

Arcos
import java.awt.Graphics;
import javax.swing.JPanel;
public class ArcosJPanel extends JPanel
{
// dibuja rectángulos y arcos
public void paintComponent( Graphics g )
{
super.paintComponent( g ); // llama al método paintComponent de la superclase
// empieza en 0 y se extiende hasta 360 grados
g.setColor( Color.RED );
g.drawRect( 15, 35, 80, 80 );
g.setColor( Color.BLACK );
g.drawArc( 15, 35, 80, 80, 0, 360 );
// empieza en 0 y se extiende hasta 110
g.setColor( Color.RED );
g.drawRect( 100, 35, 80, 80 );
g.setColor( Color.BLACK );
g.drawArc( 100, 35, 80, 80, 0, 110 );
// empieza en 0 y se extiende hasta -270 grados
g.setColor( Color.RED );
g.drawRect( 185, 35, 80, 80 );
g.setColor( Color.BLACK );
g.drawArc( 185, 35, 80, 80, 0, -270 );
// empieza en 0 y se extiende hasta 360 grados
g.fillArc( 15, 120, 80, 40, 0, 360 );
// empieza en 270 y se extiende hasta -90 grados
g.fillArc( 100, 120, 80, 40, 270, -90 );
// empieza en 0 y se extiende hasta -270 grados
g.fillArc( 185, 120, 80, 40, 0, -270 );
} // fin del método paintComponent
} // fin de la clase ArcosJPanel
--------------------------------------------------------------------------------------------------
import javax.swing.JFrame;
public class DibujarArcos
{
// ejecuta la aplicación
public static void main( String args[] )
{
// crea marco para ArcosJPanel
JFrame marco = new JFrame( "Dibujo de arcos" );
marco.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
ArcosJPanel arcosJPanel = new ArcosJPanel(); // crea objeto ArcosJPanel
marco.add( arcosJPanel ); // agrega arcosJPanel al marco
marco.setSize( 300, 210 ); // establece el tamaño del marco
marco.setVisible( true ); // muestra el marco
} // fin de main
} // fin de la clase DibujarArcos

Poligonos
import java.awt.Polygon;
import javax.swing.JPanel;
public class PoligonosJPanel extends JPanel
{
// dibuja polígonos y polilíneas
public void paintComponent( Graphics g )
{
super.paintComponent( g ); // llama al método paintComponent de la superclase
// dibuja polígono con objeto polígono
int valoresX[] = { 20, 40, 50, 30, 20, 15 };
int valoresY[] = { 50, 50, 60, 80, 80, 60 };
Polygon poligono1 = new Polygon( valoresX, valoresY, 6 );
g.drawPolygon( poligono1 );
// dibuja polilíneas con dos arreglos
int valoresX2[] = { 70, 90, 100, 80, 70, 65, 60 };
int valoresY2[] = { 100, 100, 110, 110, 130, 110, 90 };
g.drawPolyline( valoresX2, valoresY2, 7 );
// rellena polígono con dos arreglos
int valoresX3[] = { 120, 140, 150, 190 };
int valoresY3[] = { 40, 70, 80, 60 };
g.fillPolygon( valoresX3, valoresY3, 4 );
// dibuja polígono relleno con objeto Polygon
Polygon poligono2= new Polygon();
poligono2.addPoint( 165, 135 );
poligono2.addPoint( 175, 150 );
poligono2.addPoint( 270, 200 );
poligono2.addPoint( 200, 220 );
poligono2.addPoint( 130, 180 );
g.fillPolygon( poligono2);
} // fin del método paintComponent
} // fin de la clase PoligonosJPanel
--------------------------------------------------------------------------------------------------
// Fig. 12.28: DibujarPoligonos.java
// Dibujo de polígonos.
import javax.swing.JFrame;
public class DibujarPoligonos
{
// ejecuta la aplicación
public static void main( String args[] )
{
// crea marco para objeto PoligonosJPanel
JFrame marco = new JFrame( "Dibujo de poligonos" );
marco.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
PoligonosJPanel poligonosJPanel = new PoligonosJPanel();
marco.add( poligonosJPanel ); // agrega poligonosJPanel al marco
marco.setSize( 280, 270 ); // establece el tamaño del marco
marco.setVisible( true ); // muestra el marco
} // fin de main
} // fin de la clase DibujarPoligonos

Figuras
import java.awt.Graphics;
import java.awt.BasicStroke;
import java.awt.GradientPaint;
import java.awt.TexturePaint;
import java.awt.Rectangle;
import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;
import java.awt.geom.RoundRectangle2D;
import java.awt.geom.Arc2D;
import java.awt.geom.Line2D;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;
public class FigurasJPanel extends JPanel
{
// dibuja figuras con la API Java 2D
public void paintComponent( Graphics g )
{
super.paintComponent( g ); // llama al método paintComponent de la superclase
Graphics2D g2d = ( Graphics2D ) g; // convierte a g en objeto Graphics2D
// dibuja un elipse en 2D, relleno con un gradiente color azul-amarillo
g2d.setPaint( new GradientPaint( 5, 30, Color.BLUE, 35, 100,
Color.YELLOW, true ) );
g2d.fill( new Ellipse2D.Double( 5, 30, 65, 100 ) );
// dibuja rectángulo en 2D de color rojo
g2d.setPaint( Color.RED );
g2d.setStroke( new BasicStroke( 10.0f ) );
g2d.draw( new Rectangle2D.Double( 80, 30, 65, 100 ) );
// dibuja rectángulo delimitador en 2D, con un fondo con búfer
BufferedImage imagenBuf = new BufferedImage( 10, 10,
BufferedImage.TYPE_INT_RGB );
// obtiene objeto Graphics2D de imagenBuf y dibuja en él
Graphics2D gg = imagenBuf.createGraphics();
gg.setColor( Color.YELLOW ); // dibuja en color amarillo
gg.fillRect( 0, 0, 10, 10 ); // dibuja un rectángulo relleno
gg.setColor( Color.BLACK ); // dibuja en color negro
gg.drawRect( 1, 1, 6, 6 ); // dibuja un rectángulo
gg.setColor( Color.BLUE ); // dibuja en color azul
gg.fillRect( 1, 1, 3, 3 ); // dibuja un rectángulo relleno
gg.setColor( Color.RED ); // dibuja en color rojo
gg.fillRect( 4, 4, 3, 3 ); // dibuja un rectángulo relleno
// pinta a imagenBuf en el objeto JFrame
g2d.setPaint( new TexturePaint( imagenBuf,
new Rectangle( 10, 10 ) ) );
g2d.fill(
new RoundRectangle2D.Double( 155, 30, 75, 100, 50, 50 ) );
// dibuja arco en forma de pastel en 2D, de color blanco
g2d.setPaint( Color.WHITE );
g2d.setStroke( new BasicStroke( 6.0f ) );
g2d.draw(
new Arc2D.Double( 240, 30, 75, 100, 0, 270, Arc2D.PIE ) );
// dibuja líneas 2D en verde y amarillo
g2d.setPaint( Color.GREEN );
g2d.draw( new Line2D.Double( 395, 30, 320, 150 ) );
// dibuja línea 2D usando el trazo
float guiones[] = { 10 }; // especifica el patrón de guiones
g2d.setPaint( Color.YELLOW );
g2d.setStroke( new BasicStroke( 4, BasicStroke.CAP_ROUND,
BasicStroke.JOIN_ROUND, 10, guiones, 0 ) );
g2d.draw( new Line2D.Double( 320, 30, 395, 150 ) );
} // fin del método paintComponent
} // fin de la clase FigurasJPanel
-----------------------------------------------------------------------------------------------------
import javax.swing.JFrame;
public class Figuras
{
// ejecuta la aplicación
public static void main( String args[] )
{
// crea marco para objeto FigurasJPanel
JFrame marco = new JFrame( "Dibujo de figuras en 2D" );
marco.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
// crea objeto FigurasJPanel
FigurasJPanel figurasJPanel = new FigurasJPanel();
marco.add( figurasJPanel ); // agrega figurasJPanel to marco
marco.setSize( 425, 200 ); // establece el tamaño del marco
marco.setVisible( true ); // muestra el marco
} // fin de main
} // fin de la clase Figuras

Ejercicio 12. 31-32
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.GeneralPath;
import java.util.Random;
import javax.swing.JPanel;
public class Figuras2JPanel extends JPanel
{
// dibuja rutas generales
public void paintComponent( Graphics g )
{
super.paintComponent( g ); // llama al método paintComponent de la superclase
Random aleatorio = new Random(); // obtiene el generador de números aleatorios
int puntosX[] = { 55, 67, 109, 73, 83, 55, 27, 37, 1, 43 };
int puntosY[] = { 0, 36, 36, 54, 96, 72, 96, 54, 36, 36 };
Graphics2D g2d = ( Graphics2D ) g;
GeneralPath estrella = new GeneralPath(); // crea objeto GeneralPath
// establece la coordenada inicial de la ruta general
estrella.moveTo( puntosX[ 0 ], puntosY[ 0 ] );
// crea la estrella; esto no la dibuja
for ( int cuenta = 1; cuenta < puntosX.length; cuenta++ )
estrella.lineTo( puntosX[ cuenta ], puntosY[ cuenta ] );
estrella.closePath(); // cierra la figura
g2d.translate( 200, 200 ); // traslada el origen a (200, 200)
// gira alrededor del origen y dibuja estrellas en colores aleatorios
for ( int cuenta = 1; cuenta <= 20; cuenta++ )
{
g2d.rotate( Math.PI / 10.0 ); // gira el sistema de coordenadas
// establece el color de dibujo al azar
g2d.setColor( new Color( aleatorio.nextInt( 256 ),
aleatorio.nextInt( 256 ), aleatorio.nextInt( 256 ) ) );
g2d.fill( estrella ); // dibuja estrella rellena
} // fin de for
} // fin del método paintComponent
} // fin de la clase Figuras2JPanel
--------------------------------------------------------------------------------------------------
import java.awt.Color;
import javax.swing.JFrame;
public class Figuras2
{
// ejecuta la aplicación
public static void main( String args[] )
{
// crea marco para Figuras2JPanel
JFrame marco = new JFrame( "Dibujo de figuras en 2D" );
marco.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
Figuras2JPanel figuras2JPanel = new Figuras2JPanel();
marco.add( figuras2JPanel ); // agrega figuras2JPanel al marco
marco.setBackground( Color.WHITE ); // establece color de fondo del marco
marco.setSize( 400, 400 ); // establece el tamaño del marco
marco.setVisible( true ); // muestra el marco
} // fin de main
} // fin de la clase Figuras2
