JavaFX:如何在 GraphicsContext 上绘制路径?

JavaFX: How can a Path be painted on a GraphicsContext?

JavaFX 在 GraphicsContext and a high-level Path 节点上提供两种低级路径绘制方法。

我想在 classes 中存储形状并在 GraphicsContext 中绘制它们。 Path class 对我来说似乎很方便。我知道,它的意思是用作场景图中的节点,但它包含我需要的所有绘图元素。

我正在寻找类似的方法 GraphicsContext.fillPath(Path) 但是有 none.

我是否必须手动遍历 Path 元素并将它们转换为低级 GraphicsContext 方法,还是我遗漏了什么?

Do I have to iterate over the Path elements by hand and translate them into low-level GraphicsContext methods?

是的。您将需要编写一个翻译器来获取从 Path and invoke appropriate graphics context methods (see the Path Rendering methods) 中提取的数据,例如 beginPath()moveTo()lineTo()closePath()fill, stroke(), 等等


与其使用路径,不如使用 SVGPath. It is easy to translate an SVGPath from a Scene graph node data to a GraphicsContext method - you can just do gc.appendSVGPath(svgPath.getContent()).

我知道,有点晚了,但这里有一个简单的通用解决方案...

由于 Path class 是 Node 类型,您可以使用方法 Node.snapshot() 11=] 然后将生成的 WritableImage 传递给 GraphicsContext.drawImage().

这是实现此目的的简单代码片段:

public void start(Stage primaryStage) {

    Pane pane = new Pane();
    Canvas canvas = new Canvas(70, 70);
    GraphicsContext gc = canvas.getGraphicsContext2D();
    pane.getChildren().add(canvas);
    Scene scene = new Scene(pane, 70, 70);
    primaryStage.setScene(scene);
    
    Path path = new Path(
            new MoveTo(10,10), 
            new LineTo(60,60), 
            new LineTo(60, 10), 
            new ClosePath());
    path.setStroke(Color.BLACK);
    path.setStrokeWidth(2.0);
    Bounds pathBounds = path.getLayoutBounds();
    WritableImage snapshot = new WritableImage(
            (int) pathBounds.getWidth(), (int) pathBounds.getHeight());
    SnapshotParameters snapshotParams = new SnapshotParameters();
    snapshot = path.snapshot(snapshotParams, snapshot);
    gc.drawImage(snapshot, pathBounds.getMinX(), pathBounds.getMinY());
    
    primaryStage.show();
}