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

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

阅读更多

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

 


保存;



 
 

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
分享到:
评论

相关推荐

    jQuery图片自定义热区

    **jQuery图片自定义热区**是一种网页开发技术,主要用于增强用户体验,通过在图像上创建可交互的区域,用户可以通过点击或悬停在这些热区上获取额外信息或执行特定操作。这种技术通常用于地图、产品展示或其他需要...

    Android 自定义裁剪图片

    总之,自定义图片裁剪功能在Android应用中具有广泛的应用,通过理解并实践上述步骤,开发者可以创建出符合自己应用需求的裁剪功能。同时,`CropDemo`这样的示例项目是学习和参考的好资源,可以帮助我们更好地理解和...

    S7-200SMART-自定义填表与先进先出FIFO示例程序.zip

    本资料将重点探讨如何在S7-200SMART中实现自定义填表与先进先出(FIFO)的操作,以提高系统效率和数据管理能力。 一、自定义填表 自定义填表是PLC编程中的一个重要概念,它允许用户根据特定需求创建并存储数据。在...

    自定义DatePickerDialog的实现

    2. 创建自定义`DatePickerDialog`类:继承`DatePickerDialog`,并重写构造函数,以便在创建实例时传入自定义布局。在构造函数中,通过`LayoutInflater`加载自定义布局,并替换默认的布局。 ```java public class ...

    易语言自定义数据类型与字节集转换

    "自定义写出内存"是指将自定义数据类型的数据写入内存,这可能是为了临时存储、处理或传递这些数据。而"字节集文件到自定义"和"写到自定"可能指的是从字节集文件读取数据并转换回自定义数据类型,或者将自定义数据...

    QTreeView树形视图使用自定义模型model

    - 在`testTreeView`项目中,可能包含了创建和使用自定义模型的示例代码,包括模型类的定义、数据结构的实现以及与`QTreeView`的关联等。 通过以上步骤,我们可以构建出一个符合业务需求的自定义模型,配合`...

    自定义plugin插件实现phonegap与Android交互

    在"自定义plugin插件实现phonegap与Android交互"这个主题中,我们主要关注的是如何通过编写自定义插件来打通JavaScript和Android之间的通信壁垒。在PhoneGap中,Plugin是连接Web层和Native层的桥梁,它们是用Java...

    idea插件开发-自定义语言

    本教程将专注于自定义语言的插件开发,特别是如何利用properties文件和customLanguage API来实现这一目标。以下是一些核心知识点: 1. **IntelliJ IDEA 插件开发环境搭建** 在开始开发之前,首先需要安装IntelliJ ...

    ASP.NET Core自定义中间件如何读取Request.Body与Response.Body的内容详解

    通过正确地备份、读取和恢复`Request.Body`和`Response.Body`,我们可以在自定义中间件中实现对请求和响应数据的全面监控。这在开发日志记录、安全审计或其他需要拦截请求和响应数据的场景中特别有用。理解这些核心...

    火山PC写出内置资源文件例子

    这段代码将内置的"图片.bmp"资源读取到内存,然后创建一个新的"output.bmp"文件并将图片数据写出。请注意,实际编程时需要处理可能的错误,如资源不存在、文件无法打开等。 总的来说,火山PC提供了强大的资源管理...

    vue-video-player 通过自定义按钮组件实现全屏切换效果【推荐】

    在本文中,我们将探讨如何使用`vue-video-player`这个Vue.js组件来实现自定义全屏切换效果。`vue-video-player`是一个基于`video.js`的视频播放器,它提供了丰富的API和自定义选项,使得在Vue项目中集成视频播放变得...

    AJ-Report是一个完全开源,拖拽编辑的可视化设计工具。三步快速完成大屏:配置数据源----&gt;写SQL配置.zip

    通过AJ-Report,用户只需经历三个简单步骤:配置数据源、编写SQL查询以及进行可视化布局,就能实现数据的高效呈现。 一、配置数据源 在AJ-Report中,配置数据源是构建大屏报告的第一步。这个过程涉及连接到各种数据...

    select下拉列表显示图片内容

    使用JavaScript和CSS进行事件监听和样式控制,可以实现与原生下拉列表相似的交互效果。 3. **使用第三方库**: 有一些前端框架和库如jQuery、React、Vue等提供了扩展的下拉组件,它们支持在选项中插入HTML内容,...

    qt文件操作读写自定义类型

    本例程重点介绍了如何在Qt环境下,通过重载QDataStream的operator和operator&gt;&gt;来实现自定义类型的数据读写,从而简化对文件的操作。 首先,理解QDataStream类是Qt中处理二进制数据流的核心工具,它允许我们以结构化...

    QT自定义dialog提示窗

    在QT编程中,自定义对话框(Dialog)是一种常见的需求,它允许用户与应用程序进行交互,展示特定的信息或接收用户的输入。本项目“QT自定义dialog提示窗”着重于通过纯代码方式创建对话框,无需使用UI文件。下面将...

    微信小程序获取用户信息和自定义token两种方法

    首先,微信小程序提供了获取用户基本信息的功能,主要通过`wx.login()`和`wx.getUserInfo()`两个API实现。`wx.login()`用于获取用户的临时登录凭证(code),而`wx.getUserInfo()`则用于获取用户的昵称、头像等基本...

    Tcl教程------若干基本命令介绍.pdf

    Tcl的高级特性包括数组、信息查询命令(如info)、自定义命令执行(如unknown)、动态载入扩展库等,这些特性使得Tcl能够适应各种复杂的编程场景。 通过学习以上内容,读者可以掌握Tcl编程的基础知识,进而可以编写...

    ZedBoard-自定义IP核实现+PS成功调用【详细步骤+流程介绍+源码

    ### ZedBoard-自定义IP核实现与PS成功调用详解 #### 一、概述 在本文档中,我们将深入探讨如何在ZedBoard平台上实现自定义IP核,并将其成功地与PS(Processing System)部分进行集成。ZedBoard是一款基于Xilinx Zynq...

    C语言实现自定义Simulink模块

    C语言作为底层编程的强大工具,与Simulink结合,能够实现高效且灵活的自定义模块。本教程将深入探讨如何利用C语言来创建自定义的Simulink模块。 一、Simulink基础 Simulink是MATLAB的一个扩展,主要用于系统级的...

    Js之canvas获取图片主色调,近似色,互补色,以及根据图片颜色获取主题配色方案详解、插件

    本文将深入探讨如何利用Canvas API来获取图片的主要色调、近似色、互补色,并且基于这些颜色信息创建主题配色方案。我们将不涉及任何具体插件的使用,而是通过JavaScript原生方法实现这一过程。 首先,我们需要加载...

Global site tag (gtag.js) - Google Analytics