2015-06-28 15 views
1

復位或清除或撤銷的DrawLine請考慮下面的示例圖像:如何用Java

http://i61.tinypic.com/ehlr1x.jpg.

的所有對象(矩形,形狀,文本等)都寫在BufferedImage。我的問題是,在我寫上graphics.drawline(..)之後,如何撤消或重置或清除我創建的行。即使我重新執行圖形的初始化,我畫的線仍然存在。

我仍然可以捕獲行的座標。如果它是一個普通的背景,我可以用相同的背景重新繪製它。但是,在這種情況下,這不會工作。

回答

0

無法撤消對Graphics所做的任何操作。但還有其他的事情可以做,而你可以通過它來獲取圖像。

  1. 在做任何可能想撤消的操作之前,請保留圖像的副本。 並在需要時重新繪製。

  2. 在做任何可能想要撤消的操作之前,請先保留圖像區域的剪輯圖像。並在需要時重新繪製該區域。


爲了保持規模有限,這些圖像的堆棧將撤銷早在一系列一個好主意。不要讓堆棧尺寸過大,因爲它會消耗你的堆內存

+0

真的嗎?哎喲!! :(:(:(看起來像我必須重新編碼... – rainbowsix

+0

我不這麼認爲,只需在你的代碼中有一個實例'Stack stack'假設你有一個實例'BufferedImage bi'將在畫面上繪製,調用'repaint()',然後在其上畫一些東西但是在繪製某些東西之前**可撤銷**創建另一個'BufferedImage copy'並在'copy'上繪製'bi',將其插入堆棧: 'stack.push(copy)'。並且每當你想撤銷時,都要這樣做:'bi = stack.pop()'。 – afzalex

+0

嗯......這是個好主意......謝謝:) – rainbowsix

0

我發現使用深拷貝:)

因此,首先,我深深的被複制的原始或默認圖像的答案。然後,如果我寫的東西在我原來用了複製的背部(深再次複製)..

static BufferedImage deepCopy(BufferedImage bi) { 
    ColorModel cm = bi.getColorModel(); 
    boolean isAlphaPremultiplied = cm.isAlphaPremultiplied(); 
    WritableRaster raster = bi.copyData(null); 
    return new BufferedImage(cm, raster, isAlphaPremultiplied, null); 
} 

完整代碼,可以發現here覆蓋它..