JavaFX Circular Cutout

时间:2018-04-30 02:18:25

标签: java javafx

我正在开发一个JavaFX桌面应用程序,我想在另一个面板上覆盖一个圆形视口。

这是一个描绘我想要的非常简单的图像,白色区域将是透明的并显示底层面板。黑色区域将是纯色,并防止鼠标事件在底层面板上触发。

Example

我已经研究过使用附加了事件监听器的Canvas,忽略了圆圈半径内的所有事件,但是我想知道是否有更高效/更少的hacky方法来执行此操作?

提前致谢。

1 个答案:

答案 0 :(得分:2)

在前Shape的{​​{3}}上设置相应的Node

来自clip属性的Javadoc:

  

指定用于定义此节点的剪切形状的节点。在场景图中,此剪切节点不是此节点的子节点。相反,它用于定义此节点的剪辑。

     

例如,您可以使用ImageView节点作为掩码来表示Clip。或者您可以使用几何形状节点之一,如矩形或圆形。或者您可以使用Text节点来表示Clip。

     

有关设置剪辑的场景图结构限制,请参阅Node的类文档。如果更改剪辑变量违反了这些限制,则忽略更改并恢复剪辑变量的先前值。

     

请注意,这是一个条件功能。有关详细信息,请参阅ConditionalFeature.SHAPE_CLIP。

     

将剪辑与3D变换混合存在已知的限制。剪切本质上是2D图像操作。在具有3D转换子节点的Group节点上设置Clip的结果将导致其子节点按顺序呈现,而不会在这些子节点之间应用Z缓冲。

无论如何,您可以使用与Rectangle大小相同的Node。然后,创建一个以Circle为中心且具有所需半径的Rectangle。从这两个形状中使用Shape.subtract(rectangle, circle);创建一个新形状。这将在Rectangle的中间创建一个“洞”,以显示任何潜在的Node

代码示例:

private void setClipViewport(Region region) {
    int width = region.getWidth();
    int height = region.getHeight();

    Rectangle rect = new Rectangle(0, 0, width, height);
    Circle circ = new Circle(width / 2, height / 2, Math.min(width, height) / 2);

    Shape clip = Shape.subtract(rect, circ);

    region.setClip(clip);
}

但是,我的示例不会在必要时调整剪辑的大小。因此,如果您的UI可以调整大小,则需要添加该行为。