Dibujar y pintar en Java
Dibujar y pintar con paintComponent
El método paintComponent es el método utilizado por Java para dibujar y pintar los componentes de un panel o de una ventana con Swing. Este método también es posible llamarlo manualmente mediante el uso del método repaint() permitiendo realizar un redibujado o repintado en la pantalla. Además de esto, dispone de métodos que permiten dibujar o pintar líneas o figuras como pueden ser cuadrados, círculos, polígonos, etc...
Para poder implementarlo es necesario sobreescribirlo aportando los métodos y los datos necesarios para realizar el dibujado o pintado. El método paintComponent requiere de un argumento de tipo Graphics, que a su vez, debe ser convertido a tipo Graphics2D para poder realizar este dibujado.
Para entender mejor el funcionamiento, el siguiente código muestra un ejemplo de una clase llamada Dibujo que llama a la clase Draw() que es la encargada de incorporar los distintos métodos en el proceso de dibujado y/o pintado.
package dibujo;
import javax.swing.JFrame;
public class Dibujo extends JFrame {
private Draw draw;
private int sizeX = 600, sizeY = 600 + 40;
public Dibujo() {
this.setSize(sizeX,sizeY);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
//quitar margen de ventana
//this.setUndecorated(true);
draw = new Draw();
draw.setBounds(0,0,sizeX,sizeY);
this.add(draw);
}
public static void main(String[] args) {
Dibujo dibujo= new Dibujo();
dibujo.setVisible(true);
}
}
A continuación la clase Draw() implementando algunas de las distintas opciones para dibujar o pintar que permite Java mediante el método paintComponent() .
LÍNEAS
Para dibujar líneas solamente es necesario indicar las coordenadas (x,y) de inicio de línea y las coordenadas (x,y)de fin de línea.
LÍNEAS con Line2D
package dibujo;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Line2D;
import javax.swing.JPanel;
public class Draw extends JPanel {
private Line2D.Float linea = new Line2D.Float(0, 0, 600, 600);
private Line2D.Float linea2 = new Line2D.Float(0,600,600,0);
@Override
public void paintComponent(Graphics g)
{
Graphics2D g2d = (Graphics2D) g;
g2d.setBackground(Color.yellow);
g2d.draw(linea);
g2d.draw(linea2);
}
}
LÍNEAS con drawLine()
@Override
public void paintComponent(Graphics g)
{
Graphics2D g2d = (Graphics2D) g;
g2d.drawLine(0, 600, 600, 0);
}
ELIPSES
Según su definición la elipse es el lugar geométrico de los puntos del plano cuya suma de las distancias a dos puntos fijos, llamados focos es constante. De forma simple una elipse es una forma geométrica similar a un círculo pero que mantiene una forma ovalada. Para crear una elipse, de igual forma que la línea, es necesario indicar las coordenadas del inicio y del final, teniendo en cuenta que éstas se manejan como si un rectángulo se trazara sobre los puntos más alejados del centro de la elipse.
ELIPSE con Ellipse2D
package dibujo;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;
import javax.swing.JPanel;
public class Draw extends JPanel {
private Ellipse2D.Float elipse = new Ellipse2D.Float(0,0,400,200);
@Override
public void paintComponent(Graphics g)
{
Graphics2D g2d = (Graphics2D) g;
g2d.setColor(Color.yellow);
g2d.draw(elipse);
g2d.setColor(Color.red);
g2d.fill(elipse);
}
}
ELIPSE con drawOval()
package dibujo;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JPanel;
public class Draw extends JPanel {
@Override
public void paintComponent(Graphics g)
{
Graphics2D g2d = (Graphics2D) g;
g2d.setColor(Color.yellow);
g2d.drawOval(100, 100, 200, 400);
g2d.setColor(Color.red);
g2d.fillOval(100, 100, 200, 400);
}
}
CÍRCULOS
Un círculo es una elipse con la particularidad adicional de que mantiene la misma distancia desde cualquier punto que delimita dicha elipse respecto a su radio. Por tanto de la misma forma que se crea una elipse se crea un círculo, la única diferencia son las coordenadas dadas.
package dibujo;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;
import javax.swing.JPanel;
public class Draw extends JPanel {
private Ellipse2D.Float elipse = new Ellipse2D.Float(0,0,400,400);
@Override
public void paintComponent(Graphics g)
{
Graphics2D g2d = (Graphics2D) g;
g2d.setColor(Color.yellow);
g2d.draw(elipse);
}
}
RECTÁNGULOS
Un rectángulo es una forma geométrica formada por cuatro ángulos de 90 grados y que la distancia de un lado debe ser la misma que la del lado opuesto.
RECTÁNGULOS con Rectangle2D()
package dibujo;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Rectangle2D;
import javax.swing.JPanel;
public class Draw extends JPanel {
private Rectangle2D.Float rectangulo = new Rectangle2D.Float(100,20,300,500);
@Override
public void paintComponent(Graphics g)
{
Graphics2D g2d = (Graphics2D) g;
g2d.setColor(Color.MAGENTA);
g2d.fill(rectangulo);
g2d.setColor(Color.BLUE);
g2d.draw(rectangulo);
}
}
RECTÁNGULOS con drawRect()
package dibujo;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JPanel;
public class Draw extends JPanel {
@Override
public void paintComponent(Graphics g)
{
Graphics2D g2d = (Graphics2D) g;
g2d.setColor(Color.BLUE);
g2d.fillRect(0, 300, 300, 300);
g2d.setColor(Color.MAGENTA);
g2d.drawRect(100, 100, 300, 500);
}
}
CUADRADO
El cuadrado es un rectángulo con la característica añadida de que todos los lados son iguales.
package dibujo;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Rectangle2D;
import javax.swing.JPanel;
public class Draw extends JPanel {
private Rectangle2D.Float rectangulo = new Rectangle2D.Float(20,20,100,100);
@Override
public void paintComponent(Graphics g)
{
Graphics2D g2d = (Graphics2D) g;
g2d.setColor(Color.MAGENTA);
g2d.fill(rectangulo);
g2d.setColor(Color.BLUE);
g2d.draw(rectangulo);
}
}
POLÍGONOS
Para dibujar o pintar polígonos con paintComponent es necesario indicar los puntos de intersección mediante dos arrays, un array que representa el eje de coordenadas x y otro array el eje de coordenadas y. El orden de los elementos de cada array deben ser coincidentes y también corresponderá al recorrido que realizará el trazo en proceso de dibujado.
TRIÁNGULO con Polygon
package dibujo;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Polygon;
import javax.swing.JPanel;
public class Draw extends JPanel {
private int x[] = {300,0,600,300};
private int y[] = {0,600,600,0};
private Polygon triangulo = new Polygon(x2,y2,3)
@Override
public void paintComponent(Graphics g)
{
Graphics2D g2d = (Graphics2D) g;
g2d.setColor(Color.red);
g2d.draw(triangulo);
}
}
TRIÁNGULO con drawPolygon
package dibujo;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JPanel;
public class Draw extends JPanel {
@Override
public void paintComponent(Graphics g)
{
Graphics2D g2d = (Graphics2D) g;
int x[] = {300,0,600};
int y[] = {0, 600,600};
g2d.fillPolygon(x,y,3);
g2d.setColor(Color.red);
g2d.drawPolygon(x,y,3);
}
}
TRIÁNGULO con drawPolyline
package dibujo;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JPanel;
public class Draw extends JPanel {
@Override
public void paintComponent(Graphics g)
{
Graphics2D g2d = (Graphics2D) g;
int x[] = {300,0,600,300};
int y[] = {0, 600,600,0};
g2d.fillPolygon(x,y,4);
g2d.setColor(Color.red);
g2d.drawPolygon(x,y,4);
}
}
La diferencia entre drawPolygon y drawPolyline es que drawPolygon incluye automáticamente una última coordenada igual a la primera para cerrar el polígono mientras que drawPolyline permite trabajar con polígonos abiertos y, por tanto, es necesario incluir en el array la coordenada de cierre.
ESTRELLAS
ESTRELLA (5 puntas)
package dibujo;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JPanel;
public class Draw extends JPanel {
@Override
public void paintComponent(Graphics g)
{
Graphics2D g2d = (Graphics2D) g;
int x[] = {300,0,600,0,450,300};
int y[] = {0,600,200,200,600,0};
g2d.fillPolygon(x,y,5);
g2d.setColor(Color.red);
g2d.drawPolygon(x,y,5);
}
}
ESTRELLA (6 puntas)
package dibujo;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JPanel;
public class Draw extends JPanel {
@Override
public void paintComponent(Graphics g)
{
Graphics2D g2d = (Graphics2D) g;
int x[] = {300,0, 600};
int y[] = {0,450,450};
g2d.fillPolygon(x,y,3);
int x2[] = {0,300,600};
int y2[] = {150,600,150};
g2d.fillPolygon(x2,y2,3);
}
}
Para poder comentar es necesario iniciar sesión