`
wz94
  • 浏览: 31421 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

简单画板的开发

阅读更多

 一、画板界面的实现

    简单分析:建立一个DrawingFrame类继承自JFrame类,在实例化后的窗体北边面板上加各种按钮,中间面板用来绘图。

    注意:1.因为绘图时只能在中间面板上画,所以不能直接在窗体上取画布。

               2.画图是在中间面板完成的,显而易见中间面板是一个事件源,而且画图方式是通过鼠标的按下(pressed)、释放(released)、单击(clicked)或者拖动(dragged)等完成的,所以要添加处理类实现鼠标监听器接口MouseListener和MouseMotionListener(或者继承类MouseAdapter),与之对应的鼠标事件类型是MouseEvent;点击不同按钮要完成不同形状或者绘图方式的切换,所以各按钮上要添加ActionListener来决定所画形状。

               3.在DrawingFrame类中定义一个字符型全局变量shapes,再定义一个getshape()方法,这样可以得到按钮上的命令。

 

DrawingFrame类的建立如下:

public class DrawingFrame extends JFrame{

	/**
	 *入口主函数
	 * @param args
	 */
	public static void main(String[] args) {
		//实例化一个界面
		DrawingFrame newFrame = new DrawingFrame();
		newFrame.initUI();
		

	}
	 
	private String shapes = "直线";
	
	public String getshapes(){
		return shapes;
	}
	//初始化界面的方法
	public void initUI(){
		
		this.setTitle("简单画板");//定义标题
		this.setLocation(250,100);//窗体位置
		this.setSize(700, 500);//窗体大小
		this.setResizable(false);//大小不可调整
		this.setDefaultCloseOperation(3);//关闭时退出程序
		//实例化两个面板
		JPanel northjp = creatNorthPanel();
		JPanel centerjp = creatCenterPanel();
		this.add(northjp,BorderLayout.NORTH);
		this.add(centerjp,BorderLayout.CENTER);
		this.setVisible(true);
		
		//获取画布必须在窗体可见之后,否则为null
		Graphics g = centerjp.getGraphics();
		g.setColor(Color.BLUE);
		//实例化一个DrawingListener类的处理对象
		DrawingListener dr = new DrawingListener(g,this);
		
		centerjp.addMouseListener(dr);
		centerjp.addMouseMotionListener(dr);
		
	
	}
	//创建北边面板的方法
	public JPanel creatNorthPanel(){
		
		JPanel jp = new JPanel();
		jp.setPreferredSize(new Dimension(0,50));
		jp.setBorder(null);
		ActionListener ac = new ActionListener(){
			public void actionPerformed(ActionEvent e){
				shapes = e.getActionCommand();
				if(shapes.equals("还原")){
					repaint();//清除画面
				}
				else if(shapes.equals("铅笔")){
					System.out.println(shapes+"模式");
				}
				else
				    System.out.println("现在选择画"+shapes);
			}
		};
	
		JButton jbuLine = new JButton("直线");
		JButton jbuRect = new JButton("矩形");
		JButton jbuRouR = new JButton("圆角矩形");
		JButton jbuCirc = new JButton("圆");
		JButton jbuTria = new JButton("三角形");
		JButton jbuClear = new JButton("还原");
		JButton jbuPencil = new JButton("铅笔");
		
		jbuLine.setBorderPainted(false);
		jbuLine.setFocusPainted(false);
		
		jbuRect.setBorderPainted(false);
		jbuRect.setFocusPainted(false);
		
		jbuRouR.setBorderPainted(false);
		jbuRouR.setFocusPainted(false);
		
		jbuCirc.setBorderPainted(false);
		jbuCirc.setFocusPainted(false);
		
		jbuTria.setBorderPainted(false);
		jbuTria.setFocusPainted(false);
		
		jbuClear.setBorderPainted(false);
		jbuClear.setFocusPainted(false);
		
		jbuPencil.setBorderPainted(false);
		jbuPencil.setFocusPainted(false);
		
		
		
		jbuLine.addActionListener(ac);
		jbuRect.addActionListener(ac);
		jbuRouR.addActionListener(ac);
		jbuCirc.addActionListener(ac);
		jbuTria.addActionListener(ac);
		jbuClear.addActionListener(ac);
		jbuPencil.addActionListener(ac);
		
		jp.add(jbuLine);
		jp.add(jbuRect);
		jp.add(jbuRouR);
		jp.add(jbuTria);
		jp.add(jbuCirc);
		jp.add(jbuClear);
		jp.add(jbuPencil);
		
		jp.setBackground(Color.DARK_GRAY);
		return jp;
	}
	
	//创建中间面板的方法
	public JPanel creatCenterPanel(){
		
		JPanel jp = new JPanel();
		jp.setBackground(Color.WHITE);
		jp.setBorder(null);
		
		
		return jp;
	}
	

	
	
	
}

 

二、建立图形图像处理类,该类实现MouseListener和MouseMotionListener接口,达到画画的目的

 

      MouseListener中处理鼠标事件的方法有 mousePressed(MouseEvent)(鼠标按下)、mouseReleased(MouseEvent)(鼠标释放)、mouseClicked(MouseEvent)(鼠标单击)、mouseEntered(MouseEvent)(鼠标进入)、mouseExited(MouseEvent)(鼠标离开)

      MouseListener中处理鼠标事件的方法有 mouseDragged(MouseEvent) (鼠标拖动)、mouseMoved(MouseEvent)(鼠标移动)

 

  1.简单图形的绘画(直线、矩形、圆、圆角矩形)

    在Graphics中有专门画简单图形的方法,这些方法可以直接调用。

      画直线: drawLine(int x1, int y1, int x2, int y2)      在此图形上下文的坐标系中,使用当前颜色在点 (x1, y1)(x2, y2) 之间画一条线。 

      画矩形: drawRect(int x, int y, int width, int height)      绘制指定矩形的边框。矩形的左边缘和右边缘分别位于 xx + width。上边缘和下边缘分别位于 yy + height。使用图形上下文的当前颜色绘制该矩形。

      圆角矩形:drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight)   用此图形上下文的当前颜色绘制圆角矩形的边框。矩形的左边缘和右边缘分别位于 xx + width。矩形的上边缘和下边缘分别位于 yy + height

      画圆: drawOval(int x, int y, int width, int height)      绘制椭圆的边框。得到一个圆或椭圆,它刚好能放入由 xywidthheight 参数指定的矩形中。

 

      根据函数可以观察出这些图形均可由两点得到,可以在鼠标按下时得到一个点的坐标,鼠标释放时得到一个点的坐标,完成绘画。另外注意鼠标拖动的方向对图形的影响。

//画简单图形的方法
	public void drawing(){
		//判断画直线
		if(fm.getshapes().equals("直线"))
			g.drawLine(x1, y1, x2, y2);
		//画矩形	
		if(fm.getshapes().equals("矩形")){
			if(x1<x2&&y1<y2)
			    g.drawRect(x1, y1, Math.abs(x2-x1), Math.abs(y2-y1));
			if(x1>x2&&y1<y2)
				g.drawRect(x2, y1, Math.abs(x2-x1), Math.abs(y2-y1));
			if(x1<x2&&y1>y2)
				g.drawRect(x1, y2, Math.abs(x2-x1), Math.abs(y2-y1));
			if(x1>x2&&y1>y2)
				g.drawRect(x2, y2, Math.abs(x2-x1), Math.abs(y2-y1));
		}
		//画圆角矩形
		if(fm.getshapes().equals("圆角矩形")){
			if(x1<x2&&y1<y2)
			    g.drawRoundRect(x1, y1, Math.abs(x2-x1), Math.abs(y2-y1),10,10);
			if(x1>x2&&y1<y2)
				g.drawRoundRect(x2, y1, Math.abs(x2-x1), Math.abs(y2-y1),10,10);
			if(x1<x2&&y1>y2)
				g.drawRoundRect(x1, y2, Math.abs(x2-x1), Math.abs(y2-y1),10,10);
			if(x1>x2&&y1>y2)
				g.drawRoundRect(x2, y2, Math.abs(x2-x1), Math.abs(y2-y1),10,10);
		}
		//画圆
		if(fm.getshapes().equals("圆")){
			if(x1<x2&&y1<y2)
				g.drawOval(x1, y1,Math.abs(x2-x1), Math.abs(x2-x1));
			if(x1>x2&&y1<y2)
				g.drawOval(x2, y1, Math.abs(x2-x1), Math.abs(x2-x1));
			if(x1<x2&&y1>y2)
				g.drawOval(x1, y2, Math.abs(x2-x1), Math.abs(x2-x1));
			if(x1>x2&&y1>y2)
				g.drawOval(x2, y2, Math.abs(x2-x1), Math.abs(x2-x1));
		}

 

public void mousePressed(MouseEvent e){
		//获取按下的坐标位置
		x1 = e.getX();
		y1 = e.getY();
}

public void mouseReleased(MouseEvent e){
		//获取释放的坐标位置
		x2 = e.getX();
		y2 = e.getY();
		//绘图函数
		drawing();
}

 

  2.画三角形(画一条直线后任点一点将该点与直线两端点连接)

    分析:先画了一条直线,画法与画直线相同。因为当鼠标单击时要完成与直线两端点的连接,所以必须要将之前的按下与释放坐标保存,然而单击过程就是一个按下+释放的过程,当完成单击时,之前所保存的坐标也更改了,按下、释放、单击的点的坐标就会相同。故而在监听器内要设置一个标志位,让按下、释放的点坐标得以保存。

public void mousePressed(MouseEvent e){
		//获取按下的坐标位置
		x1 = e.getX();
		y1 = e.getY();
		if(fm.getshapes().equals("三角形")){
			if(t==0){//t为标志位且初始值为0
				ax = x1;
				ay = y1;
				t=1;
			}
		}
}

 

public void mouseReleased(MouseEvent e){
		//获取释放的坐标位置
		x2 = e.getX();
		y2 = e.getY();
		//绘图函数
		drawing();
		if(fm.getshapes().equals("三角形")){
			if(t==1){
				g.drawLine(x1,y1,x2,y2);
				bx = x2;
				by = y2;
				t = 2;
			}

		}

}

 

public void mouseClicked(MouseEvent e) {
		
		if(fm.getshapes().equals("三角形")){
			if(t==2){
				g.drawLine(ax,ay,x1,y1);
				g.drawLine(bx,by,x1,y1);
				t = 0;
			}
		}
		
	}

 

  3.铅笔工具的实现

    分析:根据铅笔工具的特性,易想到使用MouseDragged,鼠标在画图板上朝不同方向拖动,拖动就会产生新的坐标,只要把新坐标和老坐标的点依次连接起来就是铅笔的效果。

   

private Polygon p = new Polygon();


public void mousePressed(MouseEvent e){
		p.addPoint(e.getX(), e.getY());
		if(fm.getshapes()=="铅笔"){
			firstp = p.npoints;
		}
		
	}



public void mouseDragged(MouseEvent e) {
		p.addPoint(e.getX(), e.getY());
		if(fm.getshapes()=="铅笔")
			for(int i = firstp;i<p.npoints-1;i++){
				System.out.println(p.xpoints[i]+"       "+p.ypoints[i]);
			g.drawLine(p.xpoints[i], p.ypoints[i], p.xpoints[i+1], p.ypoints[i+1]);
		
			}
			System.out.println(fm.getshapes()+"实现");
		
		
		
		
	}

 

 

  • 大小: 51.3 KB
0
1
分享到:
评论

相关推荐

    简单画板开发总结

    在给定的"简单画板开发总结"中,虽然具体使用的编程语言和库未明确指出,但我们可以假设它涉及到的是基本的绘图API的使用。 1. **绘图API**:无论是哪种语言,绘图API都是画板的核心。例如,HTML5的Canvas API提供...

    javascript简易画板开发

    JavaScript简易画板开发的知识点涉及HTML、CSS和JavaScript的综合运用。下面详细分解这些内容: HTML部分: 在HTML结构中,首先定义了一个带有id="bodys"的标签,这会是整个画板的基础容器。接着,通过几个标签分别...

    C# 2010 简易画板

    【C# 2010 简易画板】是一个基于C# 2010编程语言开发的简易画图应用程序。这个程序为用户提供了一个简单的画板界面,允许用户进行基本的绘画操作,比如绘制直线、曲线、矩形、椭圆等图形,并能进行颜色选择、画笔...

    ios-画板.zip

    《iOS中的简易画板开发详解》 在移动设备上,画板应用是一种常见的创意工具,让用户可以自由地绘制、涂鸦。"ios-画板.zip" 提供的是一款简易的画板应用程序,它具备最基础的绘画功能。本文将深入探讨iOS平台上构建...

    C++程序开发基于Qt实现的简单绘画板程序源码+项目说明.zip

    C++程序开发基于Qt实现的简单绘画板程序源码+项目说明.zip 基于Qt实现的简单绘画板程序。 ## 功能介绍 - 绘制点、直线、椭圆、矩形等基本几何图形; - 存储、读取绘图文件; - 撤回、重做等功能; - 调节线宽、线条...

    Android简易画板源码

    在Android开发中,创建一个简易画板应用是一个常见的练习,它可以帮助开发者深入理解自定义View的概念和绘图机制。这个源码项目就是基于这样的目的,使用了Android的自定义View来构建一个基本的画板功能,让用户可以...

    iOS简单画板开发案例分享

    在这个iOS简单画板开发案例中,我们主要关注以下几个关键知识点: 1. **自定义视图(Custom View)**:为了创建画板,我们需要自定义一个UIView子类,例如命名为DrawView。这个视图会处理所有的绘图操作。自定义...

    QT做的简易画板

    QT做的简易画板是一款基于Qt框架开发的图形用户界面应用,它允许用户通过鼠标操作进行基本的绘图活动。Qt是一个跨平台的应用程序开发框架,广泛应用于桌面、移动和嵌入式设备上,支持多种操作系统,如Windows、Linux...

    Python开发的PyGame实现简易画板_Demo

    【Python PyGame实现简易画板】\n\nPython作为一个强大的编程语言,因其简洁易懂的语法和丰富的库支持,常被用于开发各种类型的应用程序,包括游戏和图形用户界面(GUI)。PyGame是Python的一个库,它为创建游戏和...

    用qt 编写简易画板

    这个简易画板程序是学习Qt GUI编程的一个良好起点,涵盖了基本的窗口创建、事件处理和图形绘制。随着技能的提升,可以进一步优化程序,如添加撤销/重做功能、多层绘图、自定义形状工具等。Qt提供的强大功能使得...

    MFC简易画板

    【MFC简易画板】是基于Microsoft Foundation Class (MFC) 库开发的一款简单图形编辑器,它利用VC++开发工具实现,旨在提供类似于Windows操作系统自带的“画图”程序的功能。这款应用允许用户进行基本的绘图操作,如...

    mfc简易画板程序适合新人

    这个“mfc简易画板程序”是针对初学者的一个示例项目,旨在帮助他们理解和实践MFC框架的基本用法。 在MFC中,一个应用程序通常包含多个类,这些类对应于Windows的消息处理机制。例如,CWinApp类代表应用程序本身,...

    C#简易画板

    在这个简易画板应用中,我们可能创建一个`Form`对象作为主窗口,并在其中添加一个无边框的`PictureBox`控件,用于显示画布。通过设置`PictureBox`的`SizeMode`属性为`StretchImage`,可以让其完全填充窗体空间。 ...

    VC++课程设计_windows简单画板

    在本“VC++课程设计_windows简单画板”项目中,我们主要探讨了如何利用Microsoft的Visual C++(VC++)编程环境开发一个基础的Windows应用程序,即一个简单的画板工具。这个工具允许用户进行基本的绘图操作,如绘制...

    基于C#的简易画板

    【基于C#的简易画板】是一个使用Visual Studio 2010开发的简单图形编辑器,主要功能是让用户能够绘制基本图形、擦除内容以及在导入的图像上进行绘图。这个项目对于初学者来说,是理解C#图形编程和Windows应用程序...

    matlab简易画板GUI程序

    本项目"matlab简易画板GUI程序"是一个基本的图形画板应用,用户可以在这个画板上进行简单的绘图操作,如绘制点、线、矩形和椭圆,同时支持选择颜色和线条粗细。遗憾的是,目前该程序尚未实现添加文本框的功能。 ...

    简易画板.zip

    "简易画板.zip" 提供了一个简单易用的画板应用,允许用户绘制直线并选择多种颜色,这正是计算机图形绘制技术的一个基本体现。下面,我们将深入探讨这个领域的核心知识点。 首先,我们要理解什么是计算机图形。...

    Android简易画板PaintOnTouchEvent

    在Android开发中,创建一个简易画板(PaintOnTouchEvent)是一项常见的需求,它涉及到自定义View、触摸事件处理以及用户交互的设计。这个项目的核心在于如何有效地处理OnTouchEvent,以实现用户在屏幕上绘制图形的...

    qt之简易画板

    《Qt之简易画板:构建你的桌面绘画应用》 Qt是一个强大的跨平台应用程序开发框架,广泛应用于桌面、移动和嵌入式系统。本教程将基于Qt框架,介绍如何创建一个简单的画板应用,旨在帮助初学者理解Qt界面编程的基础...

Global site tag (gtag.js) - Google Analytics