`
齐在
  • 浏览: 11796 次
社区版块
存档分类
最新评论

实现重绘的仿XP画板

阅读更多
  • 做的是仿XP的画板,在功能上实现了铅笔、直线、喷枪、刷子、橡皮擦、矩形、圆角矩形、椭圆、多边形这些功能 ,左右键可以绘制不同颜色的图形。
  • 颜色栏有12种颜色可供选择,颜色框最左边的两个按钮分别以黑色和白色作为初始颜色
  • 下面来介绍一下整个思路: 
  1. 首先,需要创建好整个界面;
  2. 创建北边菜单栏,并利用一维数组和二维数组来存放文本内容;
  3. 创建西边工具栏面板,利用数组来存放图片名;
  4. 创建南边颜色栏面板,创建添加两个面板,一个用于放置展现左右键选定的颜色的按钮的面板,一个用于放置颜色选择的按钮(设置为网格布局);
  5. 创建中间面板(设置为流式布局左对齐),并另外创建一个放置画布的面板;
  6. 创建监听器的方法,并添加到事件源上(工具栏的按钮共用一个监听器,颜色栏的按钮共用另一个监听器);
  7. 将各种创建的面板添加到界面上(一般是在创建之后就添加,这样可以不断调试来完善功能,美化界面)
  8. 接下来要做的事情就是需要重绘画图板,让画图板在移动、放大、缩小等操作后仍然保持原来的状态。思路就是要把所画的每一个图案都存起来,包括图案的形状,颜色等,然后再需要把这些存放好的图案取出来,这个时候就需要利用数组来实现了。
//主界面代码
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;

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


public class FiFrame extends JFrame {
	public static void main(String args[]){
		FiFrame fiframe=new FiFrame();
		fiframe.FiPainter();
	}
	public void FiPainter(){
		//设置窗体关闭后退出
		this.setDefaultCloseOperation(3);
		//设置窗体的标题
		this.setTitle("终极画图板");
		this.setSize(1100, 600);
		this.setLocationRelativeTo(null);
		//调用创建北边菜单栏的方法
		this.NMenu();
		//调用创建西边面板的方法
		WPanel wpanel=new WPanel();
		this.add(wpanel,BorderLayout.WEST);		//设置位置为边框布局的西边
		//调用创建南边面板的方法
		SPanel spanel=new SPanel();
		this.add(spanel,BorderLayout.SOUTH);	//设置位置为边框布局的南边
		JPanel panel=new JPanel(){
			public void paint(Graphics g){
			super.paint(g);
			for(int i=0;i<FiListener.number;i++){
			Shapes shape =FiListener.array[i];
			shape.draw((Graphics2D)g);
		}
		}		
	};
		panel.setBackground(Color.WHITE);
		this.add(panel, BorderLayout.CENTER);
		//将窗体设置为可见
		this.setVisible(true);
		//只有在窗体可见之后才可以获取画布对象
		Graphics g=panel.getGraphics();
		String shapes;
		//调用创建监听器的方法,并传入参数
		FiListener fl=new FiListener(g,wpanel,spanel);
		//给事件源加上MouseListener和MouseMotionListener这两个监听器
		panel.addMouseListener(fl);
		panel.addMouseMotionListener(fl);
		
	}

	//定义一个创建菜单栏的方法
	public void NMenu(){
		//实例化一个JMenuBar类的对象nmenu
		JMenuBar nmenu = new JMenuBar();	
		//定义一个一维数组来存放JMenu中存放的文本内容
		String array[] = {"文字","查看","编辑","图像","颜色","帮助"};
		//定义一个二维数组来存放JMenuItem中存放的文本内容
		String [][] array2 ={{"新建","打开","保存"},{},{"工具箱","颜料盒"},{"清除"},{"编辑颜色"},{"关于画图"}};
		// 循环遍历array数组
		for(int i=0;i<array.length;i++){
			JMenu jmenu = new JMenu(array[i]);
			// 循环遍历array2数组
			for(int j=0;j<array2[i].length;j++){
				JMenuItem jmt=new JMenuItem(array2[i][j]);
				//将jmt添加到jmenu上
				jmenu.add(jmt);			
			}
			//将jmenu添加到nmenu上
			nmenu.add(jmenu);				
		}
		this.add(nmenu,BorderLayout.NORTH);
	}
	
}

 

//监听器代码
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Random;

public class FiListener extends MouseAdapter {
	private boolean flag = true;
	private int x0,y0,x1,y1,x2,y2,x3,y3;
	private Graphics2D g;
	private SPanel spanel;
	private WPanel wpanel;
	public static Shapes[] array=new Shapes[10000];
	public static int number=0; 
	
	public FiListener(Graphics g,WPanel wpanel,SPanel spanel){
		this.wpanel=wpanel;
		this.spanel=spanel;
		this.g=(Graphics2D) g;
	}


	public void mouseClicked(MouseEvent e) {
    	//绘制多边形
    	if(flag==false && wpanel.getShapes().equals("png/多边形.png")){
    		int x=e.getX();
    		int y=e.getY();
    		Shapes shape=new ShapeLine(x3, y3, x, y,wpanel.getShapes(),g.getColor());
    		shape.draw(g);
    		array[number] = shape;
        	number++;
    		 if(x==x3 && y==y3){  
    			shape= new ShapeLine(x, y, x2, y2,wpanel.getShapes(),g.getColor());
    	    	shape.draw(g);
        		array[number] = shape;
            	number++;
    			flag=true;  
    		}  
    		x3=x;
    		y3=y;
    	}
    }
    public void mousePressed(MouseEvent e) {
    	//得到初始点的位置

    	x0=e.getX();
    	y0=e.getY();
    	
    	//获取颜色
    	if(e.getButton() ==1){
    				g.setColor(spanel.colorleft());
    			}
    	if(e.getButton()==3){
    				g.setColor(spanel.colorright());
    			}  		    
    }	
    public void mouseDragged(MouseEvent e){
    	//用铅笔绘制
		if(wpanel.getShapes().equals("png/铅笔.png")){
        	x1=e.getX();
        	y1=e.getY();
    		Shapes shape= new ShapeLine(x0, y0, x1, y1,"png/铅笔.png",g.getColor());
    		shape.draw(g);
        	//将末位置变成下一次的初始位置
        	x0=x1;
        	y0=y1;
    		array[number] = shape;
        	number++;
    	}
    	//使用橡皮擦
    	if(wpanel.getShapes().equals("png/橡皮擦.png")){
        	x1=e.getX();
        	y1=e.getY();
        	g.setColor(Color.WHITE);
        	((Graphics2D) g).setStroke(new BasicStroke(10));
    		Shapes shape= new ShapeLine(x0, y0, x1, y1,wpanel.getShapes(),g.getColor());
    		shape.draw(g);

    		//将末位置变成下一次的初始位置
        	x0=x1;
        	y0=y1;
        	array[number] = shape;
        	number++;
    	}
    	//使用喷枪绘制
    	if(wpanel.getShapes().equals("png/喷枪.png")){
        	x1=e.getX();
        	y1=e.getY();
        	Random r= new Random();
        	for(int i=0;i<20;i++){
        	int x= r.nextInt(10);
        	int y= r.nextInt(10);
        	((Graphics2D) g).setStroke(new BasicStroke(1));
    		Shapes shape= new ShapeLine(x1+x, y1+y, x1+x,y1+y,wpanel.getShapes(),g.getColor());
    		shape.draw(g);

        	//将末位置变成下一次的初始位置
        	x0=x1;
        	y0=y1;
        	array[number] = shape;
        	number++;
        
        	}
    	}
    	//使用刷子绘制
    	if(wpanel.getShapes().equals("png/刷子.png")){
        	x1=e.getX();
        	y1=e.getY();
        	((Graphics2D) g).setStroke(new BasicStroke(10));
    		Shapes shape= new ShapeLine(x0, y0, x1, y1,wpanel.getShapes(),g.getColor());
    		shape.draw(g);
        	//将末位置变成下一次的初始位置
        	x0=x1;
        	y0=y1;
        	array[number] = shape;
        	number++;
    	}
    }
    public void mouseMoved(MouseEvent e){

    }
    public void mouseReleased(MouseEvent e) {
    	if(wpanel.getShapes().equals("png/直线.png")){
        	x1=e.getX();
        	y1=e.getY();
        	((Graphics2D) g).setStroke(new BasicStroke(1));
    		Shapes shape= new ShapeLine(x0, y0, x1, y1,wpanel.getShapes(),g.getColor());
    		shape.draw(g);
    	   	array[number] = shape;
        	number++;
    	}
    	if(wpanel.getShapes().equals("png/矩形.png")){
        	x1=e.getX();
        	y1=e.getY();
        	((Graphics2D) g).setStroke(new BasicStroke(1));
        	Shapes shape=new ShapeRect(x0, y0, x1, y1,wpanel.getShapes(),g.getColor());
        	shape.draw(g);
           	array[number] = shape;
        	number++;
    	}
    	if(wpanel.getShapes().equals("png/圆角矩形.png")){
        	x1=e.getX();
        	y1=e.getY();
        	((Graphics2D) g).setStroke(new BasicStroke(1));
           	Shapes shape=new ShapeRect(x0, y0, x1, y1,wpanel.getShapes(),g.getColor());
        	shape.draw(g);
           	array[number] = shape;
        	number++;
    	}
    	if(wpanel.getShapes().equals("png/椭圆.png")){
        	x1=e.getX();
        	y1=e.getY();
        	((Graphics2D) g).setStroke(new BasicStroke(1));
        	Shapes shape=new ShapeRect(x0, y0, x1, y1,wpanel.getShapes(),g.getColor());
        	shape.draw(g);
           	array[number] = shape;
        	number++;	
    	}
    	if(wpanel.getShapes().equals("png/多边形.png")){
        	x1=e.getX();
        	y1=e.getY();
			if(flag){	
			Shapes shape1=new ShapeLine(x0, y0, x1, y1,wpanel.getShapes(),g.getColor());
        	shape1.draw(g);
    		array[number] = shape1;
        	number++;
        	x2=x0;
        	y2=y0;
        	x3=x1;
        	y3=y1;
			flag=false;

			}        		
    	}
    }
}

 

//颜色栏
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JButton;
import javax.swing.JPanel;

public class SPanel extends JPanel {
	private Color color;
	public SPanel(){
		spanel();
	}
	//创建调用left按钮颜色的方法
	public Color colorleft(){		
		return buttonleft.getBackground();		
	}
	//创建调用right按钮颜色的方法
	public Color colorright(){		
		return buttonright.getBackground();	
	}
	
	private JButton buttonright = new JButton();
	private JButton buttonleft = new JButton();
	// 事件处理类对象
	private MouseAdapter md=new  MouseAdapter(){
		public void mousePressed(MouseEvent e) {
			//获取事件源对象
			JButton button = (JButton) e.getSource();
			color = button.getBackground();
			//如果按下的是鼠标左键则改变的是left的背景颜色
			if(e.getButton() ==1){
				buttonleft.setBackground(color);
			}
			//如果按下的是鼠标左键则改变的是right的背景颜色
			if(e.getButton()==3){
				buttonright.setBackground(color);
			}
		}
	};
	public void spanel(){
		this.setPreferredSize(new Dimension(0,50));
		this.setLayout(new FlowLayout(FlowLayout.LEFT));
		this.setBackground(Color.WHITE);
		
		JPanel panel1 = new JPanel();
		panel1.setLayout(null);
		panel1.setPreferredSize(new Dimension(40,40));
		//设置left按钮的大小和背景颜色
		buttonleft.setBounds(8, 8, 15, 15);
		buttonleft.setBackground(Color.BLACK);
		//设置right按钮的大小和背景颜色
		buttonright.setBounds(16, 16, 15, 15);
		buttonright.setBackground(Color.WHITE);
			
		panel1.add(buttonleft);
		panel1.add(buttonright);
		this.add(panel1);
		
		JPanel panel2 = new JPanel();
		//设置为网格布局,二行六列
		panel2.setLayout(new GridLayout(2,6));
		Color array[] ={Color.BLACK,Color.RED,Color.CYAN,Color.LIGHT_GRAY,
				Color.magenta,Color.WHITE,Color.BLUE,Color.GRAY,
				Color.green,Color.orange,Color.pink,Color.yellow};
		for(int i=0;i<array.length;i++){
			JButton jbutton = new JButton();
			jbutton.setBackground(array[i]);
			jbutton.setPreferredSize(new Dimension(15,15));
			jbutton.addMouseListener(md);

			panel2.add(jbutton);
		}
		this.add(panel2);
	}
	public Color getcolor() {
		return color;
	}
}

 

//工具栏代码
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JPanel;


public class WPanel extends JPanel {
	private String shapes="png/铅笔.png";
	public WPanel(){
			wpanel();
	}
	public String getShapes(){
		return shapes;
	}
	public void wpanel(){
		//定义一个一维数组来存放工具栏图片的名字
		String array[]={"png/裁剪.png","png/选定.jpg","png/橡皮擦.png","png/填充.png","png/取色.png",
				"png/放大镜.png","png/铅笔.png","png/刷子.png","png/喷枪.png","png/文字.png","png/直线.png",
				"png/曲线.png","png/矩形.png","png/多边形.png","png/椭圆.png","png/圆角矩形.png"};
		ActionListener al = new ActionListener(){
			public void actionPerformed(ActionEvent e) {
				shapes=e.getActionCommand();
			}
		};
		for(int i=0;i<array.length;i++){
			//实例化ImageIcon类的对象icon
			ImageIcon icon = new ImageIcon(array[i]);
			JButton jbutton = new JButton(icon);
			//获取所选择的图形按钮所对应的图片名称
			jbutton.setActionCommand(array[i]);
			jbutton.addActionListener(al);
			jbutton.setPreferredSize(new Dimension(25,25));
			this.add(jbutton);
		}

		this.setPreferredSize(new Dimension(60,0));
		this.setBackground(Color.LIGHT_GRAY);
		
	}
}

 

import java.awt.Color;
import java.awt.Graphics2D;


public abstract class Shapes {
	private int x0,y0,x1,y1;
	private Color color;
	private String shapes;
	public void Shapes(){
		
	}
	public void Shapes(int x0, int y0,int x1,int y1, String shapes,Color color){
		this.x0=x0;
		this.y0=y0;
		this.x1=x1;
		this.y1=y1;
		this.shapes=shapes;
		this.color=color;
		}
	public int getX0() {
		return x0;
	}
	public void setX0(int x0) {
		this.x0 = x0;
	}
	public int getY0() {
		return y0;
	}
	public void setY0(int y0) {
		this.y0 = y0;
	}
	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 Color getColor() {
		return color;
	}
	public void setColor(Color color) {
		this.color = color;
	}
	public String getShapes() {
		return shapes;
	}
	public void setShapes(String shapes) {
		this.shapes = shapes;
	}
	public void draw(Graphics2D g) {

	}
}

 

//画直线类图形
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;


public class ShapeLine extends Shapes {
	public ShapeLine(int x0, int y0,int x1,int y1, String shapes,Color color){
		super.Shapes(x0, y0, x1, y1, shapes,color);
	}

	public void draw(Graphics2D g) {
		
		if(getShapes().equals("png/铅笔.png")||getShapes().equals("png/直线.png")||getShapes().equals("png/喷枪.png")){
			g.setColor(getColor());
			g.setStroke(new BasicStroke(1));
		}
		else if(getShapes().equals("png/橡皮擦.png")){
			g.setColor(Color.WHITE);
			g.setStroke(new BasicStroke(10));
		}
		else if(getShapes().equals("png/刷子.png")){
			g.setColor(getColor());
			g.setStroke(new BasicStroke(10));
		}
		else{
			g.setColor(getColor());
			g.setStroke(new BasicStroke(1));
		}
		g.drawLine(getX0(), getY0(), getX1(), getY1());
		
	}
	
}

 

//画矩形类图形
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;


public class ShapeRect extends Shapes{
	public ShapeRect(int x0, int y0,int x1,int y1, String shapes,Color color){
		super.Shapes(x0, y0, x1, y1, shapes,color);
	}

		public void draw(Graphics2D g){
			
			g.setColor(getColor());
			g.setStroke(new BasicStroke(1));
			if(getShapes().equals("png/圆角矩形.png")){

				 g.drawRoundRect(getX0(), getY0(),Math.abs(getX1()-getX0()), Math.abs(getY1()-getY0()), 50, 50);
			}
			else if(getShapes().equals("png/矩形.png")){
				g.drawRect(getX0(),getY0(), 
						Math.abs(getX1()-getX0()), Math.abs(getY1()-getY0()));
			}
			else if(getShapes().equals("png/椭圆.png")){
				g.drawOval(getX0(),getY0(), 
						Math.abs(getX1()-getX0()), Math.abs(getY1()-getY0()));
			}
			
		}
	
	
}

 

 

 

 

  • 大小: 18.3 KB
1
2
分享到:
评论
1 楼 LinApex 2014-04-20  
功能实现的不错,用Java写软件已经非常少了吧。

相关推荐

    Java实现画板(Java小程序 模仿Win系统画板)

    在本文中,我们将深入探讨如何使用Java编程语言来实现一个类似于Windows操作系统中的简易画板程序。这个Java小程序将提供基本的绘图功能,使用户能够通过鼠标或触控设备进行绘画创作。 首先,我们需要理解Java GUI...

    仿windows的画板

    【标题】"仿windows的画板"是一款基于Visual Studio 2005的MFC应用程序,它模仿了Windows操作系统内置的画板工具,并在此基础上扩展了一些实用功能。这个项目旨在为用户提供一个类似系统画板的图形编辑环境,同时...

    MFC实现高仿画板、绘图软件功能(带详细注释)

    在VS2015环境下,利用MFC框架实现的一款高仿“画图”工具,实现绝大部分功能甚至更多创新点。(注释超详细) 实现了点、直线、曲线、折线、矩形、圆形、多边形等等形状,并且具有区域限制、鼠标捕捉等功能; 实现了...

    XP自带画板

    《深入探索XP系统自带画板》 XP操作系统中内置的画板工具,是许多用户初次接触数字绘画的起点。这个简单而实用的程序,虽然在功能上无法与专业级的图像编辑软件相比,但它的易用性和基础功能,使得它在日常生活中...

    仿windows画板.zip

    总结来说,"仿windows画板.zip"是一个全面展示C#编程和图形界面设计能力的项目,它结合了GDI+图形库,实现了基本的绘图工具和文件操作功能,为学习者提供了实际操作和理解图形用户界面编程的宝贵经验。

    GDI绘图实现WINDOWS画板

    本项目“GDI绘图实现WINDOWS画板”旨在利用GDI来模仿并实现Windows附件中的画板程序,提供基本的绘画功能,如绘制线条、形状、填充颜色等,使得用户可以进行自由创作。 GDI的核心概念包括: 1. **设备上下文...

    VC6.0 实现的仿windows 画板程序(painter)

    "VC6.0 实现的仿windows 画板程序(painter)"这个标题揭示了我们讨论的核心内容,即一个基于Visual C++ 6.0(简称VC6.0)开发的图形用户界面应用,该程序模仿了Windows操作系统内置的“画图”工具。"仿windows 画板...

    e语言-易语言利用画板实现自绘列表

    2. **绘制列表项**:在画板的重绘事件中,我们需要遍历数据源,根据每一项数据的内容和格式,在画板上进行绘制。这可能涉及到字符串格式化、字体设置、颜色选择等细节。 3. **滚动处理**:为了实现滚动功能,需要...

    安卓手绘图片处理画板相关-Android手写签名.rar

    6. **性能优化**:在处理大量用户手势时,可能需要考虑性能优化,如使用离屏Canvas减少重绘,或者在合适的时候才更新View,避免不必要的渲染。 7. **用户交互设计**:为了让用户有更好的签名体验,可能需要添加橡皮...

    安卓手绘图片处理画板相关-android模仿windows自制画板.rar

    【标题】"安卓手绘图片处理画板相关-android模仿windows自制画板.rar"涉及的核心知识点主要集中在Android应用开发上,特别是关于图像处理和用户交互的实现。在这个项目中,开发者试图在Android平台上创建一个类似...

    基于Qt+C++实现底层绘图算法的绘图系统/画板+源码+项目文档+使用说明+技术报告(毕业设计&课程设计&项目开发)

    基于Qt+C++实现底层绘图算法的绘图系统/画板+源码+项目文档+使用说明+技术报告,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档~ 已实现的功能 直线...

    (源码)高仿windows画板.rar

    这是一个关于C#编程语言实现的高仿Windows画板软件的源码资源。这个项目旨在提供一个功能完备的、与原版Windows画板相似的应用程序,适用于学习和参考。通过分析和理解这段源码,开发者可以深入掌握C#编程在图形用户...

    安卓手绘图片处理画板相关-DrawPanel双缓冲实现画板.rar

    这个名为"DrawPanel双缓冲实现画板"的压缩包文件包含了一个安卓应用的源码,它使用了双缓冲技术来优化画板的性能。下面我们将详细探讨这一技术以及在安卓开发中的应用。 首先,我们要理解什么是双缓冲技术。在图形...

    易语言画板组件实现自绘圆形进度条源码.rar

    进度条是易语言常用的一个组件,有时候我们想让进度有个性,比如绘制一个圆形进度条,...窗口用到三个编辑框,一个时钟,一个标签,一个画板,三个颜色选择器,效果如下图,我们可以灵活调整双环椭圆大小,颜色等等。

    安卓手绘图片处理画板相关-利用Bitmap做的简单的画板.zip

    SurfaceView提供了一个独立的线程来处理绘图,可以实现更流畅的动画效果,而View则更适合静态的、低刷新率的显示。在这些视图中,会覆写onTouchEvent方法,以监听用户的触摸事件,从而确定画笔的起始和结束位置。 ...

    安卓手绘图片处理画板相关-高仿小红书App发布内容在图片上编辑标签和标签的回显.rar

    在安卓平台上,手绘图片处理画板是一种常见的应用,它允许用户通过触控方式在图片上添加各种元素,如文字、图形或者标签,以实现个性化的内容创作或分享。本资源"安卓手绘图片处理画板相关-高仿小红书App发布内容在...

    安卓手绘图片处理画板相关-Android颜色选择器效果展示.rar

    8. **性能优化**:处理大量颜色时,可能需要考虑性能优化,比如避免不必要的重绘和内存泄漏。 由于压缩包中可能包含多个文件,如布局文件(XML)、Java或Kotlin源代码、资源文件(如图片、颜色值)等,开发者需要...

    C#使用GDI+制作仿windows画板程序

    在本文中,我们将深入探讨如何使用C#编程语言和GDI+库来创建一个仿Windows画板应用程序。GDI+(Graphics Device Interface Plus)是.NET Framework中的一个图形处理API,它为开发者提供了丰富的图形绘制功能,包括...

    安卓手绘图片处理画板相关-android实现的公章效果.rar

    本资源“安卓手绘图片处理画板相关-android实现的公章效果.rar”提供了关于如何在Android上实现公章效果的示例代码。虽然无法逐一验证所有内容,但我们可以深入探讨其中涉及的关键技术点。 首先,公章效果通常包括...

    C# 画画板 仿window画画板

    "C# 画画板 仿window画画板"项目是一个利用C#语言构建的简单画板应用,旨在模仿Windows操作系统内建的画图工具。这个项目对于初学者来说是一个很好的实践平台,它可以帮助开发者了解图形用户界面(GUI)的设计,以及...

Global site tag (gtag.js) - Google Analytics