JavaFX和SVG:绘制一条线

2 java svg javafx

我正在使用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;    
}
Run Code Online (Sandbox Code Playgroud)

该方法getMoveto()返回Mm,取决于PositionType,并getLineto()返回Ll.

这是一个示例方法调用:

SVGPath test2 = SVGPrimitives.line(20f, 30.1f, 23f, 89.21f, PositionType.ABSOLUTE);
Run Code Online (Sandbox Code Playgroud)

以下是返回的路径:

M20.0,23.0 L 30.1,89.21
Run Code Online (Sandbox Code Playgroud)

这似乎对我有用,但没有任何内容......

tra*_*god 6

一个SVGPath包含单个线封闭任何区域,所以没有像素将被渲染.要查看效果,可以setStroke()在路径上使用,"定义围绕a轮廓绘制的笔划参数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;
}
Run Code Online (Sandbox Code Playgroud)

这同样适用于此处显示的更复杂的路径.在下面的示例中,请注意以下内容

  • 可以根据路径缩放路径size; 一个稍微不同的效果可通过改变封闭的规模来实现Pane,如图所示在这里.

  • 作为组成的援助,爪哇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);
    }
}
Run Code Online (Sandbox Code Playgroud)