JavaFX: Как можно нарисовать путь на GraphicsContext?

JavaFX предоставляет оба низкоуровневых метода рисования пути на GraphicsContext и высокий уровень Path узел.

Я хочу хранить фигуры в классах и рисовать их в GraphicsContext, Path класс кажется мне удобным. Я знаю, он предназначен для использования в качестве узла в графе сцены, но он содержит все необходимые мне элементы рисования.

Я ищу такой метод, как GraphicsContext.fillPath(Path) но нет ни одного.

Должен ли я перебирать Path элементы вручную и перевести их на низкий уровень GraphicsContext методы, или я что-то упустил?

2 ответа

Решение

Нужно ли вручную перебирать элементы Path и переводить их в низкоуровневые методы GraphicsContext?

Да. Вам нужно будет написать переводчик, чтобы взять данные, извлеченные из Path и вызвать соответствующие методы графического контекста (см., например, методы рендеринга пути) beginPath(), moveTo(), lineTo(), closePath(), fill, stroke(), так далее.


Вместо того, чтобы использовать путь, вы могли бы использовать SVGPath, SVGPath легко перевести из данных узла графа сцены в метод GraphicsContext - вы можете просто сделать gc.appendSVGPath(svgPath.getContent()),

Я знаю, это немного поздно, но вот простое универсальное решение ...

Поскольку класс имеет тип Node, вы можете использовать метод Node.snapshot() на вашем конкретном Path а затем передать сгенерированный 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();
}
Другие вопросы по тегам