Java - 保存草图

标签 java

我创建了一个程序,可以让人们在 Canvas 上绘画或涂鸦,例如 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);

    }

}

涂鸦.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 类。保存后,您可以阅读本文并重新创建草图。

关于Java - 保存草图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20614048/

相关文章:

Java套接字编程——连接完成之前套接字超时

java - 使用出生日期计算年龄

java - Aerospike : Retrieve a set of keys from LDT Bin in one call

java - 以下 Hibernate 自定义 ID 生成器代码是否正确?

java - libgdx 粒子编辑器的多种用途

java - 获取 .Jar 中资源的路径以在 Controller 中使用

java - 第458章 UVA解码器解释(line.charAt(i)-7)

java - Double.parse 失败

java - 如何避免pdfbox附加单独的单词

java - 如何禁用 spring-security 登录屏幕?