2015-06-03 1 views
1

Я работаю над проектом, который использует 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?

+0

Этот комментарий немного не по теме для вопроса, но только упоминается в случае, если вы хотите, чтобы рассмотреть другой подход (который я даже не говорю, это лучше один - просто разные) , Если единственная причина, по которой вы используете Canvas, состоит в том, что вас беспокоит количество узлов, вместо этого вы можете добавлять свои фигуры в сцену вне экрана и делать снимок с изображениями и просто визуализировать это изображение в ImageView - тогда JavaFX doesn «нужно иметь дело с управлением всеми этими узлами на постоянной основе, это было бы просто одноразовая вещь, чтобы сначала визуализировать и делать снимки узлов. – jewelsea

+0

В этом случае было бы проще просто включить кеширование вашего узла группы. Вы также можете настроить поведение кэширования, указав соответствующий подсказку в кеше. Это очень помогло мне в прошлом и намного проще, чем перейти к одному из других упомянутых вариантов. – mipa

ответ

3

Холст не похож на график сцены, поглаживание и заполнение путей не происходит автоматически. Вместо этого вам необходимо передать сегменты пути на холст, а затем явно вызвать fill() или stroke(), чтобы эти операции были применены. Для получения дополнительной информации см. Раздел «рендеринг путей» в начале GraphicsContext javadoc.

svgpath

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(); 
    } 
} 
Смежные вопросы