当前位置: 首页 > 知识库问答 >
问题:

JavaFX:如何使用GraphicsContext方法appendSVGPath(String svgpath)

宋飞舟
2023-03-14

我正在做一个利用SVG的项目。目前,该程序将SVG存储为一个FXML文件中的SVGPath对象。然后将文件加载到一个组中,然后将其添加到屏幕中。在FXML文件中,大约有300个这样的SVGPath。我相信最终意味着场景图上有300个节点。

我最终将不得不增加SVGPath的数量,并且担心在场景中放置更多的节点,因此我开始考虑使用cavas/GraphicsContext。

private void appendSVG(GraphicsContext gc) {
     SVGPath svg = new SVGPath();
     svg.setContent("M 100 100 L 300 100 L 200 300 z");
     svg.setFill(Color.RED);
     svg.setStroke(Color.BLUE);
     gc.appendSVGPath(svg.getContent());
}
package canvastest;

import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.paint.Color;
import javafx.scene.shape.SVGPath;
import javafx.stage.Stage;

public class CanvasTest extends Application {

private Canvas canvas = new Canvas(200, 200);
private GraphicsContext gc = canvas.getGraphicsContext2D();
private Group root = new Group();

public static void main(String[] args) {
    launch(args);
}

@Override
public void start(Stage primaryStage) {
    primaryStage.setTitle("Canvas Test");

    appendSVG(gc);

//        SVGPath svg = new SVGPath();
//        svg.setContent("M 100 100 L 300 100 L 200 300 z");
//        svg.setFill(Color.RED);
//        svg.setStroke(Color.BLUE);

    root.getChildren().add(root);
    primaryStage.setScene(new Scene(root, 400, 400));
    primaryStage.show();
}

private void appendSVG(GraphicsContext gc) {
    SVGPath svg = new SVGPath();
    svg.setContent("M 100 100 L 300 100 L 200 300 z");
    svg.setFill(Color.RED);
    svg.setStroke(Color.BLUE);
    gc.appendSVGPath(svg.getContent());
}
}

有人成功地使用了appendsvgpath吗?

共有1个答案

都阳
2023-03-14

画布不像场景图,笔画和填充路径不会自动发生。相反,您需要将路径段提供给画布,然后显式调用fill()或stroke()来应用这些操作。有关更多信息,请参阅GraphicsContext Javadoc前面的“路径呈现”部分。

import javafx.application.Application;
import javafx.scene.*;
import javafx.scene.canvas.*;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class CanvasTest extends Application {

    private Canvas canvas = new Canvas(200, 200);
    private GraphicsContext gc = canvas.getGraphicsContext2D();

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage stage) {
        appendSVG(gc);

        stage.setScene(new Scene(new Group(canvas)));
        stage.show();
    }

    private void appendSVG(GraphicsContext gc) {
        gc.setFill(Color.RED);
        gc.setStroke(Color.BLUE);
        gc.appendSVGPath("M 50 50 L 150 50 L 100 150 z");
        gc.fill();
        gc.stroke();
    }
}
 类似资料:
  • 因此,我试图在我的JavaFX应用程序中创建一个自定义节点,它从扩展而来,因此可以自己进行渲染。我一开始只是试着画一个文本“Hello world”在画布上,但可惜它没有出现,即使我可以通过鼠标事件处理程序确认应用程序中是否存在自定义节点。 简而言之,如果我将这个的一个新实例添加到一个

  • GraphicsContext的clearRect方法的文档说明它使用了当前的剪辑,但这对我来说目前不起作用。考虑: 上面的代码正确地设置了剪辑掩码,fillOval正确地工作,而clearRect却什么也不做(尽管它在没有context.clip()的情况下正常工作),这就证明了这一点。这是为什么? --编辑-- 说清楚点,clearRect什么都不做,甚至连椭圆都不擦除。我意识到它不会抹去画的

  • 我必须在JavaFX中做一些用画布绘制正多边形的项目,我对如何使用GraphicsContext用画布设计一个圆有疑问 在主JavaFX中

  • 我正在尝试为鼠标拖动的事件创建一个EventHandler。我将使用同一个处理程序对多个ImageView执行相同的操作。这就是我所做的。 但显然,我不能使用toFront或setTranslate方法或任何我用于ImageView的方法,因为e.getSource返回一个对象,而这些是对象类型无法使用的ImageView方法。显然,我也不能简单地将其转换为ImageView 我可以简单地使用内部

  • null http://docs.oracle.com/javase/8/javafx/api/javafx/scene/canvas/graphicscontext.html 对第一条注释的补充:我不是使用路径节点,而是使用画布节点使用GraphicsContext执行呈现,因此不可能修改先前呈现的路径的颜色。我试着做一些事情 稍后我想重置路径中的像素到透明 然而,当混合被应用时,这不起作用。在

  • 问题内容: 因此,我正在使用shutdownhook进行清理,请放心,因为它并不总是保证shutdownhooks线程能够执行,我是否应该将此代码推送到每次关闭我的应用程序时都会执行的JavaFX Application Thread(方法stop())上?如果不关闭代码,运行基本上关闭的套接字,如果不杀死它,则杀死进程并不昂贵。 使用Application.stop()通过ShutdownHoo