Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Grficos y Java 2D
12.1 Introduccin
El sistema de coordenadas de Java es un esquema para identificar todos los posibles puntos en la pantalla. Un par de coordenadas est compuesto de una coordenada x (la coordenada horizontal) y una coordenada y (la coordenada vertical). Para mostrar texto y figuras en la pantalla, se especifican sus coordenadas. Estas coordenadas se utilizan para indicar en dnde deben mostrarse los grficos en una pantalla. Las unidades de las coordenadas se miden en pxeles. Un pxel es la unidad ms pequea de resolucin de un monitor de computadora.
El mtodo fillRect de Graphics dibuja un rectngulo relleno por el color actual del objeto Graphics. El mtodo drawString de Graphics dibuja un objeto String en el color actual. El componente de GUI JColorChooser permite a los usuarios de una aplicacin seleccionar colores. La clase JColorChooser proporciona el mtodo de conveniencia static llamado showDialog, que crea un objeto JColorChooser, lo adjunta a un cuadro de dilogo y muestra ese cuadro de dilogo. Mientras el cuadro de dilogo de seleccin de color est en la pantalla, el usuario no podr interactuar con el componente padre. A este tipo de cuadro de dilogo se le llama cuadro de dilogo modal.
// Fig. 12.5: JPanelColor.java Demostracin de objetos Color. import java.awt.Graphics; import java.awt.Color; import javax.swing.JPanel; public class JPanelColor extends JPanel { // dibuja rectngulos y objetos String en distintos colores public void paintComponent( Graphics g ) { super.paintComponent( g ); // llama el mtodo 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 mtodo paintComponent } // fin de la clase JPanelColor // Fig. 12.6: MostrarColores.java Demostracin de objetos Color. import javax.swing.JFrame; public class MostrarColores { // ejecuta la aplicacin 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 tamao del marco frame.setVisible( true ); // muestra el marco } // fin de main } // fin de la clase MostrarColores
// Fig. 12.7: MostrarColores2JFrame.java Seleccin de colores con JColorChooser. import java.awt.BorderLayout; 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 annima { // muestra JColorChooser cuando el usuario hace clic con el botn 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 mtodo actionPerformed } // fin de la clase interna annima ); // fin de la llamada a addActionListener add( coloresJPanel, BorderLayout.CENTER ); // agrega coloresJPanel add( cambiarColorJButton, BorderLayout.SOUTH ); // agrega botn setSize( 400, 130 ); // establece el tamao del marco setVisible( true ); // muestra el marco } // fin del constructor de MostrarColores2JFrame } // fin de la clase MostrarColores2JFrame
// Fig. 12.8: MostrarColores2.java Seleccin de colores con JColorChooser. import javax.swing.JFrame; public class MostrarColores2 { // ejecuta la aplicacin public static void main( String args[] ) { MostrarColores2JFrame aplicacion = new MostrarColores2JFrame(); aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); } // fin de main } // fin de la clase MostrarColores2
Figura 12.9 | Las fi chas HSB y RGB del cuadro de dilogo JColorChooser.
// Fig. 12.11: FontJPanel.java Muestra cadenas en distintos tipos de letra y colores. import java.awt.Font; 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 mtodo 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 mtodo paintComponent } // fin de la clase FontJPanel
// Fig. 12.12: TiposDeLetra.java Uso de tipos de letra. import javax.swing.JFrame; public class TiposDeLetra { // ejecuta la aplicacin 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 );
// Fig. 12.15: MetricaJPanel.java import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import javax.swing.JPanel;
Mtodos de FontMetrics y Graphics tiles para obtener la mtrica de los tipos de letra.
public class MetricaJPanel extends JPanel { // muestra la mtrica de los tipos de letra
// Fig. 12.16: Metrica.java Muestra la mtrica de los tipos de letra. import javax.swing.JFrame; public class Metrica { // ejecuta la aplicacin 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 tamao del marco marco.setVisible( true ); // muestra el marco } // fin de main } // fin de la clase Metrica
// Fig. 12.18:LineasRectsOvalosJPanel.java Dibujo de lneas, rectngulos y valos. import java.awt.Color; import java.awt.Graphics; import javax.swing.JPanel; public class LineasRectsOvalosJPanel extends JPanel { // muestra varias lneas, rectngulos y valos public void paintComponent( Graphics g ) { super.paintComponent( g ); // llama al mtodo paintComponent de la superclase
// Fig. 12.19: LineasRectsOvalos.java Dibujo de lneas, rectngulos y valos. import java.awt.Color; import javax.swing.JFrame; public class LineasRectsOvalos { // ejecuta la aplicacin 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 tamao del marco marco.setVisible( true ); // muestra el marco } // fin de main } // fin de la clase LineasRectsOvalos
// Fig. 12.24: ArcosJPanel.java // Dibujo de arcos. import java.awt.Color; import java.awt.Graphics; import javax.swing.JPanel; public class ArcosJPanel extends JPanel { // dibuja rectngulos y arcos public void paintComponent( Graphics g ) { super.paintComponent( g ); // llama al mtodo 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 mtodo paintComponent } // fin de la clase ArcosJPanel
// Fig. 12.25: DibujarArcos.java // Dibujo de arcos. import javax.swing.JFrame; public class DibujarArcos { // ejecuta la aplicacin 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 tamao del marco marco.setVisible( true ); // muestra el marco } // fin de main } // fin de la clase DibujarArcos
// Fig. 12.27: PoligonosJPanel.java Dibujo de polgonos. import java.awt.Graphics; import java.awt.Polygon; import javax.swing.JPanel; public class PoligonosJPanel extends JPanel { // dibuja polgonos y polilneas public void paintComponent( Graphics g ) { super.paintComponent( g ); // llama al mtodo paintComponent de la superclase // dibuja polgono con objeto polgono 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 polilneas 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 polgono con dos arreglos int valoresX3[] = { 120, 140, 150, 190 }; int valoresY3[] = { 40, 70, 80, 60 }; g.fillPolygon( valoresX3, valoresY3, 4 ); // dibuja polgono 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 mtodo paintComponent } // fin de la clase PoligonosJPanel
// Fig. 12.28: DibujarPoligonos.java Dibujo de polgonos. import javax.swing.JFrame; public class DibujarPoligonos { // ejecuta la aplicacin 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 tamao del marco marco.setVisible( true ); // muestra el marco } // fin de main } // fin de la clase DibujarPoligonos
// Fig. 12.29: FigurasJPanel.java // Demostracin de algunas figuras de Java 2D. import java.awt.Color; 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 mtodo 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 rectngulo 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 rectngulo delimitador en 2D, con un fondo con bfer 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 rectngulo relleno gg.setColor( Color.BLACK ); // dibuja en color negro gg.drawRect( 1, 1, 6, 6 ); // dibuja un rectngulo gg.setColor( Color.BLUE ); // dibuja en color azul gg.fillRect( 1, 1, 3, 3 ); // dibuja un rectngulo relleno gg.setColor( Color.RED ); // dibuja en color rojo gg.fillRect( 4, 4, 3, 3 ); // dibuja un rectngulo 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 lneas 2D en verde y amarillo g2d.setPaint( Color.GREEN ); g2d.draw( new Line2D.Double( 395, 30, 320, 150 ) ); // dibuja lnea 2D usando el trazo float guiones[] = { 10 }; // especifica el patrn 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 mtodo paintComponent } // fin de la clase FigurasJPanel