【问题标题】:JavaFX: How can a Path be painted on a GraphicsContext?JavaFX:如何在 GraphicsContext 上绘制路径?
【发布时间】:2015-01-20 11:13:40
【问题描述】:

JavaFX 在GraphicsContext 和高级Path 节点上提供低级路径绘制方法。

我想将形状存储在类中并在GraphicsContext 中绘制它们。 Path 课程对我来说似乎很方便。我知道,它本来是用作场景图中的一个节点,但它包含了我需要的所有绘图元素。

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

我是否必须手动迭代 Path 元素并将它们转换为低级 GraphicsContext 方法,还是我错过了什么?

【问题讨论】:

  • 你好安迪,是否可以将路径保存在变量中并将其设置为标签或类似的东西?我不明白你的问题......在 JavaFX 中,可以将你的数据绑定到特定的图形对象,如标签。所以你可以做这样的事情:label.bind(StringPath) -> 这个例子不是真正的代码,但它从逻辑方面会像这样工作
  • 这不会回答你的问题,但它是一种更简单的方法。您可以将画布添加到窗格,然后在窗格上绘制节点或形状(如路径)以及画布上的任何其他内容吗?这就是我为一些自定义高速图表所做的。移动节点也更容易,因为 javafx 画布似乎没有 XOR 绘图模式,这与 awt 不同。

标签: path javafx graphicscontext


【解决方案1】:

我是否必须手动迭代 Path 元素并将它们转换为低级 GraphicsContext 方法?

是的。您需要编写一个转换器来获取从Path 提取的数据并调用适当的图形上下文方法(参见Path Rendering methods),例如beginPath()moveTo()lineTo()closePath()、@987654333 @、stroke()


您或许可以使用SVGPath,而不是使用路径。将 SVGPath 从场景图节点数据转换为 GraphicsContext 方法很容易 - 你可以这样做 gc.appendSVGPath(svgPath.getContent())

【讨论】:

  • 最后我编写了自己的 Path 类,这样我就可以在我编写软件的所有平台(JavaFX、Java 2D、Android、GWT)上使用它。非常简单...Here 是数据结构,here 是 JavaFX 渲染器如何处理它们的示例。出于性能原因,字符串中的 SVGPath 不适合我。
  • 不错的干净实现安迪。你可以随时answer your own questions
【解决方案2】:

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

由于Path 类是Node 类型,您可以在特定的Path 上使用方法Node.snapshot(),然后将生成的WritableImage 传递给@987654326 @

这里有一个简单的代码-sn-p 如何实现:

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();
}

【讨论】:

    猜你喜欢
    • 2017-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    相关资源
    最近更新 更多