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.
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:
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