【发布时间】:2012-09-24 22:34:10
【问题描述】:
JavaFX 2 颜色选择器有一个按钮,可以弹出颜色选择器窗格,如下所示:
我想做类似的事情,因为我希望在单击按钮时弹出自定义窗格,并在单击其他内容时消失(在我的情况下,是一些图像缩略图)。实现这一目标的最佳方法是什么?我应该使用 ContextMenu 并以某种方式将窗格添加到 MenuItem,还是应该查看其他内容?
【问题讨论】:
JavaFX 2 颜色选择器有一个按钮,可以弹出颜色选择器窗格,如下所示:
我想做类似的事情,因为我希望在单击按钮时弹出自定义窗格,并在单击其他内容时消失(在我的情况下,是一些图像缩略图)。实现这一目标的最佳方法是什么?我应该使用 ContextMenu 并以某种方式将窗格添加到 MenuItem,还是应该查看其他内容?
【问题讨论】:
用当前的 JavaFX 2.2 API 做好有点困难。
这里有一些选项。
使用 MenuButton 并在其 MenuItem 中设置图形
这是Button with popup showed below的可执行文件sample code中采用的方法。
使用 PopupControl
在code 中看看 ColorPicker 是如何做到这一点的。
ColorPicker 扩展 PopupControl。您可以这样做,但目前并非所有构建您自己的 PopupControl 所需的 API 都是公开的。因此,对于 JavaFX 2.2,您将不得不依赖已弃用的内部 com.sun 类,这些类将被 JDK8 中的公共 javafx.scene.control 类取代。
使用上下文菜单
所以,我认为“使用 ContextMenu 并向 MenuItem 添加窗格”的想法可能是目前最好的方法。您应该能够通过在普通的MenuItem 上使用CustomMenuItem 或setting a graphic 来做到这一点。 ContextMenu 有很好的relative positioning logic。 ContextMenu 也可以由MenuButton 触发。
使用自定义对话框
为此,请在相对于节点的位置显示透明舞台。
有一些示例代码可以帮助您入门,我暂时链接了here。 示例代码对主窗口的侧面进行相对定位,但您可以对其进行更新以执行相对于给定节点侧面的定位(如 ContextMenu 的 show 方法)。
使用玻璃板
为此,请创建一个 StackPane 作为主窗口的根。将您的主内容窗格作为 StackPane 中的第一个节点,然后创建一个组作为堆栈窗格中的第二个节点,以便它将覆盖在主要内容的顶部。通常,顶部组不包含任何内容,但是当您想要显示弹出窗口时,请将其放在顶部组中并将其转换为相对于主要内容中相应节点的位置。
您可以查看this demo 中的锚节点是如何使用的,以了解它如何适应您的上下文。
是否有针对 JavaFX8 的相关更新?
Java 8 的相关性没有太大区别,一般来说,这些选项是基于 Java 2.2 功能在这篇文章中概述的。 Java 8 确实添加了Dialog 和Alert 功能,但它们更针对使用带有边框、标题和按钮的对话框,而不是问题中所需的那种功能。也许您可以从 Dialog 类开始并对其进行大量定制以得到接近所需的东西,但您最好从空白阶段或 PopupControl 开始。
【讨论】: