java重绘小结

三种重绘总结:

Q:为什么要重绘?
A:因为在画板上作画的时候图形是保存在缓存里面而不是保存在内存里面的。因此当我们把画板最小化的时候,缓存中储存的图形内容就会被释放清空,但是
     内存里面并没有存储数据,所以再恢复窗体的时候只有窗体上的组件会被重绘,图形的内容已经消失。
How to dispose it??
       上面说了窗体或者面板会在恢复时自动重绘窗体或者面板上已经添加的组件,这是JPanel里面有一个public void paint(Graphic g){}
  方法,所以我们在画图的时候把图形内容(或者数据)保存以后,在JPanel调用paint方法是顺便把图形重绘出来,这就达到我们的目的。



No、1  直接存储
     我们在绘图的时,每画一个图,就创建一个图形对象,把绘图时的数据(坐标、颜色、绘图动作命令等)保存起来,存入一个队列中,在重绘遍历这个队列
,把存储的图形内容输出,在绘制一遍。
   缺点:存储的内容繁多,比如存储多边形的时候那个纠结。还有在重绘的是哦户还要把存储的瘦取出来再绘制一遍,那么原来绘制的方法得再写一遍,繁杂!
     //**********************代码略************//    
  

No、2   存储图像像素
   我们重绘的目的,只要求重绘的画图面板上的内容,那么我们只需把画图面板上的图像(由很多像素点组成)内容用数组存储起来,重绘时,在paint()中
又把数组中的内容遍历出来,这样就行了。
      优点:存储的内容单一,只是像素点对应的颜色而已,到时候把像素颜色遍历一遍放在面板上就OK了~~~
      //**************重绘操作****************//
    
      //需要重写继承了JPanel类的MyPanel类的paint()方法,在MyPanel面板对象调用paint()方法时完成重绘操作
      //写一个类继承JPanel,重写JPanel的paint方法
class MyPanel extends JPanel{

// 重写绘制组件的方法
//当然这面板主要是取得画布绘画,没有添加其他组件
//因为JPanel里面的paint方法只会重绘组件,所以我们在“画图”的同时存储画布图像,"它"重绘组件时我们就顺便把图形再画出来
public void paint(Graphics g) {
// 调用父类的绘制方法来正确的绘制组件本身
super.paint(g);
// 当需要重新绘制的时候就将二维数组中的数据绘制一次\
//System.out.println("listener="+listener);
if (listener != null) {
// 获取监听器中的二维数组
int[][] data = listener.data;
//System.out.println("data="+data);
if (data != null) {// 如果已经保存了数据,才需要绘制
for (int i = 0; i < data.length; i++) {
for (int j = 0; j < data[i].length; j++) {
int cNum = data[i][j];
// 创建颜色对象
Color color = new Color(cNum);
g.setColor(color);
// 绘制点
g.drawLine(j, i, j, i);

}
}
}
}
}
}
     
      //******************截屏存储操作******************//
     
    Object object = e.getSource();
    JPanel drawpanel = (JPanel)(object);
    //获取到drawpanel的左上角相对于屏幕的坐标点
    Point point = drawpanel.getLocationOnScreen();
    //获取到drawpanel的面积大小
    Dimension dimension = drawpanel.getPreferredSize();
    //创建一个要截取的区域,相当于是一个屏幕裁剪模具
    Rectangle rect = new Rectangle(point,dimension);
    //画完一个图形之后就把图像截取下来
    BufferedImage cut_image = robot.createScreenCapture(rect);
   
    data = new int[cut_image.getHeight()][cut_image.getWidth()];
   
    for (int i=0;i<data.length;i++)
    for (int j=0;j<data[i].length;j++){
    int RGB = cut_image.getRGB(j, i);
    data[i][j] = RGB;    
    }
     
     
No、3    存储图像         
      方法2的改进:为何在去图像是不直接把图像存储起来,重绘时直接把图像“贴”在面板上上呢?

猜你喜欢

转载自wang-jianxin.iteye.com/blog/1595394