仿XP画板

  • 做的是仿XP的画板,在功能上实现了铅笔、直线、喷枪、刷子、橡皮擦、矩形、圆角矩形、椭圆、多边形这些功能 ,左右键可以绘制不同颜色的图形。同时,在裁剪工具上实现的是颜色渐变的立体图形,在放大镜工具上实现的是立体感的圆角矩形柱体(虽然比较粗糙)。
  • 颜色栏有12种颜色可供选择,颜色框最左边的两个按钮分别以黑色和白色作为初始颜色。

 

  • 下面来介绍一下整个思路:  
  1. 首先,需要创建好整个界面;
  2. 创建北边菜单栏,并利用一维数组和二维数组来存放文本内容;
  3. 创建西边工具栏面板,利用数组来存放图片名;
  4. 创建南边颜色栏面板,创建添加两个面板,一个用于放置展现左右键选定的颜色的按钮的面板,一个用于放置颜色选择的按钮(设置为网格布局);
  5. 创建中间面板(设置为流式布局左对齐),并另外创建一个放置画布的面板;
  6. 创建监听器的方法,并添加到事件源上(工具栏的按钮共用一个监听器,颜色栏的按钮共用另一个监听器);
  7. 将各种创建的面板添加到界面上(一般是在创建之后就添加,这样可以不断调试来完善功能,美化界面)。
//主界面代码
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
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 cpanel=this.CPanel();
		//将窗体设置为可见
		this.setVisible(true);
		//只有在窗体可见之后才可以获取画布对象
		Graphics g=cpanel.getGraphics();
		//调用创建监听器的方法,并传入参数
		FiListener fl=new FiListener(g,wpanel,spanel);
		//给事件源加上MouseListener和MouseMotionListener这两个监听器
		cpanel.addMouseListener(fl);
		cpanel.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);
	}

	//定义一个创建中间面板的方法
	public JPanel CPanel(){
		JPanel cpanel1=new JPanel();	//实例化一个JPanel类的对象cpanel1
		cpanel1.setBackground(Color.gray);
		cpanel1.setLayout(new FlowLayout(FlowLayout.LEFT));		//设置为流式布局左对齐
		
		JPanel cpanel2=new JPanel();
		cpanel2.setBackground(Color.WHITE);
		cpanel2.setPreferredSize(new Dimension(700,420));
		cpanel1.add(cpanel2);
		this.add(cpanel1);
		return cpanel2;		
	}	
	
}

 

 

//监听器代码
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;

	int max(int a,int b){
		if(a<b) a=b;
		return a;
	}
	int min(int a,int b){
		if(a>b) a=b;
		return a;
	}
	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();
    		g.drawLine(x3, y3, x, y);
    		if(x==x3 && y==y3){
    			g.drawLine(x, y, x2, y2);
    			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();
        	g.setStroke(new BasicStroke(1));
        	g.drawLine(x0, y0 ,x1,y1);	
        	//将末位置变成下一次的初始位置
        	x0=x1;
        	y0=y1;
    	}
    	//使用橡皮擦
    	if(wpanel.getShapes().equals("png/橡皮擦.png")){
        	x1=e.getX();
        	y1=e.getY();
        	g.setColor(Color.WHITE);
        	g.setStroke(new BasicStroke(10));
        	g.drawLine(x0, y0 ,x1,y1);	
        	//将末位置变成下一次的初始位置
        	x0=x1;
        	y0=y1;
    	}
    	//使用喷枪绘制
    	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);
        	g.setStroke(new BasicStroke(1));
        	g.drawLine(x1+x, y1+y, x1+x,y1+y);
        	//将末位置变成下一次的初始位置
        	x0=x1;
        	y0=y1;
        	}
    	}
    	//使用刷子绘制
    	if(wpanel.getShapes().equals("png/刷子.png")){
        	x1=e.getX();
        	y1=e.getY();
        	g.setStroke(new BasicStroke(10));
        	g.drawLine(x0, y0 ,x1,y1);	
        	//将末位置变成下一次的初始位置
        	x0=x1;
        	y0=y1;

    	}
    }
    public void mouseMoved(MouseEvent e){

    }
    public void mouseReleased(MouseEvent e) {
    	if(wpanel.getShapes().equals("png/直线.png")){
        	x1=e.getX();
        	y1=e.getY();
        	g.setStroke(new BasicStroke(1));
        	g.drawLine(x0, y0, x1, y1);	
    	}
    	if(wpanel.getShapes().equals("png/矩形.png")){
        	x1=e.getX();
        	y1=e.getY();
        	g.setStroke(new BasicStroke(1));
        	g.drawRect(min(x0,x1), min(y0,y1), Math.abs(x1-x0), Math.abs(y1-y0));	
    	}
    	if(wpanel.getShapes().equals("png/圆角矩形.png")){
        	x1=e.getX();
        	y1=e.getY();
        	g.setStroke(new BasicStroke(1));
        	g.drawRoundRect(min(x0,x1), min(y0,y1), Math.abs(x1-x0), Math.abs(y1-y0),50,50);	
    	}
    	if(wpanel.getShapes().equals("png/椭圆.png")){
        	x1=e.getX();
        	y1=e.getY();
        	g.setStroke(new BasicStroke(1));
        	g.drawOval(min(x0,x1), min(y0,y1), Math.abs(x1-x0), Math.abs(y1-y0));	
    	}
    	if(wpanel.getShapes().equals("png/多边形.png")){
        	x1=e.getX();
        	y1=e.getY();
			if(flag){
        	g.drawLine(x0, y0, x1, y1);
        	x2=x0;
        	y2=y0;
        	x3=x1;
        	y3=y1;
			flag=false;
			}        		
    	}
    	if(wpanel.getShapes().equals("png/放大镜.png")){
    		Random r=new Random();
			int m=r.nextInt(200);
			int n=r.nextInt(250);
			int q=r.nextInt(250);
    		x1=e.getX();
        	y1=e.getY();
    		for(int i=0;i<20;i++){
        		g.setColor(new Color(m,n,q));    		
        		g.drawRoundRect(min(x0,x1), min(y0,y1), Math.abs(x1-x0),
        				Math.abs(y1-y0)-4*i, 50,40);
    		}
    	}
    	if(wpanel.getShapes().equals("png/裁剪.png")){
    		Random r=new Random();
    		x1=e.getX();
        	y1=e.getY();
    		for(int i=0;i<100;i++){
    			int m=r.nextInt(200);
    			int n=m+50;
    			int q=m+24;
        		g.setColor(new Color(m,n,q));
    			g.fillOval(min(x0,x1), min(y0,y1),
    					Math.abs(x1-x0), Math.abs(y1-y0)-6*i);
    		}
    	}
    }
}

 

 

//颜色栏
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);
	}
}

 

//工具栏代码
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);
		
	}
}

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WinForm是一种用于开发Windows桌面应用程序的技术,而仿Windows画板绘图指的是基于WinForm技术开发的一个应用程序,功能类似于Windows自带的画图工具。 WinForm实现的仿Windows画板绘图需要通过以下几个步骤完成: 1. 创建WinForm窗体应用程序:使用Visual Studio等集成开发环境创建一个新的WinForm项目。 2. 设计窗体界面:在窗体上添加各种控件,如菜单栏、工具栏、画板等,以及相应的事件处理函数。 3. 实现画图功能:在画板控件上实现绘图功能,可以使用GDI+进行绘图操作。比如,可以使用鼠标事件来捕捉用户的画图动作,然后根据用户的操作在画板上绘制相应的图形。 4. 添加工具栏与菜单栏:通过在窗体上添加工具栏和菜单栏,为用户提供各种绘图工具和选项,如画笔、橡皮擦、线条颜色、线条粗细等。 5. 实现保存与打开功能:为了让用户能够保存绘制的图形,应该提供保存和打开功能。可以使用文件对话框来选择保存的路径和文件名,然后将画板上的图形以文件的形式保存起来,并能够在需要的时候打开并显示在画板上。 通过以上步骤,便可以完成WinForm实现的仿Windows画板绘图。用户可以在画板上使用各种绘图工具来创作和编辑图形,还可以保存和打开绘制的图形文件。这样的应用程序可以满足用户对于简单绘图的需求,并且通过WinForm的可视化设计,可以方便快捷地操作和管理画板上的图形。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值