【问题标题】:JavaFx create HatchStyles (something like of C# .Net)JavaFx 创建 HatchStyles(类似于 C# .Net)
【发布时间】:2016-09-02 17:18:07
【问题描述】:

在使用scene shape objects 或在JavaFx Canvas 上绘图(在jdk、第三方库、示例代码等中)时,是否有类似于.Net HatchStyles 的填充形状?

我目前能想到的唯一解决方案是使用ImagePattern 通过这些 .net 孵化样式的图像截图创建的!

GraphicsContext gc = canvas.getGraphicsContext2D();
ImagePattern pattern = new ImagePattern(new Image("dotnet-pattern.png");
gc.setFill(pattern);

.Net 填充样式的图形表示:

【问题讨论】:

  • 根据您的需要,巧妙地使用LinearGradients 可能会奏效。 AFAIK(我对 C# 一无所知)没有直接的等价物。对于ImagePattern,您还可以将底层Image 创建为WritableImage,甚至是snapshot,例如,包含Shape 实例的Pane
  • JPG 不是最好的图像格式,因为它有损。如果你使用这种方法,你最好使用.pngs。

标签: c# canvas javafx hatchstyle


【解决方案1】:

一种方法是对您的建议稍作修改:使用ImagePattern,但snapshot 是底层图像的适当节点。

在不知道HatchStyles 长什么样的情况下,以下变体可能会起作用:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.image.Image;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.paint.ImagePattern;
import javafx.scene.shape.Line;
import javafx.scene.shape.StrokeLineCap;
import javafx.stage.Stage;

public class HatchStyleCanvas extends Application {

    @Override
    public void start(Stage primaryStage) {
        Image hatch = createHatch();
        ImagePattern pattern = new ImagePattern(hatch, 0, 0, 20, 20, false);        
        Canvas canvas = new Canvas(600, 600);
        GraphicsContext gc = canvas.getGraphicsContext2D();
        gc.setFill(pattern);
        gc.fillRect(0, 0, 600, 600);
        primaryStage.setScene(new Scene(new StackPane(canvas)));
        primaryStage.show();
    }

    private Image createHatch() {
        Pane pane = new Pane();
        pane.setPrefSize(20, 20);
        Line fw = new Line(-5, -5, 25, 25);
        Line bw = new Line(-5, 25, 25, -5);
        fw.setStroke(Color.ALICEBLUE);
        bw.setStroke(Color.ALICEBLUE);
        fw.setStrokeWidth(5);
        bw.setStrokeWidth(5);
        pane.getChildren().addAll(fw, bw);
        new Scene(pane);
        return pane.snapshot(null, null);
    }

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

这会导致

【讨论】:

  • 谢谢!这比使用屏幕截图要好得多,我认为没有更好的解决方案,我反编译了 .Net 代码,发现它使用 GDI+ 来绘制 HatchSytles,所以即使移植代码也不是一种选择。
猜你喜欢
  • 1970-01-01
  • 2011-01-20
  • 1970-01-01
  • 2018-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-12
相关资源
最近更新 更多