在JavaFX中输入文本TextField会冻结应用程序

时间:2018-06-13 09:42:59

标签: java javafx javafx-8

在我们的JavaFX应用程序中,不同的客户在TextField中输入文本时或多或少偶尔会出现以下错误。结果,渲染框架似乎遇到了无限循环,其中下面的错误被重复打印到系统控制台中。从那里,应用程序完全冻结,必须被杀死并重新启动,这对于那些客户来说是一个完整的showstopper。

此处不涉及线程问题(Fx和工作线程)。

该错误发生在Windows 7和10,Java 1.8.0_171中,但我记得它也出现在以前的Java版本中:

Exception in thread "JavaFX Application Thread"
java.lang.ArrayIndexOutOfBoundsException: -1
            at java.util.ArrayList.elementData(Unknown Source)
            at java.util.ArrayList.get(Unknown Source)
            at com.sun.javafx.collections.ObservableListWrapper.get(ObservableListWrapper.java:89)
            at com.sun.javafx.collections.VetoableListDecorator.get(VetoableListDecorator.java:306)
            at javafx.scene.Parent.updateCachedBounds(Parent.java:1591)
            at javafx.scene.Parent.recomputeBounds(Parent.java:1535)
            at javafx.scene.Parent.impl_computeGeomBounds(Parent.java:1388)
            at javafx.scene.layout.Region.impl_computeGeomBounds(Region.java:3078)
            at javafx.scene.Node.updateGeomBounds(Node.java:3579)
            at javafx.scene.Node.getGeomBounds(Node.java:3532)
            at javafx.scene.Node.computeLocalBounds(Node.java:3595)
            at javafx.scene.Node.updateLocalBounds(Node.java:3625)
            at javafx.scene.Node.getLocalBounds(Node.java:3486)
            at javafx.scene.Node.updateTxBounds(Node.java:3643)
            at javafx.scene.Node.getTransformedBounds(Node.java:3426)
            at javafx.scene.Node.updateBounds(Node.java:559)
            at javafx.scene.Parent.updateBounds(Parent.java:1719)
            at javafx.scene.Parent.updateBounds(Parent.java:1717)
            at javafx.scene.Parent.updateBounds(Parent.java:1717)
            at javafx.scene.Parent.updateBounds(Parent.java:1717)
            at javafx.scene.Parent.updateBounds(Parent.java:1717)
            at javafx.scene.Parent.updateBounds(Parent.java:1717)
            at javafx.scene.Parent.updateBounds(Parent.java:1717)
            at javafx.scene.Parent.updateBounds(Parent.java:1717)
            at javafx.scene.Parent.updateBounds(Parent.java:1717)
            at javafx.scene.Parent.updateBounds(Parent.java:1717)
            at javafx.scene.Parent.updateBounds(Parent.java:1717)
            at javafx.scene.Parent.updateBounds(Parent.java:1717)
            at javafx.scene.Parent.updateBounds(Parent.java:1717)
            at javafx.scene.Parent.updateBounds(Parent.java:1717)
            at javafx.scene.Parent.updateBounds(Parent.java:1717)
            at javafx.scene.Parent.updateBounds(Parent.java:1717)
            at javafx.scene.Parent.updateBounds(Parent.java:1717)
            at javafx.scene.Parent.updateBounds(Parent.java:1717)
            at javafx.scene.Parent.updateBounds(Parent.java:1717)
            at javafx.scene.Parent.updateBounds(Parent.java:1717)
            at javafx.scene.Parent.updateBounds(Parent.java:1717)
            at javafx.scene.Parent.updateBounds(Parent.java:1717)
            at javafx.scene.Parent.updateBounds(Parent.java:1717)
            at javafx.scene.Parent.updateBounds(Parent.java:1717)
            at javafx.scene.Scene$ScenePulseListener.pulse(Scene.java:2404)
            at com.sun.javafx.tk.Toolkit.lambda$runPulse$29(Toolkit.java:398)
            at java.security.AccessController.doPrivileged(Native Method)
            at com.sun.javafx.tk.Toolkit.runPulse(Toolkit.java:397)
            at com.sun.javafx.tk.Toolkit.firePulse(Toolkit.java:424)
            at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:518)
            at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:498)
            at com.sun.javafx.tk.quantum.QuantumToolkit.pulseFromQueue(QuantumToolkit.java:491)
            at com.sun.javafx.tk.quantum.QuantumToolkit.lambda$runToolkit$403(QuantumToolkit.java:319)
            at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
            at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
            at com.sun.glass.ui.win.WinApplication.lambda$null$147(WinApplication.java:177)
            at java.lang.Thread.run(Unknown Source)

对我来说,这显然是Parent.java:1591中的编程错误,因为remainingDirtyNodes似乎与dirtyNodes列表不同步,但是没有对dirtyNodes进行边界检查,导致ArrayIndexOutOfBoundsException。

有没有解决方法呢?

谢谢,彼得

PS:除此之外,JavaFX似乎运行得非常稳定,并且使用它很有趣。

1 个答案:

答案 0 :(得分:2)

这是一个与“从场景图中删除节点”相关的错误

它仍然没有修复,计划在Open JFX 11中发布。我不确定你什么时候可以期待发布,因为JavaFX正在从JDK中分离出来,而且这个问题已经开放了两年了。

故障单包含一个最小的示例,因此您可能希望的最好的方法是找到操作场景图的方法的相关性并解决问题。

请参阅:https://bugs.openjdk.java.net/browse/JDK-8163078