Tutorial de Java - Gráficos, Métodos para pintar figuras de Graphics



El ejemplo java1516.java muestra ejemplos de todas las figuras que se pueden generar con los métodos que se acaban de enumerar. 


Si el lector compila y ejecuta el programa, verá una imagen semejante a la que presenta la figura siguiente.


El código completo del ejemplo es el que se reproduce a continuación, en el cual el lector puede comprobar los parámetros que se pasan a cada uno de los métodos para generar las figuras que se muestran en la imagen anterior.
import java.awt.*;
import java.awt.event.*;

// Clase de control del ejemplo
class java1516 extends Frame { 

  // Función de control de la aplicación
  public static void main( String[] args ) {
    // Se instancia un objeto de la clase
    new java1516();
    }

  // Contructor de la clase
  public java1516() {
    this.setTitle( "Tutorial de Java, Gráficos" );
    this.setSize( 475,275 );
    this.setVisible( true );

    // Clase anidada que permite terminar la ejecución de la animación
    this.addWindowListener(
      // Definición de la clase anónima para controlar el cierre de
      // la ventana
      new WindowAdapter() {
        public void windowClosing( WindowEvent evt ) {
          // Se concluye el programa
          System.exit( 0 );
        }
      } );
    } 

    // Se sobrecarga el método paint()
  public void paint( Graphics g ){
    g.setColor( Color.red );
    
    // Trasladamos el origen de coordenadas que se sitúa en la
    // esquina superior izquierda, para evitar el problema que se
    // produce con insets. De este modo el origen de coordenadas sí
    // que lo dejamos situado en la zona cliente del objeto Frame 
    // que es la que se utiliza para pintas
    g.translate( this.getInsets().left,this.getInsets().top );
    
    // Línea simple
    g.drawLine( 10,0,50,50 );
    g.setColor( Color.black );
    g.drawString( "drawLine",10,62 );
    g.setColor( Color.red );
    
    // Se crean dos arrays de coordenadas para pintar una 
    // polilínea
    int x1Datos[] = {80,130,80,130}; 
    int y1Datos[] = {0,50,50,0};
    g.drawPolyline( x1Datos,y1Datos,4 );
    g.setColor( Color.black );
    g.drawString( "drawPolyline",70,62 );
    g.setColor( Color.red );

    // Rectángulo
    g.drawRect( 150,0,50,50 );
    g.setColor( Color.black );
    g.drawString( "drawRect",150,62 );
    g.setColor( Color.red );
    
    // Rectángulo relleno
    g.fillRect( 220,0,50,50 );
    g.setColor( Color.black );
    g.drawString( "fillRect",225,62 );
    g.setColor( Color.red );
    
    // Rectángulo redondeado
    g.drawRoundRect( 300,0,50,50,10,10 );
    g.setColor( Color.black );
    g.drawString( "drawRoundRect",280,62 );
    g.setColor( Color.red );
    
    // Rectángulo redondeado relleno
    g.fillRoundRect( 385,0,50,50,10,10 );
    g.setColor( Color.black );
    g.drawString( "fillRoundRect",375,62 );
    
    // Pinta un rectángulo 3D, sobresaliendo de la pantalla
    // No parece demasiado 3D
    g.setColor( Color.gray );//draw the 3D stuff in gray
    g.draw3DRect( 10,90,55,25,true );
    // Rectángulo 3D, pulsado
    g.draw3DRect( 70,90,50,25,false );
    g.setColor( Color.black );
    g.drawString( "draw3DRect",30,140 );
    
    // Rectángulo 3D relleno. Se ha puesto un fondo gris
    // con lo cual se puede apreciar mucho mejor el efecto
    // de tres dimensiones
    // Fondo gris
    g.setColor( Color.gray );
    g.fillRect( 145,75,130,55 );
    g.fill3DRect( 155,90,50,25,true );
    // Rectángulo 3D relleno, pulsado
    g.fill3DRect( 215,90,50,25,false );
    g.setColor( Color.red );
    // De todos modos, la apariencia de tres dimensiones
    // con 3DRect no es demasiado buena, porque es necesario
    // seleccionar muy bien la paleta de colores para que
    // se genere la ilusión de 3D
    g.setColor( Color.black );
    g.drawString( "fill3DRect",180,140 );
    g.setColor( Color.red );

    // Pinta un ángulo de 255 grados inscrito en un rectángulo    
    g.drawRect( 300,77,50,50 );
    g.drawArc( 300,77,50,50,0,225 ); 
    g.setColor( Color.black );
    g.drawString( "drawArc",305,140 );
    g.setColor( Color.red );
    
    // Angulo relleno de 255 grados inscrito en un rectángulo    
    g.drawRect( 385,77,50,50 );
    g.fillArc( 385,77,50,50,0,225 );
    g.setColor( Color.black );
    g.drawString( "fillArc",395,140 );
    g.setColor( Color.red );
        
    // Elipse, con el eje grande horizontal
    g.drawOval( 10,165,50,25 );
    // Círculo
    g.drawOval( 70,150,50,50 );
    g.setColor( Color.black );
    g.drawString( "drawOval",35,218 );
    g.setColor( Color.red );

    // Elipse rellena, con el eje grande vertical
    g.fillOval( 170,150,25,50 );
    // Círculo relleno
    g.fillOval( 210,150,50,50 ); 
    g.setColor( Color.black );
    g.drawString( "fillOval",185,218 );
    g.setColor( Color.red );
    
    // Polígono
    int x2Datos[] = {300,350,300,350};
    int y2Datos[] = {150,200,200,150}; 
    g.drawPolygon( x2Datos,y2Datos,4 );
    g.setColor( Color.black );
    g.drawString( "drawPolygon",290,218 );
    g.setColor( Color.red );
    
    // Polígono relleno
    int x3Datos[] = {385,435,385,435};
    int y3Datos[] = {150,200,200,150}; 
    g.fillPolygon( x3Datos,y3Datos,4 );
    g.setColor( Color.black );
    g.drawString( "fillPolygon",385,218 );
  }
}

Quizás merezca la pena un repaso de los métodos draw3Drect() y fill3Drect(), que son los encargados de pintar rectángulos que aparezcan en pantalla dando sensación de estás flotando sobre ella o hundidos. Este efecto visual se consigue mostrando dos de los lados en un color más claro que los otros dos, ofreciendo al ojo humano la ilusión de que los bordes más claros están iluminados y los más oscuros son producto de las sombras. Esto puede ser útil en ocasiones, pero hay otras en que en modo alguno se consigue el efecto; si el color de fondo del contenedor sobre el que se va a colocar el rectángulo 3D, tiene un color cercano al color de ese rectángulo, entonces el efecto está conseguido, pero si se intenta colocar un rectángulo relleno con color rojo sobre un fondo blanco, el efecto pasa desapercibido.







 Java

Comentarios

Entradas más populares de este blog

Ejemplo de suma Pascal

Solucion al error collation desconocida: 'utf8mb4_0900_ai_ci'