当前位置: 首页 > 知识库问答 >
问题:

JavaFX GraphicsContext clearRect不能使用剪辑掩码

颜宸
2023-03-14

GraphicsContext的clearRect方法的文档说明它使用了当前的剪辑,但这对我来说目前不起作用。考虑:

GraphicsContext context = canvas.getGraphicsContext2D();
context.beginPath();
context.rect(0,0,100,100); //Set the current path to a rectangle
context.stroke(); //Highlights where the current path is
context.clip();   //Intersect current clip with rectangle
context.fillOval(80, 80, 40, 40); //This correctly draws the oval clipped
context.clearRect(0,0,100,100); //This does nothing at all

上面的代码正确地设置了剪辑掩码,fillOval正确地工作,而clearRect却什么也不做(尽管它在没有context.clip()的情况下正常工作),这就证明了这一点。这是为什么?

--编辑--

说清楚点,clearRect什么都不做,甚至连椭圆都不擦除。我意识到它不会抹去画的矩形,但这不是我所关心的。

--编辑2--

GraphicsContext context = canvas.getGraphicsContext2D();
context.beginPath();
context.arc(50, 50, 40, 40, 0, 360); // Make a circular clip mask
context.closePath();
context.clip();
context.fillRect(0, 0, 200, 200); //Draw a circle clipped correctly, shows clip mask is working
context.clearRect(0, 0, 200, 200); //Does nothing
public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {
        try {
            BorderPane root = new BorderPane();
            Scene scene = new Scene(root, 400, 400);
            primaryStage.setScene(scene);
            primaryStage.show();

            Canvas canvas = new Canvas(500, 500);
            root.getChildren().add(canvas);

            GraphicsContext context = canvas.getGraphicsContext2D();
            context.beginPath();
            context.arc(50, 50, 40, 40, 0, 360);
            context.closePath();
            context.clip();
            context.fillRect(0, 0, 200, 200);
            context.clearRect(0, 0, 200, 200);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

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

共有1个答案

尚阳炎
2023-03-14

根据Edit2,这种行为似乎是一个bug。总而言之,当设置非矩形剪辑时,clearRect不起作用。(如果它甚至对矩形剪辑都不适用,请更新到最新的JDK。)我已经为此提交了一份错误报告。

 类似资料:
  • 问题内容: 我有这个HTML: 使用此CSS: 我正在应用的背景图像是200x100像素,但我只想显示200x50像素的背景图像的裁剪部分。 似乎不是正确的CSS属性。我该怎么用呢? 不应使用,因为我在Sprite上下文中使用了上述CSS,在该Sprite上下文中,我要显示的图像部分小于定义CSS的元素。 问题答案: 您可以将图形放置在具有其自身尺寸上下文的伪元素中: 浏览器支持很好,但是如果需要

  • 1.1、什么是云剪辑 目睹云云剪辑,顾名思义就是云端处理视频的工具。他大大解放了生成工具的限制,可以随时随地的开启一段视频的剪辑工作。 目前对于视频制作有以下几个难点: 第一,相对图文模式,视频的制作门槛高。需要更专业、更具审美观的视频剪辑人员,花费更长的时间和精力来产出内容。 第二,市面上绝大部分视频制作软件操作复杂,生产内容效率低下,无法实现人工智能化。即使是非常资深的视频剪辑师,生产1分钟的

  • 我有一个简单的剪辑方法,来回放小wav的声音。是的,我现在找到了clip.loop()方法,但无论如何,我不明白为什么我的方法不能工作。 代码如下: 谢谢!

  • 问题内容: 我需要使用java.awt.Graphics绘制一条线,但是仅应渲染位于矩形外部的那部分线。 是否可以使用图形剪切支持,或者我需要自己计算交点并剪切线? 问题答案: 您需要使用Area类。本示例将演示如何执行您的要求:

  • 好吧,标题说明了一切,我尝试使用javax播放wav文件。声音,什么也没有发生。我试过很多不同的文件,但没有任何运气。

  • 动画剪辑是一组动画曲线,包含了所有动画数据。 动画曲线 动画曲线描述了某一对象上某一属性值随着时间的变化。 在内部,动画曲线存储了一系列时间点,每个时间点都对应着一个(曲线)值,称为一帧,或关键帧。 当动画系统运作时,动画组件根据当前动画状态计算出指定时间点应有的(结果)值并赋值给对象,完成属性变化;这一计算过程称为采样。 以下代码片段演示了如何程序化地创建动画剪辑。 import { Anima