【发布时间】:2021-10-25 23:29:15
【问题描述】:
我正在使用 javaFx 开发一个有点复杂的应用程序,我正面临一个关于弹出窗口(工具提示、上下文菜单、警报等)的技术决策,似乎我有两种方法可以解决它:
- 扩展 PopupWindow(或 PopupControl),弹出窗口将在应用程序外部呈现在它们自己的未装饰窗口中。
- 将我的整个应用程序包装在一个支持固定/绝对定位和显示/定位弹出窗口作为过度播放节点的父级中。
我知道这似乎有点基于意见,但我找不到任何资源,如果有人做了一些分析或性能比较,我不知道哪个是桌面的“最佳实践”应用。
从直觉上看,弹出窗口的方法似乎更受青睐且更易于实现,但我已经看到了使用第二种方法的真实应用程序,例如 messenger 和 discord(可能是因为他们使用的是电子并且他们有义务遵循“网络方式”做事)。
任何帮助将不胜感激。
更新
在尝试实施这些想法后,我会回来添加我对这个问题的意见,以防万一有人遇到同样的问题。
这两种方法都有局限性,我遇到了以下问题:
阻止鼠标事件的工具提示
如果您围绕 PopupControl(或 PopupWindow)构建工具提示系统,并且希望工具提示周围有阴影,则工具提示(或阴影)将阻止鼠标事件到达应用程序窗口中的节点,并且因为你不能让窗口对鼠标事件透明,它会导致一些闪烁(你悬停一个节点,工具提示显示然后窃取鼠标事件,这会导致节点上的 MouseExited 事件,这会导致工具提示隐藏,它会无休止地发生,除非你把鼠标移开)
这个问题本质上是由阴影引起的,围绕布局(例如 VBox)构建工具提示并将工具提示添加到场景的根部将解决这个问题,因为您可以简单地使工具提示鼠标透明。
弹出窗口必须显示在应用程序窗口之外
在某些情况下,您可能会有一个位置固定的弹出/上下文菜单,例如,如果您构建上下文菜单,它必须显示在特定节点下并且不能在应用程序窗口内重新定位围绕添加到场景根目录的布局,您的上下文菜单可能必须在某些地方剪辑。
如果您的弹出窗口基于 PopupControl 或 PopupWindow,这个问题自然会得到解决。
【问题讨论】:
-
不要忽视使用相关 GUI 的设计师中对应的debate。
-
部分取决于你是否想要一个类似网络的界面。如果你想要它像网络一样,那么你在每个屏幕上都有导航菜单,支持前进/后退按钮,并使一切都像网络浏览器一样。这是现在很多人都习惯的。这可能不是最好的方法,但它是熟悉的。此外,目标设备也是一个考虑因素,移动 UI 通常与桌面 UI 不同。
-
就“非网络”界面而言,如果它们只是单个应用程序模式弹出窗口作为编辑表中值的覆盖层,那就很容易了。但是如果你想要Multiple-document Interface (MDI),JavaFX 中没有对它的本机支持。你可以构建它,但这将是相当多的工作。
-
如果它是一个 Windows 应用程序,或者您希望它看起来像一个(无论平台如何),那么您可以尝试关注Microsoft app design guideline。同样,Google 也有针对 material 的指南。苹果也有自己的Human Interface Guidelines for Mac and iOS。
-
所以说真的,只要你自己选择,随心所欲地学习,然后使用或忽略你想要的任何东西,然后为你的应用设计一个你想要使用并且运行良好的漂亮设计对于用户来说,关注12 Do you do hallway usability testing? 最终,这个问题无疑会被关闭为“可能导致基于意见的答案”。