1、是通过队列来实现的。
简单说就是通过队列来存储你画的信息。 但是除了这些除了需要自定义队列,还需要创建一个形状的抽象类,这里包括一些绘制形状的共同属性和方法。
(1)自定义队列
这里最好能够使用泛型。
泛型是指在定义类时,先不指明具体类型,而是等到实例化时再指明。
public class MyArray1<E>{ //创建一个数组对象,数组长度为0 Object array[]=new Object[0]; //创建返回元素下标的值 int x=0; /** * 添加一个值为s的元素 * @param s 添加的元素的值 */ public void add(E e){ //再次创建一个数组,数组的长度为原数组+1 Object array1[]=new Object[array.length+1]; //将数组array中的元素复制到array1中 for(int i=0;i<array.length;i++){ array1[i]=array[i]; } //设置最后一个元素为新添加的元素 array1[array.length]=e; //将原数组变量指向新数组 array=array1; } }
在这个自定义队列中,可以实现数据的增加、取得、删除、插入、修改以及队列长度的取得等功能。
在窗体类中实例化自定义队列的对象,为了方便引用设置为了静态。
// 定义一个用来保存形状的队列 public static MyArray<Shape> shapes = new MyArray<Shape>();
(2)定义一个抽象的形状类,并使绘制的各种图形继承它
定义一个抽象形状类,包含形状所共有的属性,和抽象方法
public abstract class Shape { int x1,y1,x2,y2; Color color; public abstract void draw(Graphics g); }
举例说明,定义一个具体的形状类(如:直线),继承上述抽象的形状类:
public class Line extends Shape { public void draw(Graphics g) { g.setColor(color); g.drawLine(x1, y1, x2, y2); } }
(3)在监听器中实现图形的存储
if (type.equals("line")) { // 创建直线对象 Shape sh = new Line(); sh.x1 = x1; sh.y1 = y1; sh.x2 = x2; sh.y2 = y2; sh.color = color; //绘制形状 sh.draw(gr); //将形状对象存入队列 DrawUI.shapes.add(sh); } else if (type.equals("rect")) { Shape sh = new Rect3D(); sh.x1 = x1; sh.y1 = y1; sh.x2 = x2; sh.y2 = y2; sh.color = color; //绘制形状 sh.draw(gr); //将形状对象存入队列 DrawUI.shapes.add(sh);
(4)在绘画面板处实现重绘
JPanel panel=new JPanel(){ public void paint(Graphics g) { // 调用父类的方法来正确的绘制窗体 super.paint(g); // 遍历形状队列,重新绘制图形 for(int i=0;i<shapes.size();i++){ Shape sh = shapes.get(i); //绘制形状 sh.draw(g); } } };
2、截屏之后遍历像素点实现重绘
其原理为获得一个截屏,用二维数组记录每一点的颜色。重绘时,每一点颜色展示出来。即可以重绘了。
(1)由于截屏的方法需要用到机器人对象,所以首先创建一个机器人对象
需注意的是,机器人不能通过new来直接创建
java.awt.Robot robot; public static int image[][]; // 创建监听器对象的时候要求传入一个画布对象 public DrawListener(Graphics gr, ButtonListener blis, JPanel panel) { this.gr = gr; this.blis = blis; this.panel = panel; try { robot = new java.awt.Robot(); } catch (AWTException e) { e.printStackTrace(); } }
(2)截屏以及存储的实现
// 获取绘画面板左上角的位置和窗体大小 Point p = panel.getLocationOnScreen(); Dimension dim = panel.getSize(); // 创建矩形对象 java.awt.Rectangle rect = new java.awt.Rectangle(p, dim); // 截取屏幕 BufferedImage img = robot.createScreenCapture(rect); image = new int[img.getHeight()][img.getWidth()]; //将图像按照像素分割成一个一个的点,将点的颜色存入数组 for(int i=0;i<image.length;i++){ for(int j=0;j<image[i].length;j++){ //将颜色存入数组 image[i][j] = img.getRGB(j, i); } }
需要注意下标与坐标的区别:
下标:先纵后横,先行后列;坐标:先横后纵
并且最好不要使用窗体得到截屏的效果,否则会出现标题栏那一部分的偏差,最好选择使用绘画面板。
(3)重绘的实现
public void paint(Graphics g) { // 调用父类的方法来正确的绘制窗体 super.paint(g); // 如果数组存在,就重绘数据 if (null != DrawListener.image) { // 重绘数组 for (int i = 0; i < DrawListener.image.length; i++) { for (int j = 0; j < DrawListener.image[i].length; j++) { // 获取颜色 int c = DrawListener.image[i][j]; // 创建颜色对象 Color color = new Color(c); g.setColor(color); //画点 g.drawLine(j, i, j, i); } } } }
3、两种重绘方式的优劣
当数据不是很大时,第一种方法,程序运行次数较少。
当数据较大时,第一种方法,程序运行次数较多,第二种就比第一种简单。
不管画成什么样,第二种方法, 记录的点颜色个数是一样的。而第一种随着形状的个数越来越多,存入的也越来越多。
相关推荐
在本文中,我们将深入探讨BMP格式的解析与保存,并结合画图板的重绘功能来讲解这一主题。 首先,我们需要理解BMP文件的结构。BMP文件分为两部分:文件头和图像数据。文件头包含文件信息,如文件大小、图像宽度、...
为了提供类似Windows画图板的橡皮擦功能,Java画图板应用可能实现了两种模式:一种是使用特定的橡皮擦工具,另一种是将画笔颜色设置为背景色,从而达到擦除的效果。此外,添加形状绘制功能,如矩形、圆形和多边形,...
一般视图缩放的实现是通过DC的两个函数来实现:SetViewportExt和SetWindowExt,但是这两个函数只在MM_ISOTROPIC和MM_ANISOTROPIC这两种映射模式下有效果,而常用的带滚动条的视图类CScrollView却不支持这两种模式...
在这个简易画图板项目中,Java用于实现图形用户界面(GUI)和图形绘制逻辑。 2. **图形用户界面(GUI)**:Java提供了JavaFX和Swing两个主要的库来创建GUI应用。本项目可能使用了Swing,因为它是一个相对成熟的库,...
本文将详细解析"android画图板"这个主题,介绍如何在Android中实现一个基本的画线功能,并探讨两种不同的实现方法。 首先,我们要了解Android中的画布(Canvas)和画笔(Paint)概念。Canvas是Android图形系统的一...
4. **重绘机制**:为了保证画图板的实时性,开发者可能利用了JAVA的重绘机制,如`repaint()`方法,当画布上的内容发生变化时,会自动调用该方法进行更新,确保用户能即时看到画图的效果。 5. **图像处理**:除了...
4. **重绘优化**:与Java类似,C#的画图板也需要考虑重绘优化,可能通过`OnPaintBackground`方法和双缓冲技术来防止屏幕闪烁。 5. **数据绑定**:在C#中,可以利用数据绑定将用户界面元素(如颜色选择器、线条宽度...
5. **橡皮擦功能**: 橡皮擦功能的实现可能有两种方式:一是改变绘图颜色为背景色,二是记录画布上的像素信息并在需要时恢复。后一种方法更为精确,但实现起来也相对复杂。 6. **事件处理**: 用户交互是通过监听鼠标...
虽然功能相对有限,但该项目在开发过程中运用了两种重要的技术——橡皮筋技术和双缓存技术,这在图形用户界面的设计中具有一定的实践价值。 首先,我们来探讨一下**橡皮筋技术**。橡皮筋技术常用于实现拖拽选择或者...
4. **重绘机制**:当画图板需要更新时,如清除屏幕或覆盖现有图形,我们需要重绘整个窗口。这通常通过覆盖`OnPaint`方法来完成,使用`Graphics`对象绘制所有图形。 5. **图形状态保存和恢复**:`Graphics`对象提供`...
- **图形文件保存与重绘**:软件支持将绘制的图形保存为WMF(Windows Metafile)格式,这是一种矢量图形文件格式,能够保留图形的所有细节而不失真。重绘功能则确保了在编辑过程中图形能够实时更新显示,通常通过...
### MFC 画图板程序知识点详解 #### 1. 简介 MTJHDraw1.0是一款基于Microsoft Foundation Classes (MFC)框架的画图程序,它旨在模仿并扩展Windows自带画图程序的功能。该程序由测控0701班的学生毛天骄开发,学号为...
Java语言实现的画图程序是一种基于图形用户界面(GUI)的应用,它允许用户在屏幕上绘制各种形状,如圆形、矩形和直线,并提供了一系列的编辑功能,如线条粗细的调整、线条颜色的更改以及橡皮擦和清屏功能。...
LabVIEW支持两种主要的绘图技术:GDI+(Graphics Device Interface Plus)和OpenGL。GDI+主要用于创建2D图形,适合日常的数据可视化;而OpenGL则提供更高级的3D绘图能力,用于构建复杂的三维模型和动画。 2. **...
5. **Paint事件**:在窗体的Paint事件处理函数中,通常会进行实际的图形绘制,因为每次窗体重绘时,都会调用这个事件。 6. **图像保存**:项目可能还包括将用户绘制的图形保存为图像文件(如BMP或PNG)的功能,这...
8. **重绘机制**:为了响应窗口大小变化或其他原因导致的重绘,可以覆盖Control类的OnPaint()方法,使用Graphics对象在Paint事件中进行绘制。 9. **源代码结构**:项目通常包括多个文件,如Form1.cs(包含用户界面...
"Android-LittleDrawBoardPC端"就是这样一个案例,它实现了Android与PC之间的实时同步绘画功能,利用了Socket通信技术,让两端用户可以共享创作空间,共同进行绘图操作。本文将深入探讨这一技术的核心概念和实现细节...
在Android中,通常有两种方式实现屏幕上的图形绘制:`View`和`SurfaceView`。`View`适合于更新频率较低、交互性强的图形,而`SurfaceView`适用于需要高性能连续动画的场景。根据描述,此源码可能基于`View`类进行了...
退出“画图”窗口有两种方式:点击标题栏的“关闭”按钮或选择“文件”菜单中的“退出”命令。 课堂小结回顾了画图程序的基本操作,强调了铅笔工具的使用和颜色选择。扩展练习鼓励学生创新,设计出“美丽家园”的...
这种方式可以避免频繁的屏幕重绘,提升用户体验。 6. 布局管理: Swing提供了一系列的布局管理器,如FlowLayout、BorderLayout、GridLayout等,它们决定了组件在窗口中的排列方式。选择合适的布局管理器可以有效地...