一、画板界面的实现
简单分析:建立一个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) 绘制指定矩形的边框。矩形的左边缘和右边缘分别位于 x
和 x + width
。上边缘和下边缘分别位于 y
和 y + height
。使用图形上下文的当前颜色绘制该矩形。
圆角矩形:drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) 用此图形上下文的当前颜色绘制圆角矩形的边框。矩形的左边缘和右边缘分别位于 x
和 x + width
。矩形的上边缘和下边缘分别位于 y
和 y + height
。
画圆: drawOval(int x, int y, int width, int height) 绘制椭圆的边框。得到一个圆或椭圆,它刚好能放入由 x
、y
、width
和 height
参数指定的矩形中。
根据函数可以观察出这些图形均可由两点得到,可以在鼠标按下时得到一个点的坐标,鼠标释放时得到一个点的坐标,完成绘画。另外注意鼠标拖动的方向对图形的影响。
//画简单图形的方法 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()+"实现"); }
相关推荐
在给定的"简单画板开发总结"中,虽然具体使用的编程语言和库未明确指出,但我们可以假设它涉及到的是基本的绘图API的使用。 1. **绘图API**:无论是哪种语言,绘图API都是画板的核心。例如,HTML5的Canvas API提供...
JavaScript简易画板开发的知识点涉及HTML、CSS和JavaScript的综合运用。下面详细分解这些内容: HTML部分: 在HTML结构中,首先定义了一个带有id="bodys"的标签,这会是整个画板的基础容器。接着,通过几个标签分别...
【C# 2010 简易画板】是一个基于C# 2010编程语言开发的简易画图应用程序。这个程序为用户提供了一个简单的画板界面,允许用户进行基本的绘画操作,比如绘制直线、曲线、矩形、椭圆等图形,并能进行颜色选择、画笔...
《iOS中的简易画板开发详解》 在移动设备上,画板应用是一种常见的创意工具,让用户可以自由地绘制、涂鸦。"ios-画板.zip" 提供的是一款简易的画板应用程序,它具备最基础的绘画功能。本文将深入探讨iOS平台上构建...
C++程序开发基于Qt实现的简单绘画板程序源码+项目说明.zip 基于Qt实现的简单绘画板程序。 ## 功能介绍 - 绘制点、直线、椭圆、矩形等基本几何图形; - 存储、读取绘图文件; - 撤回、重做等功能; - 调节线宽、线条...
在这个iOS简单画板开发案例中,我们主要关注以下几个关键知识点: 1. **自定义视图(Custom View)**:为了创建画板,我们需要自定义一个UIView子类,例如命名为DrawView。这个视图会处理所有的绘图操作。自定义...
QT做的简易画板是一款基于Qt框架开发的图形用户界面应用,它允许用户通过鼠标操作进行基本的绘图活动。Qt是一个跨平台的应用程序开发框架,广泛应用于桌面、移动和嵌入式设备上,支持多种操作系统,如Windows、Linux...
【Python PyGame实现简易画板】\n\nPython作为一个强大的编程语言,因其简洁易懂的语法和丰富的库支持,常被用于开发各种类型的应用程序,包括游戏和图形用户界面(GUI)。PyGame是Python的一个库,它为创建游戏和...
这个简易画板程序是学习Qt GUI编程的一个良好起点,涵盖了基本的窗口创建、事件处理和图形绘制。随着技能的提升,可以进一步优化程序,如添加撤销/重做功能、多层绘图、自定义形状工具等。Qt提供的强大功能使得...
在Android开发中,创建一个简易画板应用是一个常见的练习,它可以帮助开发者深入理解自定义View的概念和绘图机制。这个源码项目就是基于这样的目的,使用了Android的自定义View来构建一个基本的画板功能,让用户可以...
【MFC简易画板】是基于Microsoft Foundation Class (MFC) 库开发的一款简单图形编辑器,它利用VC++开发工具实现,旨在提供类似于Windows操作系统自带的“画图”程序的功能。这款应用允许用户进行基本的绘图操作,如...
这个“mfc简易画板程序”是针对初学者的一个示例项目,旨在帮助他们理解和实践MFC框架的基本用法。 在MFC中,一个应用程序通常包含多个类,这些类对应于Windows的消息处理机制。例如,CWinApp类代表应用程序本身,...
在这个简易画板应用中,我们可能创建一个`Form`对象作为主窗口,并在其中添加一个无边框的`PictureBox`控件,用于显示画布。通过设置`PictureBox`的`SizeMode`属性为`StretchImage`,可以让其完全填充窗体空间。 ...
【基于C#的简易画板】是一个使用Visual Studio 2010开发的简单图形编辑器,主要功能是让用户能够绘制基本图形、擦除内容以及在导入的图像上进行绘图。这个项目对于初学者来说,是理解C#图形编程和Windows应用程序...
本项目"matlab简易画板GUI程序"是一个基本的图形画板应用,用户可以在这个画板上进行简单的绘图操作,如绘制点、线、矩形和椭圆,同时支持选择颜色和线条粗细。遗憾的是,目前该程序尚未实现添加文本框的功能。 ...
"简易画板.zip" 提供了一个简单易用的画板应用,允许用户绘制直线并选择多种颜色,这正是计算机图形绘制技术的一个基本体现。下面,我们将深入探讨这个领域的核心知识点。 首先,我们要理解什么是计算机图形。...
在Android开发中,创建一个简易画板(PaintOnTouchEvent)是一项常见的需求,它涉及到自定义View、触摸事件处理以及用户交互的设计。这个项目的核心在于如何有效地处理OnTouchEvent,以实现用户在屏幕上绘制图形的...
《Qt之简易画板:构建你的桌面绘画应用》 Qt是一个强大的跨平台应用程序开发框架,广泛应用于桌面、移动和嵌入式系统。本教程将基于Qt框架,介绍如何创建一个简单的画板应用,旨在帮助初学者理解Qt界面编程的基础...
【Qt简易画板】是一个基于Qt框架开发的简单绘图应用程序,主要利用了QPainterPath类的强大功能,为用户提供一个可以自由绘制各种图形的平台。这个项目虽然在类设计上可能略显粗糙,但对于初学者来说,是一个很好的...