在我的上一篇博客(http://1316478764.iteye.com/admin/blogs/1948471),我简单实现了一个画图板,但是仍有很大的bug,当窗体大小发生改变时,我们会发现之前画的图形会遭到破坏,甚至最小化后再打开,图形完全消失。导致这个bug的原因也很简单,因为内存中没有保存这些图形,接下来我们就具体探讨一下这个问题。
首先我们要知道当窗体大小发生改变时,系统会自动调用JFrame的paint方法,因为我们画的图形是存在缓存中,当窗体大小改变后,这些缓存会自动清空,paint方法不会重绘这些图形,只会重绘窗体上的组件。知道所以然后就好办了,我们要做的就是将这些图形保存到内存中,当窗体进行重绘时,再将这些图形从内存中取出,画出来,即重写paint方法。
至于怎么保存图形,学过队列的童鞋肯定无压力,我们可以创建一个保存图形类对象的队列,当我们在画图板上每画一个图形,就保存一个,然后重写paint方法时,我们只需要遍历这个队列,将保存的图形在画出来就ok了。看点代码吧:
public class MyList<E> {
private Object src[] = new Object[0];
public void add(E e) {
Object dest[] = new Object[src.length + 1];
dest[src.length] = e;
System.arraycopy(src, 0, dest, 0, src.length);
src = dest;
}
public E get(int index) {
Object e = src[index];
return (E) e;
}
队列中需要哪些方法,是根据我们想实现的功能来决定的,我们想实现重绘的话,上面两个方法应该够用了。
至于图形类,我们创建一个Shape类,里面包含了图形的每个属性,还有画图形的方法,代码如下:
public class Shape {
int x1,y1,x2,y2;//画图形需要的起点和终点坐标
Color color;//线的颜色
Stroke st;//画笔的粗细
Byte type;//金字塔:0 立方体:1 鸡蛋:2
Boolean flag=true;//用作标记shape对象是否显示(用于撤销和重做)true:显示 false:不显示
public void drawShape(Graphics g){此处省略若干行代码}
保存图形类的队列我们已经实现,接下来我们只要给Shape类的各个属性赋值,画出图形并保存图形
//绘制图形
shape.drawShape(g);
//将图形保存到队列中
shapeList.add(shape);
到这儿就基本完成工作了,最后我们只需重写画布的paint方法
public void paint(Graphics g){
super.paint(g);
//note:一定要取对画布!!!获取jp_addto的画布,所以在jp_addtojp里重写paint方法更好,还能避免上方jpanel的闪烁
//遍历队列,重新绘制出保存到图形
for(int i=0;i<shapeList.size();i++){
Shape shape=shapeList.get(i);
shape.drawShape(g);
}
}
ok,我们在运行看看,会发现最小化后再打开,还是能看到之前的图形,嘎嘎,是不是感觉自己又进步了一点。但是难道重绘只能这样应用么,我们还能不能用重绘来完成其他的功能呢??
当然可以,还记得你画错图形但却不能删除的苦恼么么,我们通过重绘就可以实现撤销和重做操作,还可以实现清空画布。撤销不就是把刚刚保存的Shape对象不画出来,然后再重绘,而重做不就是将之前不让画出来的图形再画出来么。这两个功能我们通过对每个Shape对象设置一个标志决定是否画出来来实现,即上面Shape类代码中定义的flag属性。至于清空画布就更简单,我们将队列中的所有Shape类对象全删了不就完事。当然,这需要我们在队列中添加delete方法。
分享到:
相关推荐
在Java编程领域,创建一个简单的画图板是一项基础但实用的任务,这有助于理解图形用户界面(GUI)的设计和事件处理。这个"Java简单画图板"项目提供了基本的绘画功能,如绘制、保存、打开以及擦除,为用户提供了一个...
在Java编程语言中,实现一个简单的Windows画图板是一个经典的练习,它可以帮助初学者更好地理解图形用户界面(GUI)的设计以及事件处理机制。这个项目通常会涉及到Java的Swing库,这是一个用于创建桌面应用程序的GUI...
在Java编程语言中,实现一个简单的画图板是一项常见的任务,尤其对于初学者来说,它可以帮助理解图形用户界面(GUI)编程的基本概念。这个项目涵盖了Java AWT(Abstract Window Toolkit)或Swing库中的基本绘图功能...
Java 画图板程序设计与实现 Java 画图板是使用 Java 语言编写的图形绘制程序,提供了基本的绘图功能,如画笔、直线、椭圆、矩形等,用户可以使用该程序绘制简单的图形。下面我们将对 Java 画图板程序进行详细的分析...
【JAVA简易画图板】是一个基于Java编程语言开发的简单绘图应用程序,它为用户提供了一个基本的图形界面,用户可以通过这个界面进行简单的绘画操作。这个程序包含了一些基本的绘图功能,如绘制形状、使用铅笔工具以及...
【Java简易画图板】是一个基于Java编程语言开发的简单图形绘制工具,它为用户提供了一个基本的画布,用户可以通过各种绘图工具进行创作。这个程序包含了一系列基础的图形元素和编辑功能,如直线、铅笔、圆形和矩形,...
在Java编程语言中,"JAVA_画图板实现"是一个常见的项目,用于学习图形用户界面(GUI)设计和事件处理。这个项目的核心是利用Java的Swing或JavaFX库来创建一个可交互的画布,用户可以在上面进行绘图操作。下面我们将...
在这个"java swing 画图板"项目中,开发者仿照了Windows操作系统中的“画图”程序,提供了一个基本的绘图环境。下面将详细讨论相关的Java Swing知识点。 1. **组件(Components)**:在Swing中,JFrame是窗口的基础...
Java画图板应用是一种基于Java编程语言开发的图形用户界面(GUI)程序,它提供了类似Windows操作系统内置画图板的功能。这个程序的核心是利用Java的Swing或JavaFX库来构建用户界面,允许用户进行基本的绘图操作,如...
在本项目"java大作业--画图板"中,我们主要关注的是利用Java编程语言实现一个功能丰富的图形用户界面(GUI)应用,它允许用户进行绘画操作,类似于电子画板。这个应用程序具备了一系列常见的绘图工具,如绘图、颜色...
在JAVA编程环境中,创建一个简易的画图板是一项有趣且实用的...以上就是实现"JAVA实现画图板"所需的主要技术点。通过组合使用这些知识点,我们可以创建一个功能丰富的图形编辑环境,让非程序员也能轻松地进行图形创作。
在本文中,我们将深入探讨如何使用Java编程语言实现一个简易的画图板应用程序。这个程序允许用户绘制各种形状,如直线、圆、曲线、喷枪图案、直角矩形和圆角矩形,并且配备橡皮擦功能以擦除已绘制的内容。下面,我们...
大学生JAVA学习笔记,复习巩固,课程作业,课程设计!!!
在Java编程环境中,实现一个画图板是一项常见的任务,它涉及到图形用户界面(GUI)的构建和事件处理。本项目中的"java实现画图板"是通过Java AWT(Abstract Window Toolkit)或Swing库来创建一个交互式的绘图应用...
画图板--Java课程设计
在这个项目中,我们使用Java实现了一个基本的画图面板,允许用户绘制直线、曲线、矩形和圆形。以下是这个项目的详细知识点: 1. **Java Swing库**: 为了创建GUI组件,我们使用了Java Swing库。Swing是Java ...
【JAVA应用程序 画图板】是一个使用JAVA编程语言实现的简单图形用户界面(GUI)应用,它提供了一个画布供用户进行绘画操作。这个程序的核心是利用JAVA的Swing或JavaFX库来创建图形界面,并处理用户的输入事件,如...
这个“java画图板”项目显然使用了Java Swing或JavaFX库来实现,提供了基本的绘图功能,如绘制椭圆、直线和自由手绘(铅笔模式)。下面将详细介绍这些知识点。 1. **Java GUI**: - Java Swing和JavaFX是Java提供...
在本项目中,“一个Java实现的画图板程序”是一个基于Java开发的图形用户界面应用,它允许用户进行基本的绘图操作,如绘制线条、形状、填充颜色等。这个程序通常会利用Java的AWT(Abstract Window Toolkit)或Swing...