JavaFX и SVG: рисование линии
Я использую JavaFX для рендеринга некоторых SVG-файлов. Я определил много методов, возвращая пути различных форм SVG (многоточие, круг, прямоугольник, линии и т. Д.). Кажется, что все они работают, кроме метода линии. JavaFX не возвращает ошибку (что означает, что путь, вероятно, правильный), но ничего не рисует. Вот мой метод.
public static SVGPath line(float startX, float endX, float startY, float endY, PositionType positionType)
{
SVGPath path = new SVGPath();
path.setContent(positionType.getMoveto()+startX+","+startY+positionType.getLineto("l")+endX+","+endY);
return path;
}
Метод getMoveto()
либо возвращает M
или же m
, в зависимости от PositionType
, а также getLineto()
либо возвращает L
или же l
,
Вот пример вызова метода:
SVGPath test2 = SVGPrimitives.line(20f, 30.1f, 23f, 89.21f, PositionType.ABSOLUTE);
И вот путь, который возвращается:
M20.0,23.0 L 30.1,89.21
Мне это кажется действительным, но ничего не нарисовано...
1 ответ
SVGPath
содержащая одну строку не содержит области, поэтому пиксели не будут отображаться. Чтобы увидеть эффект, вы можете использовать setStroke()
на пути, который "Определяет параметры обводки, которая рисуется вокруг контура Shape
".
root.getChildren().addAll(line(32), line(48), line(64));
…
private SVGPath line(int size) {
SVGPath path = new SVGPath();
path.setStroke(Color.BLUE);
path.setContent("M0,0L" + size + "," + size + "z");
return path;
}
То же самое относится и к более сложным путям, показанным здесь. В приведенном ниже примере обратите внимание на следующее
Путь может быть масштабирован как функция от
size
; немного другой эффект может быть достигнут, изменяя масштаб ограждающихPane
, как показано здесь.В качестве помощи в компоновке Java 8 облегчает передачу функции в качестве параметра, как предлагается здесь.
Более сложные пути могут быть построены с использованием доступного редактора SVG.
Наконец, "Рассмотрим конструктор, когда сталкиваемся со многими параметрами конструктора".
import java.util.function.IntFunction;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.SVGPath;
import javafx.stage.Stage;
/**
* @see http://www.w3.org/TR/SVG/paths.html
* @see http://raphaeljs.com/icons/
*/
public class SVGIcons extends Application {
private static final int SIZE = 16;
@Override
public void start(Stage stage) {
VBox root = new VBox(10);
root.setAlignment(Pos.CENTER);
root.setPadding(new Insets(10));
root.getChildren().add(createRow(this::lines));
root.getChildren().add(createRow(this::curve));
root.getChildren().add(createRow(this::arc));
Scene scene = new Scene(root);
stage.setTitle("SVGIcons");
stage.setScene(scene);
stage.show();
}
private HBox createRow(IntFunction<SVGPath> path) {
HBox row = new HBox(10);
row.setAlignment(Pos.CENTER);
for (int i = 2; i < 6; i++) {
row.getChildren().add(path.apply(i * SIZE));
}
return row;
}
private SVGPath lines(int size) {
SVGPath path = new SVGPath();
path.setFill(Color.ALICEBLUE);
path.setStroke(Color.BLUE);
path.setContent("M0," + size + "L" + size / 2 + ",0 "
+ size + "," + size + " " + size / 2 + "," + 2 * size / 3 + "z");
return path;
}
private SVGPath curve(int size) {
SVGPath path = new SVGPath();
path.setFill(Color.HONEYDEW);
path.setStroke(Color.GREEN);
path.setContent("M0,0Q" + size + ",0,"
+ size + "," + size + "L0," + size + "z");
return path;
}
private SVGPath arc(int size) {
SVGPath path = new SVGPath();
path.setFill(Color.MISTYROSE);
path.setStroke(Color.RED);
path.setContent("M0,0A" + size / 2 + "," + size
+ ",0,1,0," + size + ",0z");
return path;
}
public static void main(String[] args) {
launch(args);
}
}