在画图板上画出一些图形后,如果最小化窗体,然后再将其最大化时,之前的图形会消失,为了使得之前的图形不消失,我们需要重载父类JFrame中的paint()方法,通过数组保存之前图形的相关数据在内存里,等到调用子类中paint()方法时取出数据实现重绘。
代码:
package com20130320;
import java.awt.FlowLayout;
import java.awt.Graphics;
import javax.swing.JFrame;
//继承JFrame类
public class ReDraw extends JFrame{
//声明一个DrawShape类类型的数组
MyShape[] sp;
//一般不将长代码写在主函数中
public static void main(String args[]){
ReDraw re=new ReDraw();
re.showInfo();
}
public void showInfo(){
//创建一个固定大小的窗体
this.setSize(600,600);
this.setResizable(false);
this.setDefaultCloseOperation(3);
this.setVisible(true);
//得到画布对象
Graphics gr=this.getGraphics();
//创建鼠标监听器
MyMouseListener lis=new MyMouseListener();
this.addMouseListener(lis);
//让监听器中的画布对象g指向gr的内存地址
lis.g=gr;
//让在ReDraw类中的数组指向在DrawListener中的数组地址
sp=lis.a;
}
//重载父类中的paint()
public void paint(Graphics g){
//调用父类中的paint()
super.paint(g);
show(g);
}
public void show(Graphics g){
System.out.println("执行了重绘");
for(int i=0;i<sp.length;i++){
MyShape ds=new MyShape();
ds=sp[i];
//判断ds是否为空
if(ds!=null){
g.drawOval(ds.x, ds.y, ds.w, ds.h);
}
}
}
}
package com20130320;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
public class MyMouseListener implements MouseListener{
Graphics g;
int count=0;
//定义一个MyShape类的数组
MyShape [] a=new MyShape[100];
//(x1,y1)为点击点的坐标
int x1,y1;
public void mouseClicked(MouseEvent e) {
MyShape ds=new MyShape();
x1=e.getX();
y1=e.getY();
ds.x=x1;
ds.y=y1;
ds.w=50;
ds.h=50;
//将数据存入
a[count]=ds;
count++;
System.out.println(count);
g.drawOval(x1,y1,50,50);
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
}
package com20130320;
public class MyShape {
//定义MyShape类的属性
public int x;
public int y;
public int w;
public int h;
}
代码:
package com20130320;
import java.awt.FlowLayout;
import java.awt.Graphics;
import javax.swing.JFrame;
//继承JFrame类
public class ReDraw extends JFrame{
//声明一个DrawShape类类型的数组
MyShape[] sp;
//一般不将长代码写在主函数中
public static void main(String args[]){
ReDraw re=new ReDraw();
re.showInfo();
}
public void showInfo(){
//创建一个固定大小的窗体
this.setSize(600,600);
this.setResizable(false);
this.setDefaultCloseOperation(3);
this.setVisible(true);
//得到画布对象
Graphics gr=this.getGraphics();
//创建鼠标监听器
MyMouseListener lis=new MyMouseListener();
this.addMouseListener(lis);
//让监听器中的画布对象g指向gr的内存地址
lis.g=gr;
//让在ReDraw类中的数组指向在DrawListener中的数组地址
sp=lis.a;
}
//重载父类中的paint()
public void paint(Graphics g){
//调用父类中的paint()
super.paint(g);
show(g);
}
public void show(Graphics g){
System.out.println("执行了重绘");
for(int i=0;i<sp.length;i++){
MyShape ds=new MyShape();
ds=sp[i];
//判断ds是否为空
if(ds!=null){
g.drawOval(ds.x, ds.y, ds.w, ds.h);
}
}
}
}
package com20130320;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
public class MyMouseListener implements MouseListener{
Graphics g;
int count=0;
//定义一个MyShape类的数组
MyShape [] a=new MyShape[100];
//(x1,y1)为点击点的坐标
int x1,y1;
public void mouseClicked(MouseEvent e) {
MyShape ds=new MyShape();
x1=e.getX();
y1=e.getY();
ds.x=x1;
ds.y=y1;
ds.w=50;
ds.h=50;
//将数据存入
a[count]=ds;
count++;
System.out.println(count);
g.drawOval(x1,y1,50,50);
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
}
package com20130320;
public class MyShape {
//定义MyShape类的属性
public int x;
public int y;
public int w;
public int h;
}