文件保存打开简单的图形

  1. 开篇之闲谈:  前一段时间因为自身的一些事情自己的一些问题,好久没有写博客.这两天跟身边的好哥们聊聊天之后顿时觉得豁然开朗,同时也认识到了自身的问题.所以不管怎么说既来之则安之吧,既然选择了这条道路也许是没有尽头的一条路,不过还要是一如既往的坚持到底......
  2. 该类代码写的可能比较多吧,写该类的时候自己的思路就是,个人的理解就是文件就是一个输入流输出流,然后输入流就调用read();方法即可,可以实现打开文件的功能.但是在打开一个文件之前首先实现的文件的保存,保存要用的方法就是write();方法.
  3. 写该类的时候遇到问题就是怎么判断自己画线还是画圆,而且在打开保存的时候到底打开的是线还是圆,这是就要加一个标志符了,标识符后要紧跟着自己read()或是write()的方法.

    package cgh20130720文件保存打开图形;

    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.FlowLayout;
    import java.awt.Graphics;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Random;

    import javax.swing.JFrame;
    import javax.swing.JMenu;
    import javax.swing.JMenuBar;
    import javax.swing.JMenuItem;
    import javax.swing.JPanel;
    import javax.swing.JSeparator;

    /**
    * 定义一个图形界面类对象继承自JFrame
    *
    * @author Allen
    *
    */
    public class FileFrame extends JFrame {

    public static void main(String[] args) {
    // 创建一个对象调用窗体初始化的方法
    FileFrame ff = new FileFrame();
    ff.INtUI();
    }

    // 定义一个数组队列保存坐标信息
    public List<Shape> list = new ArrayList<Shape>();

    // 图形对象的属性
    private Shape shape;
    private Graphics g;

    // 判断变量的标志
    private int type;

    private int x1, y1;
    private int x2, y2;

    // 初始化一个界面的方法
    public void INtUI() {

    /*
    * 调用窗体的方法
    */
    this.setTitle("永不消失的图形");
    this.setSize(650, 500);
    this.setResizable(false);
    this.setLocationRelativeTo(null);

    // 创建一个面板对象
    JPanel jp = new JPanel();
    jp.setPreferredSize(new Dimension(645, 45));
    jp.setLayout(new FlowLayout(FlowLayout.LEFT));

    // 创建按钮栏对象
    JMenuBar jmenub = new JMenuBar();
    // 创建菜单选项
    JMenu jmenu = new JMenu("文件");
    // 添加菜单到菜单栏
    jmenub.add(jmenu);

    /*
    * 创建子菜单选项
    */
    JMenuItem jmenui = new JMenuItem("打开");
    // 菜单子项添加监听器
    ActionListener al = new ActionListener() {

    public void actionPerformed(ActionEvent e) {
    System.out.println("你输出的是: " + e.getActionCommand());
    // 判断执行的按钮
    if (e.getActionCommand().equals("保存")) {

    // 文件及数据输出流
    try {
    java.io.FileOutputStream fio = new java.io.FileOutputStream(
    "G:/图形界面类的打开.txt");
    java.io.DataOutputStream das = new java.io.DataOutputStream(
    fio);

    // 队列中所有图形的个数
    int count = list.size();
    // 将图形个数写入文件
    das.writeInt(count);

    // 循环遍历图形
    for (int i = 0; i < count; i++) {
    shape = list.get(i);//遍历得到图形

    if (shape instanceof Line) {
    /*
    * 将画出的直线坐标写入文件
    */
    das.writeInt(1);
    das.writeInt(shape.getX1());
    das.writeInt(shape.getY1());
    das.writeInt(shape.getX2());
    das.writeInt(shape.getY2());
    das.writeInt(shape.getColor().getRGB());

    }

    if (shape instanceof Cycle) {
    /*
    * 将画出的圆的坐标写入文件
    */
    das.writeInt(2);
    das.writeInt(shape.getX1());
    das.writeInt(shape.getY1());
    das.writeInt(shape.getX2());
    das.writeInt(shape.getY2());
    das.writeInt(shape.getColor().getRGB());

    }
    }
    // 写完数据后关闭输出流
    das.close();

    } catch (Exception e1) {

    e1.printStackTrace();
    }
    }

    // 判断点击的按钮
    if (e.getActionCommand().equals("打开")) {

    try {
    // 文件及数据的输入流
    java.io.FileInputStream fin = new java.io.FileInputStream(
    "G:/图形界面类的打开.txt");
    java.io.DataInputStream dai = new java.io.DataInputStream(
    fin);

    // 读出图形的个数
    int count = dai.readInt();
    System.out.println(count);
      
    // 循环遍历图形
    for (int i = 0; i < count; i++) {

    type = dai.readInt();//判断标志
    System.out.println("读到的type " + type);
    /**
    * 读出写入文件的信息
    */
    if (type == 1) {
    int x1 = dai.readInt();
    int y1 = dai.readInt();
    int x2 = dai.readInt();
    int y2 = dai.readInt();
    int rgb = dai.readInt();
    System.out.println("读到的x1坐标是: "+x1);
    g.setColor(new Color(rgb));
    g.drawLine(x1, y1, x2, y2);// 画直线
    }

    if (type == 2) {
    /**
    * 读出写入文件的信息
    */
    int x1 = dai.readInt();
    int y1 = dai.readInt();
    int x2 = dai.readInt();
    int y2 = dai.readInt();
    int rgb = dai.readInt();
    g.setColor(new Color(rgb));
    g.drawOval(x1, y1, Math.abs(x2 - x1), Math
    .abs(y2 - y1));// 画圆
    }
    }

    // 读完后关闭输入流
    dai.close();
        } catch (Exception e1) {

    e1.printStackTrace();
    }

    }
    /*
    * 根据标志符来画图形
    */
    if (e.getActionCommand().equals("画线")) {
    System.out.println("画线判断执行了");
    type = 1;
    }

    if (e.getActionCommand().equals("画圆")) {
    type = 2;
    }

    }
    };

    JMenuItem jmenui1 = new JMenuItem("保存");
    JMenuItem jmenui2 = new JMenuItem("画线");
    JMenuItem jmenui3 = new JMenuItem("画圆");

    /*
    * 添加监听器
    */
    jmenui.addActionListener(al);
    jmenui1.addActionListener(al);
    jmenui2.addActionListener(al);
    jmenui3.addActionListener(al);
    /*
    * 创建水平分隔符对象
    */
    JSeparator js = new JSeparator();
    JSeparator js2 = new JSeparator();
    JSeparator js3 = new JSeparator();
    /*
    * 添加到菜单上
    */
    jmenu.add(jmenui);
    jmenu.add(js);
    jmenu.add(jmenui1);
    jmenu.add(js2);
    jmenu.add(jmenui2);
    jmenu.add(js3);
    jmenu.add(jmenui3);
    // 将菜单栏添加到面板上
    jp.add(jmenub);
    this.add(jp);// 添加面板

            //关闭窗体退出程序
    this.setDefaultCloseOperation(3);
    // 设置窗体可见
    this.setVisible(true);

    // 取得画布对象
    g = this.getGraphics();

    // 给窗体添加监听器
    MouseListener mouse = new MouseListener() {

    public void mouseClicked(MouseEvent e) {

    }

    public void mouseEntered(MouseEvent e) {


    }

    public void mouseExited(MouseEvent e) {


    }

    public void mousePressed(MouseEvent e) {

    x1 = e.getX();// 点击鼠标将得到坐标传给shape对象
    y1 = e.getY();
    }

    public void mouseReleased(MouseEvent e) {
    x2 = e.getX();
    y2 = e.getY();
    // 设置随机数
    Random rand = new Random();
    // 设置画的颜色
    Color cl = new Color((rand.nextInt(256)), (rand.nextInt(256)),
    rand.nextInt(256));

    // 得到颜色
    g.setColor(cl);

    // 当为1的时候画线
    if (type == 1) {
                        //创建一个直线类对象
    shape = new Line();
    /*
    * 将坐标存入直线对象
    */
    shape.setX1(x1);
    shape.setY1(y1);
    shape.setX2(x2);
    shape.setY2(y2);
    shape.setColor(cl);// 直线对象得到颜色
    System.out.println("画线执行了");
    g.drawLine(shape.getX1(), shape.getY1(), shape.getX2(),
    shape.getY2());// 画一条直线

    list.add(shape);//将直线对象添加到队列
    }

    // 当为2的时候画圆
    if (type == 2) {
                        //创建一个圆类的对象
    shape = new Cycle();
    /*
    * 存入圆的坐标
    */
    shape.setX1(x1);
    shape.setY1(y1);
    shape.setX2(x2);
    shape.setY2(y2);
    System.out.println("画圆执行了");
    shape.setColor(cl);// 直线对象得到颜色
    g.drawOval(shape.getX1(), shape.getY1(), Math.abs(shape
    .getX1()- shape.getX2()), Math.abs(shape.getY1()- shape.getY2()));// 画一个圆

    list.add(shape);//将圆添加到队列
    }
    }
    };
    // 窗体上添加监听器
    this.addMouseListener(mouse);
    }
    }
  4. 这里写了一个父类Shape类,后面不管是直线还是圆都是继承该类,这里代码就不用一一写出了;

 package cgh20130720文件保存打开图形;

import java.awt.Color;

/**
 * 定义一个父类shape
 * @author Allen
 *
 */
public class Shape {

//定义一个坐标属性 
private int x1,y1;
private int x2,y2;
//定义颜色属性
private Color color;
/*
 * 定义普通的方法
 */
public int getX1() {
 return x1;
}
public void setX1(int x1) {
 this.x1 = x1;
}
public int getY1() {
 return y1;
}
public void setY1(int y1) {
 this.y1 = y1;
}
public int getX2() {
 return x2;
}
public void setX2(int x2) {
 this.x2 = x2;
}
public int getY2() {
 return y2;
}
public void setY2(int y2) {
 this.y2 = y2;
}
public Color getColor() {
 return color;
}
public void setColor(Color color) {
 this.color = color;
}
}
 

猜你喜欢

转载自1498116590.iteye.com/blog/1915816