我正在开发一个JavaFX桌面应用程序,我想在另一个面板上覆盖一个圆形视口。
这是一个描绘我想要的非常简单的图像,白色区域将是透明的并显示底层面板。黑色区域将是纯色,并防止鼠标事件在底层面板上触发。
我已经研究过使用附加了事件监听器的Canvas,忽略了圆圈半径内的所有事件,但是我想知道是否有更高效/更少的hacky方法来执行此操作?
提前致谢。
答案 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可以调整大小,则需要添加该行为。