【问题标题】:JavaFX - draw donutJavaFX - 画甜甜圈
【发布时间】:2017-07-28 20:56:28
【问题描述】:

我需要使用 JavaFX 的 GraphicsContext 绘制一个甜甜圈形状 - 一个中心有一个洞的实心圆圈,以澄清。

我一直在搜索,但在网上找不到任何示例。

我想你会使用fillarc 函数,但我不明白。我找不到任何示例,文档也没有太大帮助。 (arcExtent 是什么?所有文档都说这是弧的范围......)

我不想填充两个重叠的圆圈,因为我想在绘图时保持中心透明。 (下面已经画了东西,不能干涉)

【问题讨论】:

  • 为什么投反对票?我在网上找不到任何示例
  • 因为您没有显示代码尝试。
  • @Eric 我编辑了问题
  • 您可能还想提到甜甜圈中心对于已在其下方绘制的内容是透明的...
  • @Eric 好点,已编辑

标签: javafx graphics 2d fill graphicscontext


【解决方案1】:

这里有几个示例解决方案,一个使用shape subtraction 表示圆圈,另一个使用Arc。两个示例都使用场景图进行绘制。

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

public class DonutHole extends Application {
    @Override
    public void start(Stage stage) throws Exception {
        // donut by shape subtraction.
        Circle whole = new Circle(20, 20, 20);
        Circle inside = new Circle(20, 20, 10);
        Shape donutShape = Shape.subtract(whole, inside);
        donutShape.setFill(Color.BLUE);

        // donut by arc.
        Arc donutArc = new Arc(60, 20, 10, 10, 0, 360);
        donutArc.setStrokeWidth(10);
        donutArc.setStrokeType(StrokeType.OUTSIDE);
        donutArc.setStroke(Color.RED);
        donutArc.setStrokeLineCap(StrokeLineCap.BUTT);
        donutArc.setFill(null);

        Scene scene = new Scene(new Group(donutShape, donutArc), Color.PALEGREEN);
        stage.setScene(scene);
        stage.show();
    }

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

另一种解决方案也可以使用带有圆弧和线段的Path,但我没有在这里展示。如果你想要一个 3D 甜甜圈,你可以创建一个Torus


这是另一个在 GraphicsContext 中使用 fillArc 的示例。

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

public class DonutHoleGraphics extends Application {
    @Override
    public void start(Stage stage) throws Exception {
        Canvas canvas = new Canvas(40, 40);

        GraphicsContext gc = canvas.getGraphicsContext2D();
        gc.setLineWidth(10);
        gc.setStroke(Color.YELLOW);
        gc.setLineCap(StrokeLineCap.BUTT);
        gc.strokeArc(5, 5, 30, 30, 0, 360, ArcType.OPEN);

        Scene scene = new Scene(new Group(canvas), Color.PALEGREEN);
        stage.setScene(scene);
        stage.show();
    }

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

相关:

【讨论】:

  • 谢谢!但是,我确实需要使用GraphicsContext...我没有看到任何填充给定形状的方法,我也看不到如何在抚摸弧线时(对于您的第二种方法)我可以使用设置厚度GraphicsContext
  • 其实我找到了:ctx.setLineWidth。谢谢!我用的是第二种方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-24
  • 1970-01-01
相关资源
最近更新 更多