Ver Mensaje Individual
  #9 (permalink)  
Antiguo 02/10/2012, 04:43
octavio_lf
 
Fecha de Ingreso: octubre-2012
Mensajes: 1
Antigüedad: 11 años, 7 meses
Puntos: 0
Respuesta: Dibujo con canvas

Los ejemplos que es posible hallar en internet para dibujar en un lienzo, suelen tener tantos elementos y métodos, que resulta muy difícil entenderlos, y por ello nada didácticos. Un código muy básico para poder hacer líneas en un lienzo, el cual puede ser completado para mejorar el programa, es:


import java.awt.*;
import java.awt.event.*;


public class Ventana extends Frame implements ActionListener {

int long_x=700, long_y=500;
Lienzo l;

public static void main(String[] args) {
new Ventana();
}


public Ventana(){
// Esta parte define la funcionalidad básica de la ventana.
super("Lienzo");
setLocationRelativeTo(null);
setLayout(null);
setSize(long_x, long_y);

addWindowListener(
new WindowAdapter(){
public void windowClosing(WindowEvent e){System.exit(0);}
}
);

add(l=new Lienzo(long_x, long_y));
l.setBounds(150, 0, long_x-150, long_y);

setVisible(true);
}
}




import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;


public class Lienzo extends Canvas implements MouseListener, MouseMotionListener{

int x, y, x2, y2;
BufferedImage imagen;
Graphics2D g0;

public Lienzo(int ancho, int alto){
setBackground(Color.white);
addMouseMotionListener(this);
addMouseListener(this);

imagen = new BufferedImage(ancho, alto, BufferedImage.TYPE_INT_RGB);
g0 = imagen.createGraphics();
g0.setColor(Color.white);
g0.fillRect(0, 0, ancho, alto);
g0.setStroke(new BasicStroke(3));
g0.setColor(Color.black);
}


public void paint(Graphics g){
g.drawImage(imagen, 0, 0, null);
}


public void mouseDragged(MouseEvent e) {
x2 = e.getX();
y2 = e.getY();
g0.drawLine(x, y, x2, y2);
paint(getGraphics());
x = x2;
y = y2;
}


public void mouseMoved(MouseEvent e){ }


public void mouseEntered(MouseEvent e){ }


public void mouseExited(MouseEvent e){ }


public void mouseClicked(MouseEvent e){ }


public void mousePressed(MouseEvent e){
x = e.getX();
y = e.getY();
}


public void mouseReleased(MouseEvent e){ }
}



No es posible utilizar el objeto de Graphics 'g0' del objeto de BufferedImage 'imagen', porque el método "paint(Graphics g)" solamente permite dibujar en el panel, con un elemento de Graphics obtenido del mismo lienzo. Así que no es posible escribir directamente "paint(g0)" en lugar de "paint(getGraphics())" en el método "public void mouseDragged(MouseEvent e)"; sino que dentro del método "paint(Graphics g)", hay que escribir en 'g' lo dibujado en 'g0'. Además, no vale guardar el una variable el objeto obtenido con "getGraphics()". Parece ser que tras cada uso es eliminado automáticamente, por lo que después será lanzada la excepción: NullPointerException.
Haciendo esto así, es posible recuperar el dibujo después de minimizar la ventana, pues queda guardado en 'imagen', y al restaurar la ventana, será llamado automáticamente el método "paint(Graphics g)", que redibujará ese contenido. Además, así es posible guardar la imagen hecha, importando "javax.imageio.ImageIO", y escribiendo: ImageIO.write(imagen, "png", new File("Dibujo.png")); o lo mismo cambiando la extensión del archivo, y el archivo y su dirección, ¡claro!


Me resultó difícil hallar el medio de combinar el dibujado dinámico de un programa del estilo del Paint de Windows, con el poder restaurar la imagen tras haber minimizado la ventana, y poder guardar el resultado; pero esto lo soluciona todo. ¡Suerte con las mejoras!


Autor: OSLF.