JavaFX:如何在不影响背景的情况下清除图形

时间:2017-10-28 08:44:03

标签: java canvas javafx

非常简单的问题,但我在JavaFX文档或StackOverflow中找不到答案:

我有一个填充了图形的JavaFX Canvas(对strokeLine()的各种调用,这里不是问题)。我需要能够在此图形上绘制一个矩形,然后只需清除矩形,而不会影响背景中的图形。 (就像撤消操作一样)。

绘制矩形的代码(' p'和' e'是点):

gc.rect(p.getX(), p.getY(), e.getX()-p.getX(), e.getY()-p.getY());
gc.stroke();

最明显的答案是使用clearRect()方法,但问题是它还清除了背景图中的部分......

所以问题是:如何清除使用stroke()绘制的图形,而不影响背景中的其他图形?

3 个答案:

答案 0 :(得分:2)

您无法使用一个画布执行此操作。

Canvas仅存储绘画操作的结果。 这是画布的兴趣,你可以在相同的行上行百万次,它只会存储和表示结果而不会消耗更多的内存。

所以,如果你需要在图表上绘制一些东西,你应该在图表上放置另一个画布并在第二个画布上绘制。

答案 1 :(得分:1)

如果您只是将画布放入一个组中,然后只需将一个Rectangle节点添加到Group中,您可以随时删除,如果您愿意,可能会更直接和更多JavaFX处理方式。< / p>

答案 2 :(得分:0)

这可以通过使用 .snapshot(SnapshotParameters params, WritableImage image) 方法拍摄 Canvas 的快照来实现。基本上,每次你在你的 Canvas 上画一些东西时,你都会拍一张它的快照并将它存储在某个地方(例如在 ArrayList 中)。然后,您可以使用这些快照创建“撤消”操作,方法是使用 .画布的GraphicsContext的drawImage(Image img, double x, double y)方法,在这个方法中,你将要返回的快照作为Image参数传递。