Reputation: 323
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
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
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