大家在用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);
}
好了现在重绘就完成了。
分享到:
相关推荐
在本文中,我们将深入探讨BMP格式的解析与保存,并结合画图板的重绘功能来讲解这一主题。 首先,我们需要理解BMP文件的结构。BMP文件分为两部分:文件头和图像数据。文件头包含文件信息,如文件大小、图像宽度、...
通过重写paintComponent方法,可以确保每次窗口重绘时都能正确显示当前的绘图状态。 对于保存和加载功能,Java提供了文件I/O流类,如FileInputStream和FileOutputStream,用于读写文件。图像数据可以被序列化为二...
paintEvent是一个在QWidget中定义的事件处理函数,当组件需要重绘时,它会自动被调用。在绘图应用中,这个函数通常会被用来绘制图像。 #### QImage与QPainter QImage是一个图像表示类,用于处理图像数据。QPainter...
在C#编程环境中,开发一个画图板是一个常见的练习,用于学习图形用户界面(GUI)设计和绘图操作。这个“C# 画图板 源码”项目,适用于.NET Framework 1.1和2.0,展示了如何利用C#语言实现一个基本的绘画应用程序。...
2. 绘图处理:在OnPaint()消息处理函数中,当窗口需要重绘时,会调用BeginPaint()和EndPaint()来获取CDC对象,并在其中进行绘图操作。 3. 用户交互:程序需要响应用户的鼠标和键盘事件,如WM_LBUTTONDOWN、WM_...
"简单画图板的设计"是一个关于创建一个基本图形编辑器的话题,主要涉及到计算机图形学、用户界面设计以及可能的编程实现。在这个项目中,我们可能会遇到以下关键知识点: 1. **计算机图形学基础**:画图板应用的...
这可能是通过设置一个特定的颜色(如背景色)和不透明度,然后在指定区域内重绘,以达到擦除效果。 5. **颜色选择**:用户可以改变画笔颜色,这需要实现颜色选择器,可能是一个颜色对话框,用户选择颜色后,将所选...
这个函数会在视图需要重绘时被调用,我们可以在这里使用GDI (Graphics Device Interface) 来绘制图形。GDI 提供了一系列的函数,如MoveTo、LineTo、Rectangle、Ellipse 和Polyline,它们分别用于绘制线条、矩形、...
你需要定义消息映射来处理特定的消息,如WM_PAINT消息用于窗口重绘,WM_LBUTTONDOWN和WM_LBUTTONUP用于处理鼠标点击。 7. **文件I/O**:为了实现打开和保存BMP文件的功能,你需要使用CFile类或者更高级的fstream来...
2. **OnPaint事件**:当窗口需要重绘时,系统会发送WM_PAINT消息,通过覆盖CWnd的OnPaint函数来处理图形的绘制。 3. **CDC类**:设备上下文(Device Context,DC)是Windows图形模型的核心,CDC类封装了与设备相关...
5. **OnPaint消息**:当窗口需要重绘时,Windows会发送WM_PAINT消息。我们需要重载CWnd的OnPaint成员函数,来实现自定义的绘图逻辑。 6. **CPaintDC类**:为了在窗口上绘图,我们将使用CPaintDC类,它是设备上下文...
Java简单swing程序,模拟实现windows画图板的功能,实现规则、不规则图形的绘制,颜色填充,撤销重绘等功能
在C#编程环境中,开发一个简单的画图板是一项常见的练习,可以帮助初学者更好地理解图形用户界面(GUI)的创建和事件处理。这个源码提供了一个基础的画图应用,允许用户绘制矩形、曲线和椭圆,并且可以选择系统提供...
4. **重绘机制**:为了保证画图板的实时性,开发者可能利用了JAVA的重绘机制,如`repaint()`方法,当画布上的内容发生变化时,会自动调用该方法进行更新,确保用户能即时看到画图的效果。 5. **图像处理**:除了...
6. **擦除与重绘**: 为了实现擦除功能,可以创建一个白色的Pen,然后在擦除区域调用DrawRectangle方法。但请注意,Windows Forms的Graphics对象通常不会自动清除画布,所以可能需要在Paint事件中实现自己的清除...
这个函数会在窗口需要重绘时被调用,开发者可以在这里实现各种绘图逻辑。例如,用户可能会使用鼠标进行绘制,程序需要捕获WM_MOUSEMOVE和WM_LBUTTONDOWN等消息,根据鼠标的当前位置在画布上添加线条或形状。 此外,...
该画图板的主要功能包括但不限于图形的绘制、线型与颜色的设置、图形文件的重绘及保存等。 #### MFC与VC++简介 1. **VC++6.0:** - VC++6.0是微软发布的一款在Windows平台上的强大C++编译器。 - 它提供了高级的...
“关于‘画图板’”窗口 4.画橡皮、刷子、喷枪时可以选择画笔粗细 5.画矩形、圆角矩形时可以选择是否填充 6.改变指针的形状 7.光标进入绘图区域时实时显示光标坐标 8.撤销用户上一步绘画 9.改变主题 10.当...
在Android平台上,开发一款画图板应用是一种常见的需求,它可以让用户进行自由绘画、涂鸦或者进行图形设计。本文将详细解析"android画图板"这个主题,介绍如何在Android中实现一个基本的画线功能,并探讨两种不同的...