MiniPaint Java

Este sencillo programa permite dibujar en un lienzo (JPanel) usando el mouse, como si fuera en Microsoft Paint.

Ademas permite abrir una imagen guardada en un archivo y modificarla, o crear una imagen nueva y guardarla en un archivo.

Quize compartir esto para que aquellos que estan aprendiendo a trabajar con graficos como yo, tengan una base por donde comenzar😀 … Espero sus comentarios o aportes… Tambien me pueden encontrar en http://todoexpertos.com/s/2/alejosoft

si desean hacerme alguna pregunta, gracias por sus comentarios

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.awt.image.*;

public class MiniPaint extends JFrame  {

public static final int SAVE = 0;
public static final int ABRIR = 1;
public static final int NEW = 2;

public static final int CHANGE_COLOR = 3;
public static final int BORRAR_TODO = NEW;

public static final int EXIT = 5;

public Lienzo myLienzo;

public static JColorChooser colorChooser = new JColorChooser();

public MiniPaint(){
myLienzo = new Lienzo();
this.setJMenuBar(createMenu());
this.getContentPane().add(myLienzo);

}

public static void main(String args[]){
MiniPaint paint = new MiniPaint();
paint.setSize(800,600);
paint.setVisible(true);

// para que se termine el programa cuando se cierra la ventana
paint.setDefaultCloseOperation(paint.EXIT_ON_CLOSE);
}

private JMenuBar createMenu(){
JMenu menu = new JMenu(“File”);
menu.add(new JMenuItem(new MenuAction(“Nuevo”,NEW)));
menu.add(new JMenuItem(new MenuAction(“Abrir”,ABRIR)));
menu.add(new JMenuItem(new MenuAction(“Guardar como…”,SAVE)));
menu.addSeparator();
menu.add(new JMenuItem(new MenuAction(“Salir”,EXIT)));
JMenuBar menuBar = new JMenuBar();
menuBar.add(menu);

menu = new JMenu(“Dibujo”);
menu.add(new JMenuItem(new MenuAction(“Cambiar color”,CHANGE_COLOR)));
menu.add(new JMenuItem(new MenuAction(“Borrar todo”,BORRAR_TODO)));
menuBar.add(menu);

return menuBar;
}

class Lienzo extends JPanel implements MouseListener,MouseMotionListener {
// inicialmente comenzamos a pintar en negro
private Color colorActual = Color.BLACK;
// si quieres usar un cursor propio para pintar, descomenta estas lineas
// y cambia la ruta de la imagen por la tuya. Para mejores resultados
// debes usar un gif de fondo transparente de 32 x 32 pixeles.
//private Cursor brushCursor = Toolkit.getDefaultToolkit().createCustomCursor(
//new ImageIcon(“cursor2.gif”).getImage(), new Point( 0, 0 ), “Dibujar” );
private Point puntoActual = new Point(0,0);
private Graphics grafica;
private int xViejo;
private int xNuevo;
private int yViejo;
private int yNuevo;
private boolean esPrimerPunto = false;
BufferedImage myImage;
Graphics2D g2;

public Lienzo(){
this.setBackground( Color.white );

// descomentar la siguiente linea para activar el cursor personalizado
//this.setCursor(brushCursor);
this.addMouseMotionListener(this);
this.addMouseListener(this);

}

public Color getColorActual(){
return colorActual;
}

public void setColorActual(Color color){
colorActual = color;
}

// este metodo crea un nuevo contexto grafico
public Graphics2D crearGraphics2D() {
Graphics2D g2 = null;

if (myImage == null || myImage.getWidth() != getSize().width
|| myImage.getHeight() != getSize().height) {
myImage = (BufferedImage) createImage(getSize().width, getSize().height);
}

if (myImage != null) {
g2 = myImage.createGraphics();
g2.setBackground(getBackground());
}

g2.clearRect(0, 0, getSize().width, getSize().height);

return g2;
}

public void paintComponent( Graphics g ) {
super.paintComponent( g );

if ( myImage == null ){
g2 = crearGraphics2D();
}
// comenzamos a dibujar cuando efectivamente el usuario hizo click sobre el lienzo
if ( esPrimerPunto ){
dibujar(g2);
}

if (myImage != null && isShowing()) {
g.drawImage(myImage, 0, 0, this);
}

}

private void dibujar(Graphics2D g){
g.setRenderingHint( RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON );
g.setColor(colorActual);
g.fillOval(xNuevo,yNuevo,5,5);
g.fillOval(xViejo,yViejo,5,5);
}

public void resetAll(){
esPrimerPunto = false;
myImage = null;
repaint();
}

public void resetLinea(int x, int y) {
xViejo = xNuevo = x;
yViejo = yNuevo = y;
esPrimerPunto = true;
//grafica = null;
}

public void actualizar(int x, int y) {
xViejo = xNuevo;
xNuevo = x;
yViejo = yNuevo;
yNuevo = y;
repaint(x,y,5,5);
}

public void mouseDragged( MouseEvent e ) {
actualizar(e.getX(),e.getY());
}

public void mousePressed( MouseEvent e ) {
resetLinea(e.getX(),e.getY());
}

// en estos metodos no hago nada, pero se pueden hacer muchas cosas mas dependiendo del evento de raton
public void mouseMoved( MouseEvent e ) { }

public void mouseClicked( MouseEvent e ) {}

public void mouseEntered( MouseEvent e ) {}

public void mouseExited( MouseEvent e ) {}

public void mouseReleased( MouseEvent e ) { }

public void guardarComo() {
try {
JFileChooser jfc = createJFileChooser();
jfc.showSaveDialog(this);
File file = jfc.getSelectedFile();
if ( file == null ){
return;
}
javax.swing.filechooser.FileFilter ff = jfc.getFileFilter();
String fileName = file.getName();
String extension = “jpg”;
if ( ff instanceof MyFileFilter){
extension = ((MyFileFilter)ff).getExtension();
}

fileName = fileName + “.” + extension;
file = new File(file.getParent(),fileName);

// Guardamos la imagen dibujada en el archivo seleccionado
javax.imageio.ImageIO.write(myImage, extension, file);
} catch (Exception e) {
System.out.println(e);
}
}

public void abrir() {
try {
JFileChooser jfc = createJFileChooser();
jfc.showOpenDialog(this);

File file = jfc.getSelectedFile();
if ( file == null ){
return;
}

// creamos la imagen a partir del archivo seleccionado
myImage = javax.imageio.ImageIO.read(file);
int w = myImage.getWidth(null);
int h = myImage.getHeight(null);
if (myImage.getType() != BufferedImage.TYPE_INT_RGB) {
BufferedImage bi2 =
new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
Graphics big = bi2.getGraphics();
big.drawImage(myImage, 0, 0, null);
}
g2 = (Graphics2D)myImage.getGraphics();
repaint();
} catch (IOException e) {
System.out.println(“Image could not be read”);
System.exit(1);
}
}

public JFileChooser createJFileChooser(){
JFileChooser jfc = new JFileChooser();
jfc.setAcceptAllFileFilterUsed(false);
String [] fileTypes = getFormats();
for(int i=0; i<fileTypes.length; i++ ){
jfc.addChoosableFileFilter(new MyFileFilter(fileTypes[i],fileTypes[i] + ” file”));
}
return jfc;

}

/* Devuelve los formatos ordenados alfabeticamente y en minusculas */
public String[] getFormats() {
String[] formats = javax.imageio.ImageIO.getWriterFormatNames();
java.util.TreeSet<String> formatSet = new java.util.TreeSet<String>();
for (String s : formats) {
formatSet.add(s.toLowerCase());
}
return formatSet.toArray(new String[0]);
}

}

class MenuAction extends AbstractAction {
private int actionId;

public MenuAction(String text, int actionId){
super(text);
this.actionId = actionId;
}

public void actionPerformed(ActionEvent e){
switch(actionId){
case MiniPaint.EXIT:
System.exit(0);
break;
case MiniPaint.CHANGE_COLOR:
Color color = MiniPaint.colorChooser.showDialog(MiniPaint.this, “Seleccione color”, MiniPaint.this.myLienzo.getColorActual());
MiniPaint.this.myLienzo.setColorActual(color);
break;
case MiniPaint.SAVE:
MiniPaint.this.myLienzo.guardarComo();
break;
case MiniPaint.ABRIR:
MiniPaint.this.myLienzo.abrir();
break;
case MiniPaint.BORRAR_TODO:
MiniPaint.this.myLienzo.resetAll();
break;
}
}
}

class MyFileFilter extends javax.swing.filechooser.FileFilter
{

private String extension;
private String description;

public MyFileFilter(String extension,String description){
this.extension = extension;
this.description = description;
}

public boolean accept (File f) {
return f.getName ().toLowerCase ().endsWith (“.”+extension)
|| f.isDirectory ();
}

public String getDescription () {
return description;
}

public String getExtension(){
return extension;
}
}
}

2 respuestas a MiniPaint Java

  1. Andrés dice:

    Amigaso, me a servido mucho para guardar los archivos con la extension predeterminada, muchas gracias!!

  2. Abigahil dice:

    Hola, oye el de abrir que tipo de imagenes abre??

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: