大家在用JAVA制作画图板时有没有发现一个问题,就是当你在画布上画了一些图形,例如直线,矩形后,把窗体最小化后,在还原,画布上的图形就消失了。这就牵扯到一个画布重绘的问题。
这是因为调用Jpanel画布时,Graphics类里有一个写好了的paint方法是自动调用的,当你最小化窗体或者是改变窗体大小,都会调用paint方法把当前图片清空,所以我们要做的就是重写paint方法,使它在窗体最小化后重新绘制图像。
首先,我们要建立一个Object类的队列,用来存放我们每次画的图像,这个方法可以自己写,
//队列,用于解决画板的重绘
public class MyList {
private Object[] srcArray=new Object[0];
//添加一个元素的方法
public Object[] getOb()
{
return srcArray;
}
public void add(Object obj)
{
//重新创建一个队列来代替原队列
Object[] destarray=new Object[srcArray.length+1];
for(int i=0;i<srcArray.length;i++)
{
destarray[i] = srcArray[i];
}
destarray[srcArray.length] = obj;
//吧src的指针来指向dest
srcArray = destarray;
}
这里只是添加了add方法来添加图像,其他方法大家可以自己试着写一写。
然后我们需要写一个shape类来定义我们画的图像,
public abstract class Shapes{
public int x1,x2,y1,y2;
public Color color;
/**
* 构造方法
*/
public Shapes(int x1, int y1,int x2,int y2,Color color)
{
this.x1=x1;
this.y1=y1;
this.x2=x2;
this.y2=y2;
this.color=color;
}
/**
* 抽象画图的的方法
*/
public abstract void draw(Graphics g);
}
这里shapes类我定义的是抽象类型的,就是没有实现的类,我们可以接下来定义Rect,Line等shapes类的子类来实现方法。
import java.awt.Color;
import java.awt.Graphics;
/**
* 矩形的重绘实现
* @author lenovo
*
*/
public class Rect extends Shapes{
public Rect(int x1, int y1, int x2, int y2, Color color) {
super(x1, y1, x2, y2, color);
}
public void draw(Graphics g)
{
g.setColor(color);
g.drawRect(Math.min(x1, x2), Math.min(y1, y2),Math.abs(x2-x1),Math.abs(y2-y1));
}
}
这里只举了一个例子。剩下的大家可以自己写。
接下来我们在鼠标监听里把我们画的图像一个一个存进队列
if(command.equals("line"))
{
shape=new Line(x1,y1,x2,y2,jpanel_color.getJBcolor());
shape.draw(g);
//这里repaintList是我们创建的队列对象
repaintList.add(shape);
}
(这里同样只是一个例子)
监听实现后,我们就可以在重写paint方法了
public void paint(Graphics g)
{
super.paint(g);
//mouse_listener是鼠标监听器对象,从主类里接收过来
mouse_listener = dw.getMouseListener();
//然后创建队列来接受监听器的队列对象
repaintList1=mouse_listener.repaintList;
//这是鼠标移动监听器对象,也是一样的接收,
mma = dw.getMouseMotionListener();
repaintList2=mma.repaintList;
//这里用一个for循环来一个个吧图像重绘出来
for(int i=0;i<repaintList1.getLength();i++)
{
//队列是基类Object类型,我们把它强制转换成Shapes类
((Shapes) repaintList1.getSrc(i)).draw(g);
}
for(int i=0;i<repaintList2.getLength();i++)
{
//同样是重绘
((Shapes) repaintList2.getSrc(i)).draw(g);
}
好了现在重绘就完成了。
分享到:
相关推荐
Java简单swing程序,模拟实现windows画图板的功能,实现规则、不规则图形的绘制,颜色填充,撤销重绘等功能
一个简易的仿XP系统的画图板(JAVA),实现了大体的框架和一些简单的画图功能,以及整个画图板的重绘。界面很不错!
“关于‘画图板’”窗口 4.画橡皮、刷子、喷枪时可以选择画笔粗细 5.画矩形、圆角矩形时可以选择是否填充 6.改变指针的形状 7.光标进入绘图区域时实时显示光标坐标 8.撤销用户上一步绘画 9.改变主题 10.当...
NULL 博文链接:https://liuyuan418921673.iteye.com/blog/2283692
简易画图板的实现,有以下功能:铅笔,橡皮,直线,矩形,椭圆,圆角矩形,颜色面板,工具面板,重绘。
可以重绘的画图板 博文链接:https://zhangchong2011.iteye.com/blog/907598
MFC课程设计简单的画图板 1.有一个看的过去的界面 2.画图板支持简单的文件读取存储也...3.支持重绘 4.橡皮筋(你懂得,画图形更方便) 上传文件时删掉了很多编译生成文件的(如果不能运行,可以自己贴一份到新建项目里)
本软件是利用 VC++这个强大的可视化编程工具开发的,软件主要功能包括图 形的绘制、线型的设置、颜色的设置,图形文件的重绘和保存等功能。 本文介绍了如何完成上述功能,同时详细阐述了画图系统的实现过程以及对 ...
Windows下的Win32Application...如何在显示器上显示出自绘完成的各种图标,图像、图画等信息,都是在windons下实现的,所以,本次程序的重中之重是对windons编程要比较的熟练。根据具体的类或对象,做出不同的编码。
另外为了避免屏幕的闪烁,程序中做了两个处理:一、把视图自己的重绘背景代码屏蔽掉,即响应视图的WM_ERASEBKGND消息,直接返回TRUE,并在Ondraw中程序自己绘制背景就可以了;二,在Ondraw中绘制的时候,先绘制到...
3.2. SetROP2实现重绘 6 3.3. 嵌套View实现画布 6 3.4. 鼠标靠近目标时突出显示 7 3.4.1. 判断一点是否属于矩形HStrokeRect 7 3.4.2. 判断一点是否属于线段 8 3.4.3. 判断一点是否属于椭圆 8 3.5. 文档序列化 9 3.6....
用c#实现画图功能,可以画出各种图形,如矩形,圆形,菱形等,还可以随意拖动,放大缩小
绘制图形, 颜色填充, 画布大小设置 ,文本输入及修改文字属性 ,线条类型, 皮肤包 , 画刷 , 保存重绘, PPT演示。 所有上述功能全部实现,工具栏也已经制作了不同风格的图标。
在VS2015环境下,利用MFC框架实现的一款高仿“画图”工具,实现绝大部分功能甚至更多创新点。(注释超详细) 实现了点、直线、曲线、折线、矩形、圆形、多边形等等形状,并且具有区域限制、鼠标捕捉等功能; 实现了...
win32实现画图小程序,主要功能:画直线、矩形、椭圆,曲线,画板清除,重绘,颜色选择,工具选择,调色板和工具栏的隐藏和显示,调色板的停靠,文件保存和打开
MFC架构设计的绘图板小程序 只附上了源代码还有可执行文件 可以重绘、撤销、橡皮擦这些操作,通过调用重绘函数ondraw实现,有兴趣的请下载看看。
保存其画笔路径,撤销时删除上一步操作,调用重绘来实现。5.保存绘图模块。先在本地的文件夹上创建一个文件 默认创建的是/sdcard/Pictures/由于文件的名字是不能重复的,采用通过当前时间来命名yyyy_MM_dd_HH_mm_ss....
单击“圆形”、“矩形”和“三角形”菜单项时,系统在“画图”菜单后建立一个相应的动态菜单,菜单中包括“绘制图形”、“移动图形”、“放大”、“缩小”、“重绘”等选项。当单击“绘制图形”时,利用“右箭头”键...
Java绘制不规则图形的源代码,类似于一个Java小画板,可以画出一些基于线条的图形,比如曲线,直线,还可用来写字,示例截图如上图所示。以下是相关源代码: protected void ... //重绘组件 } }