Graphics2D paint技术能擦除上一步操作吗?例如:在一个图片上drawString()后,再drawString()则会和之前绘制的string叠加,所以我想回滚上一步操作。我发现不能用clearRect(),因为擦除区域后,背景颜色是单一的,显然没达到擦除上一步paint操作的目的。2dString图片技术

解决方案 »

  1.   

    BufferedImage 应该不可以,它就是一个二维数组,只有“一层”。
      

  2.   

    那怎么办,只想擦除上一次绘制的string
      

  3.   

    你应该用 MVC 的思想去设计思路可以是这个样子的:
    记住你每一步绘制的数据模型(可能是字符、可能是图形。当然,这些字符、图形的具体坐标、大小、颜色、等等也应当保存住)
    然后形成一个 list
    在绘制的时候,根据这个 list 中的模型去绘制视图你如果想“删除”其中的某一次绘制,只要在这个 list 中移除某一个数据
    然后 repaint 就能实现界面上的擦除了
      

  4.   

    可以,算是一种可行的办法,但是每次都要完全repaint不知效率如何, 还是可以设置clip提高效率?:List list = new LinkedList();public void initList() {
        list.add(image);
        list.add(string);
    }public void renderSplash() {
        list.remove(string);
        list.add(newString);
        Rectangle clip = bound;
        g2.setClip(clip);
        repaint();
    }public void repaint() {
        for(Object element : list) {
            if(element instanceof Image)
                g2.drawImage(...);
            else if(element instanceof String)
                g2.drawString(...);
        }
    }随便在这帖子上手敲的,关键是想知道这样的clip对draw有效吗
      

  5.   


    记住每个“模型”的 bounds,然后在单步“擦除”的时候去通过 clip 限制绘制区域
    的确在某些情况下,可以减少绘制负担
    但是,如果你的 clip 中,与很多别的“模型”有重叠区域
    那么,在调用绘制算法的时候
    你依然必须把这些模型的绘制算法都调用一次才能实现完美的绘制如果大量的模型有部分区域在 clip 中,而又有部分区域在 clip 外
    其实,g2d 内部也得通过某些算法去进行判断
    (它要不断的判断,该步绘制中:哪些区域是需要绘制的,哪些区域又无需绘制)
    如果这样的情况过多,反而会加重算法负担最终表现出现的绘制效率,可能会反而不如直接将全图进行绘制最后,说一个著名的结论:
    一切通过理论得出的效率优劣都是浮云
    你只有通过实测对比,才能证明究竟哪一种绘制方式更适合你的程序
    (可以通过计算:不同算法绘制前后的时间差,来进行对比)
      

  6.   


    记住每个“模型”的 bounds,然后在单步“擦除”的时候去通过 clip 限制绘制区域
    的确在某些情况下,可以减少绘制负担
    但是,如果你的 clip 中,与很多别的“模型”有重叠区域
    那么,在调用绘制算法的时候
    你依然必须把这些模型的绘制算法都调用一次才能实现完美的绘制如果大量的模型有部分区域在 clip 中,而又有部分区域在 clip 外
    其实,g2d 内部也得通过某些算法去进行判断
    (它要不断的判断,该步绘制中:哪些区域是需要绘制的,哪些区域又无需绘制)
    如果这样的情况过多,反而会加重算法负担最终表现出现的绘制效率,可能会反而不如直接将全图进行绘制最后,说一个著名的结论:
    一切通过理论得出的效率优劣都是浮云
    你只有通过实测对比,才能证明究竟哪一种绘制方式更适合你的程序
    (可以通过计算:不同算法绘制前后的时间差,来进行对比)好的 真心谢谢讲解啊