2015-08-20 2 views
2

Я использую JavaFX для рендеринга некоторых материалов SVG. Я определил много методов, возвращая пути различных форм SVG (многоточие, круг, прямоугольник, линии и т. Д.). Все они, похоже, работают, за исключением метода линии. JavaFX не возвращает ошибку (это означает, что путь, вероятно, правильный), но он ничего не рисует. Вот мой метод.JavaFX и SVG: рисование строки

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 

Это кажется действует до меня, но ничего не рисуется ...

ответ

4

SVGPath, содержащий одну строку, не имеет области, поэтому пиксели не будут отображаться. Чтобы увидеть эффект, вы можете использовать setStroke() на пути, который «Определяет параметры штриха, нарисованного вокруг контура Shape».

image

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; 
} 

То же самое относится и к более сложным пути, показанные here. В приведенном ниже примере, обратите внимание на следующее

  • Путь, можно масштабировать в зависимости от size; слегка отличающийся эффект может быть достигнут путем изменения шкалы шкафа Pane, как показано на фиг. here.

  • Как помощь в составлении, Java 8 упрощает передачу функции в качестве параметра, как предложено here.

  • Более сложные пути могут быть построены с использованием доступного SVG editor.

Наконец, "Consider a builder when faced with many constructor parameters."

image

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