Sameer Anand
Sameer Anand

Reputation: 323

Java - Saving a Sketch

I created a program that lets a person draw or doodle on a canvas, like Microsoft Paint. You can also select a different color. When you minimize the sketch, it preserves everything and when you maximize it, the sketch shows up as you left it. I want to be able to save a sketch and open a sketch. How would I be able to do that?

SketchPad.java

package drs;

import java.awt.BorderLayout;
import javax.swing.JFrame;

/**
 *
 * @author Sameer Anand
 * 
 */

public class SketchPad extends JFrame {

    public static void main(String[] args) {

        SketchPad sp = new SketchPad("My Sketch Pad");

        sp.setVisible(true);

    }

    public SketchPad(String title) {

        super(title);

        this.setLayout(new BorderLayout());

        Canvas c = new Canvas();

        this.add(c,BorderLayout.CENTER);

        ButtonPanel bp = new ButtonPanel(c);

        this.add(bp,BorderLayout.NORTH);

        this.setSize(400,400);

    }

}

Doodle.java

package drs;

import java.awt.Color;
import java.awt.Point;
import java.util.ArrayList;


/**
 *
 * @author Sameer Anand
 * 
 */

class Doodle {

    private ArrayList<Point> points = new ArrayList<Point>();

    private Color theColor;

    public Doodle(Color color) {

        theColor = color;

    }

    public ArrayList<Point> getPoints() {

        return points;

    }

    public Color getColor() {

        return theColor;

    }

    public void add(Point p) {

        points.add(p);

    }

}

Canvas.java

package drs;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.ArrayList;
import javax.swing.JPanel;

/**
 *
 * @author Sameer Anand
 * 
 */

class Canvas extends JPanel implements MouseListener, MouseMotionListener {

    // a canvas has-a current location

    private int currentX, currentY;
    private Doodle currentDoodle;
    private Color currentColor = Color.BLACK;

    // a canvas has-a bunch of doodles

    private ArrayList<Doodle> doodles = new ArrayList<Doodle>();

    public Canvas() {

        this.addMouseListener(this);

        //this.addMouseMotionListener(this);

    }

    @Override
    public void paint(Graphics g) {

        System.out.println("Painting");

        for (Doodle d : doodles) {

            ArrayList<Point> pts = d.getPoints();

            // remember "old" color and use the "current" color instead

            Color old = g.getColor();

            g.setColor(d.getColor());


            for (int i = 0; i < pts.size()-1; i++) {

                g.drawLine((int)pts.get(i).getX(),(int)pts.get(i).getY(),
                    (int)pts.get(i+1).getX(),(int)pts.get(i+1).getY());

            } 

            // reset the color

            g.setColor(old);

        }

    }

    public void setCurrentColor(Color c) {

        currentColor = c;

    }

    @Override
    public void mouseClicked(MouseEvent e) {

        System.out.println("Clicked " + e);

    }

    @Override
    public void mousePressed(MouseEvent e) {

        this.addMouseMotionListener(this);

        currentX = e.getX();

        currentY = e.getY();

        Doodle d = new Doodle(currentColor);

        currentDoodle = d;

        doodles.add(d);

        d.add(new Point(currentX,currentY));

    }

    @Override
    public void mouseReleased(MouseEvent e) {

        System.out.println("Released " + e);

        this.removeMouseMotionListener(this);

    }

    @Override
    public void mouseEntered(MouseEvent e) {

        System.out.println("Entered " + e);

    }

    @Override
    public void mouseExited(MouseEvent e) {

        System.out.println("Exited " + e);;

    }

    @Override
    public void mouseDragged(MouseEvent e) {

        Graphics g = this.getGraphics();

        Color old = g.getColor();

        g.setColor(currentColor);

        g.drawLine(currentX, currentY, e.getX(), e.getY());

        currentX = e.getX();

        currentY = e.getY();

        Point p = new Point(currentX, currentY);

        currentDoodle.add(p);

        g.setColor(old);

    }

    @Override
    public void mouseMoved(MouseEvent e) {

        System.out.println("Moved " + e);    

    }

}

ButtonPanel.java

package drs;

import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JPanel;

/**
 *
 * @author Sameer Anand
 * 
 */

public class ButtonPanel extends JPanel implements ActionListener {

    private Canvas canvas;

    public ButtonPanel(Canvas canvas) {

        this.canvas = canvas;

        this.setLayout(new FlowLayout());

        Color[] colors = {Color.BLACK, Color.RED, Color.GREEN, Color.BLUE };

        String[] names = {"Black", "Red", "Green","Blue"};

        for (int i = 0; i < colors.length; i++) {

            Color c = colors[i];

            String n = names[i];

            JButton jb = new JButton(n);

            jb.setForeground(c);

            jb.addActionListener(this);

            add(jb);

        }

    }

    @Override
    public void actionPerformed(ActionEvent e) {

        JButton j = (JButton) e.getSource();

        canvas.setCurrentColor(j.getForeground());

    }

}

Upvotes: 0

Views: 238

Answers (2)

adi
adi

Reputation: 1741

If you want to save to disk, there are number of ways. Easiest is to save matrix of each pixel coordinate and color. Yor can also serialise the Doodle class. Once saved, you can read this and recreate the sketch.

Upvotes: 2

geert3
geert3

Reputation: 7331

You would make Doodle implement Serializable, then you can simply save the Doodle as XML like this:

    XMLEncoder enc = null;
    String fileName = ...;
    try
    {
        enc = new XMLEncoder(new FileOutputStream(new File(fileName)));
        enc.writeObject(doodle);
    }
    catch (IOException e)
    {
        ...
    }
    finally
    {
        if (enc != null)
            enc.close();
    }

And load:

        XMLDecoder d = null;
        try
        {
            d = new XMLDecoder(new FileInputStream(new File(...)));
            return (Doodle)d.readObject();
        }
        finally
        {
            if (d != null)
                d.close();
        }

Upvotes: 1

Related Questions