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