`
百合不是茶
  • 浏览: 344851 次
社区版块
存档分类
最新评论

自定义图片读取与写出--基本实现

阅读更多

自定义文件的格式,可以进行保存与打开,正在学习,下面的代码不是很难,主要是要想清楚:

 


保存;



 
 

package 画图板升级0516;
/**
 *画图板的升级

 */
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import javax.swing.*;
import javax.swing.GroupLayout.Group;


public class DrawUI extends JFrame{

	// 单选按钮组
	ButtonGroup group = new ButtonGroup();
	String path = "F:\\file1\\a.image";// 保存文件的路径
	JPanel center;
	public static void main(String[] args) {
		DrawUI draw = new DrawUI();
		draw.creatDraw();
	}
	
	 /**
	  * 初始化窗体
	  */
    public void creatDraw(){
    	
    	 this.setTitle("画图板");
		 this.setSize(500,300);
		 //退出JFrama
		 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		 //设置窗体的布局为Border
		 BorderLayout layout = new BorderLayout();
		 this.setLayout(layout);
		 //设置菜单按钮
		 JMenuBar  bar = creatJMenuBar();
		 this.setJMenuBar(bar);
		 
		 JPanel  left =this.creatleft() ;
		 JPanel center = this.creatCenter();
		 JPanel bottom = this.creatBottom();

		 
		 //设置边框布局
		 this.add(left,BorderLayout.WEST);
		 this.add(center,BorderLayout.CENTER);
		 this.add(bottom,BorderLayout.SOUTH);
		
		 this.setVisible(true);
		 
		 DrawListener lis = new DrawListener(group);
		 center.addMouseListener(lis);
	}
    
    /**
     * 创建菜单条的方法
     * @return
     */
    
      public  JMenuBar  creatJMenuBar(){
    	  
    	  JMenuBar bar = new JMenuBar();
    	  JMenu menu = new JMenu("文件");
    	  
    	  JMenuItem saveitem = new JMenuItem("保存");
    	  saveitem.setActionCommand("save");
    	  
    	  JMenuItem openitem = new JMenuItem("打开");
    	  openitem.setActionCommand("open");
    	  
    	  menu.add(saveitem);
    	  menu.add(openitem);
    	  
    	  bar.add(menu);
    	  
    	  //创建监听器的的对象
    	  ActionListener alis = new MyListener();
    	   saveitem.addActionListener(alis);
    	   openitem.addActionListener(alis);
    	 
    	  
    	 return bar;
      }
    
    
    /**
     * 设置左边
     * @return
     */
    
    public JPanel creatleft(){
		 //左边
		 JPanel left = new JPanel();
		 //设置背景颜色
		 left.setBackground(new Color(200,200,200,200));
		 //设置最佳大小
		 left.setPreferredSize(new Dimension(50,100));
		 
		 //在左边添加按钮
		 String[] items = { "直线", "矩形", "椭圆"};
		 String[] commands = { "line", "rect", "oval" };
		 for(int i = 0 ;i<items.length;i++){
			 //设置单选按钮
			 JRadioButton btn = new JRadioButton(items[i]);
			 //设置按钮的动作命令
			 btn.setActionCommand(commands[i]);
			// 分为同一个组
				group.add(btn);
				if (i == 0) {//设置第一个被选中
					btn.setSelected(true);
				}
				left.add(btn);

		 }
		 
		 return left;
    }
    
    /**
     * 设置中间
     * @return
     */
    public JPanel creatCenter(){
    	 //中间
		 center = new myJPanel();
		 center.setBackground(Color.WHITE);
			return center;
    }
    
    /**
     * 设置右边
     * @return
     */
    
    public  JPanel creatBottom(){
    	 //下边
		 JPanel bottom = new JPanel();
		 bottom.setBackground(new Color(200,200,200,200));
		 //设置大小setPreferredSize指设置最佳大小
		 bottom.setPreferredSize(new Dimension(50,50));
		 return bottom;
    }
    

/**
 * 
 * @author 
 *重写paint()的方法
 */
    class myJPanel extends JPanel{
    	public void paint(Graphics g) {
    		super.paint(g);
    		// 遍历保存形状的队列
    		for (int i = 0; i < DrawListener.list.size(); i++) {
    			// 取得一个形状对象
    			Shape sh = DrawListener.list.get(i);
    			// 绘制形状
    			sh.draw(g);
    	
    		}
    	}
   
    }
    
    
    //添加监听器
    class MyListener implements ActionListener{

		@Override
		public void actionPerformed(ActionEvent e) {
			//得到动作命令
		String command = e.getActionCommand();
		System.out.println(command);
		if(command.equals("save")){
			try{
				// 将内存中的形状队列保存到文件中
				File file = new File(path);
				FileOutputStream fos = new FileOutputStream(file);

				// 包装成对象流
				ObjectOutputStream oos = new ObjectOutputStream(fos);

				// 写对象之前先要保存形状的个数
				oos.writeInt(DrawListener.list.size());

				for (int i = 0; i < DrawListener.list.size(); i++) {
					Shape sh = DrawListener.list.get(i);
					// 将对象写到文件中
					oos.writeObject(sh);
				}

				// 强制输出
				oos.flush();
				fos.close();

				
			}catch(Exception ef){
				ef.printStackTrace();
			}
			
		}if(command.equals("open")){
			try{
				
				
				// 建立文件输入流
				File file = new File(path);
				FileInputStream fis = new FileInputStream(file);
				ObjectInputStream ois = new ObjectInputStream(fis);

				// 先读取形状的个数
				int len = ois.readInt();
				for (int i = 0; i < len; i++) {
					// 读取一个形状对象
					Shape sh = (Shape) ois.readObject();
					//将读取到的形状对象保存到队列中
					DrawListener.list.add(sh);
					
				}
				
				fis.close();
				//刷新绘制面板
				center.repaint();
				
			}catch(Exception ef){
				ef.printStackTrace();
			}
			
		}
		
		}
    	
    }
    
}

 

package 画图板升级0516;

import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;

import javax.swing.ButtonGroup;
import javax.swing.JPanel;

public class DrawListener extends MouseAdapter{
	  static ArrayList<Shape> list = new ArrayList<Shape>();
      int x1,x2,y1,y2;
      private Graphics g;
      private ButtonGroup group;
	 private String command;
	 private Color c;
      
      public DrawListener(ButtonGroup group){
    	  this.group = group;
      }
      
	  public void mousePressed(MouseEvent e) {
		  //获得获得事件源对象
		  JPanel center =(JPanel) e.getSource();
		    // 只需要绘制在center上,所以需要从Center上取画布
			// 获得center组件在屏幕上占据的区域
		  g = center.getGraphics();
			// 获得要绘制的形状
			// 得到按钮组中被选中的按钮的动作命令
		  command =group.getSelection().getActionCommand();
		  
		  x1 = e.getX();
		  y1 = e.getY();
	  }

	 
	    public void mouseReleased(MouseEvent e) {
		  x2 = e.getX();
		  y2 = e.getY();
		  
		  if(command.equals("line")){
			  Line line = new Line(x1, y1, x2, y2, c);
			  list.add(line);
			  line.draw(g);
		  }else if(command.equals("rect")){
			Rect rect =new Rect(x1, y1, x2, y2, c); 
			list.add(rect);
			rect.draw(g);
		  }
	
	    }
	    
}

 

 package 画图板升级0516;

import java.awt.Color;
import java.awt.Graphics;
import java.io.Serializable;



public abstract class Shape implements Serializable  {

	int x1,x2,y1,y2;
	 Color c; 
	 void draw(Graphics g){
		 
	 }
	
}

 

package 画图板升级0516;

import java.awt.Color;
import java.awt.Graphics;

public class Line extends Shape {
	public Line(int x1, int y1, int x2, int y2, Color c) {
		this.x1 = x1;
		this.y1 = y1;
		this.x2 = x2;
		this.y2 = y2;
		this.c = c;
	}
	public void draw(Graphics g){
		g.setColor(c);
		g.drawLine(x1, y1, x2, y2);
		
	}

}

 

package 画图板升级0516;
import java.awt.Color;
import java.awt.Graphics;

public class Rect extends Shape {

	public Rect(int x1, int y1, int x2, int y2, Color c) {
		this.x1 = x1;
		this.y1 = y1;
		this.x2 = x2;
		this.y2 = y2;
		this.c = c;
	}
	public void draw(Graphics g){
		g.setColor(c);
		g.drawRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1 - x2),
				Math.abs(y1 - y2));

	}
}

 

  • 大小: 19.7 KB
  • 大小: 7.3 KB
0
0
分享到:
评论

相关推荐

    Linux简明教程.rar

    2.5 创建只读用户自定义变量 2.6 读取标准输入 3. 脚本参数传递 4. 注释与程序头 5. 程序控制 5.1 if-then-elif-else-fi语句 5.2 for语句 5.3 while语句 5.4 until语句 5.5 break和continue命令 5.6 case...

    基于Dubbo实现的SOA分布式(没有实现分布式事务)-SpringBoot整合各种组件的JavaWeb脚手架+源代码+文档

    - 获取图片验证码 - 登录:解决重复登录问题 - 注册 - 分页查询用户信息 - 修改用户信息 ## 站内信模块 - 一对一发送站内信 - 管理员广播 - 读取站内信(未读和已读) - 一对多发送站内信 ## 文件模块 - ...

    易语言程序免安装版下载

    易语言5.1 相对于易语言5.0更新说明: ... 修改XML解析支持库,增加写出CDATA数据功能,解决解析XML时错误的丢弃换行和TAB字符的BUG,解决读取节点值时对CDATA数据进行转义处理的BUG。 20. 修改扩展界面支持库...

    Vue编写可显示周和月模式的日历 Vue自定义日历内容的显示

    之前写了一篇周和月日历,但感觉体验不是太好,所以有重新做了一遍,加上了动画。还可以自定义显示日历里的内容。 现在贴出项目源码,我现在是放在CSDN里的下载资源,这里哦 现在我上传带了GitHub上了,可以去这里下载...

    SoftMgr.exe(软件自选安装管理)

    // rd=后写出程序结束时删除的文件夹(相对路径即可),如:software等 ;// delmyself=后为1将删除程序自身;为2将删除所在文件夹。 ;// 程序版本:5.10.3.6 ;// 全自定义配置文件,包括窗口界面连接,作者信息...

    新版Android开发教程.rar

    � 由于是源代码开放的产品,对非主导厂商而言,可以避开与主导厂商在核心技术上面的差距,开发出 更 具竞争力和差异化的产品。 对运营商的影响 � 丰富的数据业务,将导致数据流量的显著增加 。 � 手机来源增加,...

    自定自定义音乐播放器项

    分别对每个问题进行分析,该问题是否能用某个知识或技能解决:如能,写出该知识点或技能点的使用;如不能,该问题又该分为哪几个子问题来解决。 需要提交的文件 本次项目的安卓工程 本项目生成的apk文件 描述程序...

    vc++ 开发实例源码包

    该实例可进行局域网的聊天、一对多、多对一、和多对多的传送和续传,理论上这是我本人的实现目的,而且目前经测试已基本实现了上述功能,而且网速一般有几M/S。另外有只打开一个应用程序、CRichEdit的使用、最小到...

    multiCCL_f

     (本版的 multiccl_m.exe 和 memtest.exe 与过去的版本不兼容) 2006-11-5 v 1.120 (仅针对内存定位模块) 因为有的杀毒软件监视远程线程,用注入法要先关闭这个监视 感觉这样有些麻烦,改用发消息让宿主...

    KODExplorer 芒果云-资源管理器

    ie8以下基本上不做兼容处理。chrome支持文件夹拖拽上传。 [文件打开] office文件在线预览功能,服务器必须在公网(外部能访问该服务器) [忘记密码] 修改data/system/member.php 密码为明文的md5值 例如将admin密码重...

    我整理的VBA 自定义函数大全 共138页

    23.人民币大小写转换 24.获取区域颜色值 25.获取活动工作表名 26.获取最后一行行数 27.判断是否连接在线 28.币种转换 29.检验工作表是否有可打印内容 30.查找一字符串(withinstr)在另一字符串中(findstr1)中某一次...

    MFC数字图像处理(BMP格式读取 保存 DFT FFT 直方图 色调均化 缩放 模糊 锐化 滤镜 形态学处理 曲线 裁剪 灰度图 彩色图 自动阈值)

    然后就是那个FFT滤波的对话框,这里只写出了一个雏形(毕竟这几天清明节没有时间去写,求原谅- -),其实只能看看有什么功能而已,实现的函数其实还没有写的- -。 不过这次的作业并没有要求需要写FFT之后的滤波,...

    软件病毒特征码定位软件multiCCL

    ((听 tankaiha 一说还真不想写GUI界面了)) 需要说明的问题是:  1. 开始定位一个样本时,如果发现样本目录中存在旧的记录文件,  程序会读取并认可 旧记录中的特征码。 如果想完全重新开始定位,应该先把旧...

    android自定义View在软键盘上方,监听软键盘的状态一个测量其高度

    在软键盘弹出后随即弹出自定义的PopuWindow在其上方,里面还给PopuWindow加入了显示 和消失的动画,另外实现了对软键盘显示和隐藏状态的监听,以及对其高度的测量,需要做些逻辑处理的话可以直接在里面写相关的代码...

    《Windows高级编程指南(第三版)》(含PASCAL例子)

    SEHSum -- 利用SEH机制, 修复堆栈溢出 SEHTerm -- 演示SEH终止处理和异常抛出 SEHExcpt -- 利用SEH机制, 稀疏提交数组内存 SEHSoft -- 抛出自定义异常通知程序清零记录 Bucket -- SWMRG复合同步对象 (单写入/多读取)...

    ExtAspNet v2.2.1 (2009-4-1) 值得一看

    -修正了在Grid的PageIndexChange事件中不能获取SelectedRowIndexArray属性的BUG(feedback:Violet)。 -Button控件将不再自动拥有display:inline属性,如果希望两个按钮在一行显示,请为第一个按钮设置CssStyle=...

    IE WebBrowser编程技巧

    WebBrowser与MSHTML 直接在WebBrowser中写HTML字符串 在webbrowser中查找字符串并定位 把图片拷贝进剪贴板 IHTMLDocument的ExecCommand 处理事件的Internet Explorer中的DOM 禁止WebBrowser右键弹出菜单 禁止...

    asp.net知识库

    .net 2.0 访问Oracle --与Sql Server的差异,注意事项,常见异常 Ado.net 与NHibernate的关系? 动态创建数据库 SQL Server数据库安全规划全攻略 .net通用数据库访问组件SQL Artisan应用简介1 在Framework1.0下...

    java源码包---java 源码 大量 实例

     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...

Global site tag (gtag.js) - Google Analytics