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