响应指示器的JavaFX场景图修改

响应指示器的JavaFX场景图修改,java,multithreading,data-binding,properties,javafx,Java,Multithreading,Data Binding,Properties,Javafx,在UI线程上执行大作业是一种不好的做法,因为如果您这样做,这些大作业将导致程序挂起(不接受用户输入或呈现任何新数据),直到该作业完成 我希望在我们的代码库中添加一个小部件,向开发人员指出他们何时犯下了这个禁忌。我的想法,也是我在许多其他应用程序中看到的想法,是让一些组件以恒定的速度不断移动,比如一个在屏幕上不断旋转的条。有了这样一个工具,如果开发人员正在工作,并且意外地在UI线程上做了一些计算上比他预期的更困难的事情,这个旋转条将变得不稳定,这向他表明,当他进行功能测试时,他需要实现一些机制,这

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

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

对这段代码的一个奇怪的要求是,它应该在生产构建中完全不存在,并且只存在于开发构建中,因为它不是用户的小部件,而是开发人员的小部件

我跳入画布对象并编写了一个快速组件,该组件只需旋转一个蓝绿色条。其思想是,如果在UI线程上转储了一个大作业,则该条将停止旋转(因为FX作业队列不会继续调度),该条将向前跳转,而不是平滑地旋转(就像程序静止时那样)

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

(请注意teal条,如果您看到我们的应用程序正在运行,它将缓慢但稳定地旋转——希望是这样)

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

Scene
    RootComponent
        Content

以这种方式修改场景图会产生诸如首选高度、鼠标事件和(可能)任何数量的其他事件,这些事件会被分派到微调器而不是内容组件

当然,当我们开始制作时,我希望将原始场景图放在我们提供给用户的版本中

所以我的问题是:我应该如何着手纠正这些问题

当它们出现时,我可以逐个跟踪它们,编写大量自定义代码来执行以下操作

obnoxiousPane.prefHeightProperty().bind(content.prefHeightProperty)
obnoxiousPane.prefWidthProperty()//...
spinner.setMouseTransparent(true)
spinner.setOtherEventsIProbablyCantEnumerateWithoutSeriousResearchTransparent(true)
或者我可以尝试通过反射来解决这个问题,尝试将内容窗格中的每个属性绑定到相应的讨厌窗格属性,但这似乎是一个bug滋生地

或者。。。什么?我希望有一些
轻量级的
组件或
ImNotReallyHereProperty
,我可以利用它们来添加这个开发辅助工具


谢谢你的帮助

你的方法似乎有根本缺陷。您不应该暂停JavaFX应用程序线程

相反,您应该拥有一个并发流程,并在流程开始、进展和完成时根据需要更新UI

参见此,了解此类替代方法的示例



如果要在一段时间内禁用UI的某些部分,则节点具有一个可设置的禁用属性。你可以使用CSS设置一个禁用节点的样式,这样用户就可以知道该节点并不是挂起的,而是故意禁用的。

当你说
大任务被转储到UI线程上时
,你的意思是你在UI线程上做所有的数据处理吗?我的意思是可能有人犯了这样的错误,是的,我完全知道这是一种实践。我在这里要问的是如何实现工具,以便我的团队在挂起UI时能够获得一些反馈。我意识到我的措辞过于口语化。我已经更新了前几段,试图以一种更清晰的方式让大家了解我的问题。
obnoxiousPane.prefHeightProperty().bind(content.prefHeightProperty)
obnoxiousPane.prefWidthProperty()//...
spinner.setMouseTransparent(true)
spinner.setOtherEventsIProbablyCantEnumerateWithoutSeriousResearchTransparent(true)