gpt4 book ai didi

响应指标的 JavaFX 场景图修改

转载 作者:行者123 更新时间:2023-12-02 04:49:58 26 4
gpt4 key购买 nike

在 UI 线程上执行大型作业是一种不好的做法,这些大型作业将导致程序挂起(不接受用户输入或呈现任何新数据),直到该作业完成。

我希望在我们的代码库中添加一个小部件,当开发人员犯了这个禁忌时,该小部件将向他们表明。我的想法,以及我在许多其他应用程序中看到的想法,是让某些组件不断以恒定速度移动,例如在屏幕上不断旋转的条形。使用这样的工具,如果开发人员在工作时不小心在 UI 线程上做了一些比他预期的计算难度更大的事情,这个旋转条就会变得不稳定,向他表明,当他进行功能测试时,他需要实现一些机制这将导致该作业在其他地方执行。

对此代码的一个奇怪的要求是,它在生产版本中应该完全不存在,而仅存在于开发版本中,因为它是一个不是为用户提供的小部件,而是为开发人员提供的。

我跳进了 Canvas 对象并编写了一个快速组件,可以简单地旋转青色条。这个想法是,如果 UI 线程上转储了一个大作业,则栏将停止旋转(因为 FX 作业队列不会继续调度)并且栏将向前跳跃,而不是平滑旋转(就像程序处于运行状态时那样)休息)。

下面是第一个实现的屏幕截图:

Our product with two such teal spinners spinning away(注意青色条,如果您看到我们的应用程序正在运行,它会缓慢但稳定地旋转——无论如何希望如此)

这里的问题(您可能会注意到)是我们的布局被搞砸了。这是因为我正在修改场景图:

Scene
RootComponent
Content

Scene
obnoxiousPane
Canvas
Spinner(s)
RootComponent
Content

以这种方式修改场景图可以将诸如首选高度、鼠标事件和(大概)任何数量的其他事件分派(dispatch)到旋转器而不是内容组件。

当然,当我们投入生产时,我希望在我们提供给用户的版本中拥有原始场景图。

所以我的问题是:我应该如何解决这些问题?

我可以在每个问题出现时单独处理它们,编写大量自定义代码来完成诸如此类的事情

obnoxiousPane.prefHeightProperty().bind(content.prefHeightProperty)
obnoxiousPane.prefWidthProperty()//...
spinner.setMouseTransparent(true)
spinner.setOtherEventsIProbablyCantEnumerateWithoutSeriousResearchTransparent(true)

或者我可以尝试通过反射来解决这个问题,尝试将内容 Pane 中的每个属性绑定(bind)到相应的obnoxiousPane属性,但这似乎是一个错误滋生地。

或者...什么?我希望有一些 LightWeight 组件或 ImNotReallyHereProperty 我可以利用它们来添加此开发辅助工具。

感谢您的帮助!

最佳答案

您的方法似乎存在根本缺陷。您不应该停止 JavaFX 应用程序线程。

相反,您应该有一个并发进程,并在进程开始、进行和完成时适当更新 UI。

查看此java2s sample for using the JavaFX concurrency and progress indicator facilities有关这种替代方法的示例。

<小时/>

如果您想暂时禁用 UI 的某些部分,节点有一个您可以设置的禁用属性。您可以使用 CSS 来设置禁用节点的样式,以便用户可以得到一些指示,表明该节点并非只是挂起而是被故意禁用。

关于响应指标的 JavaFX 场景图修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29322620/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com