Graphics2D 的一个问题

fearlessMore 2013-07-29 08:14:18
Graphics2D paint技术能擦除上一步操作吗?例如:在一个图片上drawString()后,再drawString()则会和之前绘制的string叠加,所以我想回滚上一步操作。我发现不能用clearRect(),因为擦除区域后,背景颜色是单一的,显然没达到擦除上一步paint操作的目的。
...全文
281 11 打赏 收藏 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunyiz 2013-08-02
  • 打赏
  • 举报
回复
引用 9 楼 Gaowen_HAN 的回复:
[quote=引用 6 楼 sunyiz 的回复:] 你应该用 MVC 的思想去设计 思路可以是这个样子的: 记住你每一步绘制的数据模型(可能是字符、可能是图形。当然,这些字符、图形的具体坐标、大小、颜色、等等也应当保存住) 然后形成一个 list 在绘制的时候,根据这个 list 中的模型去绘制视图 你如果想“删除”其中的某一次绘制,只要在这个 list 中移除某一个数据 然后 repaint 就能实现界面上的擦除了
可以,算是一种可行的办法,但是每次都要完全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有效吗[/quote] 记住每个“模型”的 bounds,然后在单步“擦除”的时候去通过 clip 限制绘制区域 的确在某些情况下,可以减少绘制负担 但是,如果你的 clip 中,与很多别的“模型”有重叠区域 那么,在调用绘制算法的时候 你依然必须把这些模型的绘制算法都调用一次才能实现完美的绘制 如果大量的模型有部分区域在 clip 中,而又有部分区域在 clip 外 其实,g2d 内部也得通过某些算法去进行判断 (它要不断的判断,该步绘制中:哪些区域是需要绘制的,哪些区域又无需绘制) 如果这样的情况过多,反而会加重算法负担 最终表现出现的绘制效率,可能会反而不如直接将全图进行绘制 最后,说一个著名的结论: 一切通过理论得出的效率优劣都是浮云 你只有通过实测对比,才能证明究竟哪一种绘制方式更适合你的程序 (可以通过计算:不同算法绘制前后的时间差,来进行对比)
fearlessMore 2013-08-02
  • 打赏
  • 举报
回复
引用 10 楼 sunyiz 的回复:
[quote=引用 9 楼 Gaowen_HAN 的回复:] [quote=引用 6 楼 sunyiz 的回复:] 你应该用 MVC 的思想去设计 思路可以是这个样子的: 记住你每一步绘制的数据模型(可能是字符、可能是图形。当然,这些字符、图形的具体坐标、大小、颜色、等等也应当保存住) 然后形成一个 list 在绘制的时候,根据这个 list 中的模型去绘制视图 你如果想“删除”其中的某一次绘制,只要在这个 list 中移除某一个数据 然后 repaint 就能实现界面上的擦除了
可以,算是一种可行的办法,但是每次都要完全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有效吗[/quote] 记住每个“模型”的 bounds,然后在单步“擦除”的时候去通过 clip 限制绘制区域 的确在某些情况下,可以减少绘制负担 但是,如果你的 clip 中,与很多别的“模型”有重叠区域 那么,在调用绘制算法的时候 你依然必须把这些模型的绘制算法都调用一次才能实现完美的绘制 如果大量的模型有部分区域在 clip 中,而又有部分区域在 clip 外 其实,g2d 内部也得通过某些算法去进行判断 (它要不断的判断,该步绘制中:哪些区域是需要绘制的,哪些区域又无需绘制) 如果这样的情况过多,反而会加重算法负担 最终表现出现的绘制效率,可能会反而不如直接将全图进行绘制 最后,说一个著名的结论: 一切通过理论得出的效率优劣都是浮云 你只有通过实测对比,才能证明究竟哪一种绘制方式更适合你的程序 (可以通过计算:不同算法绘制前后的时间差,来进行对比)[/quote]好的 真心谢谢讲解啊
raistlic 2013-08-01
  • 打赏
  • 举报
回复
引用 6 楼 sunyiz 的回复:
你应该用 MVC 的思想去设计 思路可以是这个样子的: 记住你每一步绘制的数据模型(可能是字符、可能是图形。当然,这些字符、图形的具体坐标、大小、颜色、等等也应当保存住) 然后形成一个 list 在绘制的时候,根据这个 list 中的模型去绘制视图 你如果想“删除”其中的某一次绘制,只要在这个 list 中移除某一个数据 然后 repaint 就能实现界面上的擦除了
怎么又想起来这里水了
sunyiz 2013-08-01
  • 打赏
  • 举报
回复
你应该用 MVC 的思想去设计 思路可以是这个样子的: 记住你每一步绘制的数据模型(可能是字符、可能是图形。当然,这些字符、图形的具体坐标、大小、颜色、等等也应当保存住) 然后形成一个 list 在绘制的时候,根据这个 list 中的模型去绘制视图 你如果想“删除”其中的某一次绘制,只要在这个 list 中移除某一个数据 然后 repaint 就能实现界面上的擦除了
fearlessMore 2013-08-01
  • 打赏
  • 举报
回复
引用 6 楼 sunyiz 的回复:
你应该用 MVC 的思想去设计 思路可以是这个样子的: 记住你每一步绘制的数据模型(可能是字符、可能是图形。当然,这些字符、图形的具体坐标、大小、颜色、等等也应当保存住) 然后形成一个 list 在绘制的时候,根据这个 list 中的模型去绘制视图 你如果想“删除”其中的某一次绘制,只要在这个 list 中移除某一个数据 然后 repaint 就能实现界面上的擦除了
可以,算是一种可行的办法,但是每次都要完全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有效吗
sunyiz 2013-08-01
  • 打赏
  • 举报
回复
引用 7 楼 raistlic 的回复:
[quote=引用 6 楼 sunyiz 的回复:] 你应该用 MVC 的思想去设计 思路可以是这个样子的: 记住你每一步绘制的数据模型(可能是字符、可能是图形。当然,这些字符、图形的具体坐标、大小、颜色、等等也应当保存住) 然后形成一个 list 在绘制的时候,根据这个 list 中的模型去绘制视图 你如果想“删除”其中的某一次绘制,只要在这个 list 中移除某一个数据 然后 repaint 就能实现界面上的擦除了
怎么又想起来这里水了[/quote] 看这 ID …… 但是你就是那个戴眼镜的澳洲人……
raistlic 2013-07-29
  • 打赏
  • 举报
回复
BufferedImage 应该不可以,它就是一个二维数组,只有“一层”。
Inhibitory 2013-07-29
  • 打赏
  • 举报
回复
每一次绘制出来的对象都单独保存。
fearlessMore 2013-07-29
  • 打赏
  • 举报
回复
引用 1 楼 fangmingshijie 的回复:
repaint多好呢
能改变什么吗
  • 打赏
  • 举报
回复
repaint多好呢
fearlessMore 2013-07-29
  • 打赏
  • 举报
回复
那怎么办,只想擦除上一次绘制的string

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧