Я работаю над проектом, который использует SVG. В настоящее время программа хранит SVG как объекты SVGPath в файле FXML. Затем файл загружается в группу, которая затем добавляется к экрану. В файле FXML имеется около 300 таких SVGPath. Я считаю, что в конечном итоге это означает, что на графике сцены имеется 300 узлов.JavaFX: Как использовать метод GraphicsContext appendSVGPath (String svgpath)
Я собираюсь в конечном итоге увеличить количество SVGPath, и у меня возникли проблемы с размещением большего количества узлов на сцене, поэтому я начал рассматривать использование Cavas/GraphicsContext.
GraphicsContext имеет метод appendSVGPath (String svgpath), который, я думаю, мог бы использовать для рисования SVG на кавале, но мне не повезло, чтобы они появились.
Я использую файл CanvasTest.java из Oracle в качестве отправной точки: http://docs.oracle.com/javafx/2/canvas/jfxpub-canvas.htm
Я изменил файл, чтобы включить следующий метод:
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());
}
}
Если я раскомментировать из секции SVG от начала, и просто добавить к SVG корень, то SVG будет отображаться.
Неужели кто-нибудь имел успех с помощью appendSVGPath?
Этот комментарий немного не по теме для вопроса, но только упоминается в случае, если вы хотите, чтобы рассмотреть другой подход (который я даже не говорю, это лучше один - просто разные) , Если единственная причина, по которой вы используете Canvas, состоит в том, что вас беспокоит количество узлов, вместо этого вы можете добавлять свои фигуры в сцену вне экрана и делать снимок с изображениями и просто визуализировать это изображение в ImageView - тогда JavaFX doesn «нужно иметь дело с управлением всеми этими узлами на постоянной основе, это было бы просто одноразовая вещь, чтобы сначала визуализировать и делать снимки узлов. – jewelsea
В этом случае было бы проще просто включить кеширование вашего узла группы. Вы также можете настроить поведение кэширования, указав соответствующий подсказку в кеше. Это очень помогло мне в прошлом и намного проще, чем перейти к одному из других упомянутых вариантов. – mipa