lunes, 25 de abril de 2011

Programa simple de dibujo con swing. Pintar en un lienzo usando MouseListener y MouseMotionListener

Hola de nuevo.

Hoy vamos a empezar a captar los eventos de ratón y a utilizarlos para crear un programa simple de dibujo. Básicamente añadiremos unos listeners a un JFrame para lograr captar los eventos de ratón y así identificar los puntos por los que desplazamos el puntero.

Estos MouseAdapter y MouseMotionAdapter implementan las interfaces MouseListener y MouseMotionListener respectivamente, que se encargan de detectar eventos de ratón, como clicks, entradas y salidas del puntero en determinadas zonas, desplazamientos y arrastres de ratón.

En el ejemplo de hoy utilizaremos estos eventos para dibujar puntos sobre un lienzo, os dejo el código a continuación. Y ya sabéis, cualquier duda dejar un comentario y os responderé con la mayor brevedad posible.


import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class Painter extends JFrame {

 private int cuentaPuntos = 0;

 private JLabel j = new JLabel();

 // arreglo de referencias a java.awt.Point
 private int maxPoints = 1500;
 private Point puntos[] = new Point[maxPoints];

 // configurar GUI y registrar manejador de eventos de ratón
 public Painter() {
  super("Un programa simple de dibujo");

  // crear una etiqueta y colocarla en la parte SOUTH del esquema
  // BorderLayout

  getContentPane().add(new JLabel("Arrastre el ratón para dibujar"), BorderLayout.SOUTH);
  getContentPane().add(j, BorderLayout.NORTH);

  // Ahora añadimos listeners propios para los eventos de ratón
  addMouseMotionListener(

  new MouseMotionAdapter() { // clase interna anónima

   // almacenar coordenadas de arrastre de ratón y llamar a repaint
   @Override
   public void mouseDragged(MouseEvent evento) {
    if (cuentaPuntos < puntos.length) {
     puntos[cuentaPuntos] = evento.getPoint();
     ++cuentaPuntos;
     repaint();
     j.setText("Van: " + cuentaPuntos + " puntos, le quedan: " + (maxPoints - cuentaPuntos) + " puntos");
    }
   }

  } // fin de la clase interna anónima

  ); // fin de la llamada a addMouseMotionListener

  addMouseListener(

  new MouseAdapter() { // clase interna anónima

   // almacenar coordenadas de click de ratón
   @Override
   public void mouseClicked(MouseEvent evento) {
    if (cuentaPuntos < puntos.length) {
     puntos[cuentaPuntos] = evento.getPoint();
     ++cuentaPuntos;
     repaint();
     j.setText("Van: " + cuentaPuntos + " puntos, le quedan: " + (maxPoints - cuentaPuntos) + " puntos");
    }
   }

  } // fin de la clase interna anónima

  ); // fin de la llamada a addMouseListener

  setSize(400, 200);
  setVisible(true);

 } // fin del constructor de Pintor

 // dibujar óvalo en un cuadro delimitador de 2 por 2 en ubicación
 // especificada en ventana
 @Override
 public void paint(Graphics g) {
  super.paint(g); // borra el área de dibujo

  for (int i = 0; i < puntos.length && puntos[i] != null; i++)
   g.fillOval(puntos[i].x, puntos[i].y, 2, 2);
 }

 public static void main(String args[]) {
  Painter aplicacion = new Painter();
  aplicacion.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 }

}


Espero que os sea útil :)

1 comentarios:

Gustavo Hernández Salinas dijo...

Muy bueno, ¿tendrás algo como una vista previa de impresión?. Ejemplo: Capturo unas cuántas cosas en unos campos de texto, otras tantas en una tabla, y las muestro acomodadas en una ventana tal como van a quedar al imprimirlas (del campo de texto solo los datos o un línea abajo y la tabla sí completa), considerando claro el tamaño de la hoja, saludos.

Publicar un comentario