復位或清除或撤銷的DrawLine請考慮下面的示例圖像:如何用Java
的所有對象(矩形,形狀,文本等)都寫在BufferedImage
。我的問題是,在我寫上graphics.drawline(..)
之後,如何撤消或重置或清除我創建的行。即使我重新執行圖形的初始化,我畫的線仍然存在。
我仍然可以捕獲行的座標。如果它是一個普通的背景,我可以用相同的背景重新繪製它。但是,在這種情況下,這不會工作。
復位或清除或撤銷的DrawLine請考慮下面的示例圖像:如何用Java
的所有對象(矩形,形狀,文本等)都寫在BufferedImage
。我的問題是,在我寫上graphics.drawline(..)
之後,如何撤消或重置或清除我創建的行。即使我重新執行圖形的初始化,我畫的線仍然存在。
我仍然可以捕獲行的座標。如果它是一個普通的背景,我可以用相同的背景重新繪製它。但是,在這種情況下,這不會工作。
無法撤消對Graphics所做的任何操作。但還有其他的事情可以做,而你可以通過它來獲取圖像。
在做任何可能想撤消的操作之前,請保留圖像的副本。 並在需要時重新繪製。
在做任何可能想要撤消的操作之前,請先保留圖像區域的剪輯圖像。並在需要時重新繪製該區域。
爲了保持規模有限,這些圖像的堆棧將撤銷早在一系列一個好主意。不要讓堆棧尺寸過大,因爲它會消耗你的堆內存
我發現使用深拷貝:)
因此,首先,我深深的被複制的原始或默認圖像的答案。然後,如果我寫的東西在我原來用了複製的背部(深再次複製)..
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覆蓋它..
真的嗎?哎喲!! :(:(:(看起來像我必須重新編碼... – rainbowsix
我不這麼認爲,只需在你的代碼中有一個實例'Stack stack'假設你有一個實例'BufferedImage bi'將在畫面上繪製,調用'repaint()',然後在其上畫一些東西但是在繪製某些東西之前**可撤銷**創建另一個'BufferedImage copy'並在'copy'上繪製'bi',將其插入堆棧: 'stack.push(copy)'。並且每當你想撤銷時,都要這樣做:'bi = stack.pop()'。 –
afzalex
嗯......這是個好主意......謝謝:) – rainbowsix