我创建了一个程序,可以使人在画布上绘画或涂鸦,例如Microsoft Paint。您也可以选择其他颜色。当您最小化草图时,它将保留所有内容;当您最大化它时,草图将在您离开时显示。我希望能够保存草图并打开草图。我该怎么做?
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());
}
}
最佳答案
如果要保存到磁盘,可以采用多种方法。最简单的方法是保存每个像素的坐标和颜色矩阵。您还可以序列化Doodle类。保存后,您可以阅读并重新创建草图。