gpt4 book ai didi

JavaFX 抛出 ArrayIndexOutOfBoundsException

转载 作者:搜寻专家 更新时间:2023-11-01 03:17:23 29 4
gpt4 key购买 nike

我正在试验 JavaFX 标签和组,通过鼠标拖动将它们移动到屏幕上。新节点从一些线程添加到动画组。但是,有时我会突然看到以下异常 - 我假设,当某些节点重叠时。但是不知道是什么问题……因为不涉及我的代码。有人知道这个异常和根本原因(使用 JDK 1.8.0.-112)吗?谢谢

'JavaFX Application Thread' lambda$main$68 - Thread[JavaFX Application Thread,5,main] threw an uncaught exception: java.lang.ArrayIndexOutOfBoundsException: -1
at java.util.ArrayList.elementData(ArrayList.java:418) ~[?:1.8.0_112]
at java.util.ArrayList.get(ArrayList.java:431) ~[?:1.8.0_112]
at com.sun.javafx.collections.ObservableListWrapper.get(ObservableListWrapper.java:89) ~[jfxrt.jar:?]
at com.sun.javafx.collections.VetoableListDecorator.get(VetoableListDecorator.java:306) ~[jfxrt.jar:?]
at javafx.scene.Parent.updateCachedBounds(Parent.java:1591) ~[jfxrt.jar:?]
at javafx.scene.Parent.recomputeBounds(Parent.java:1535) ~[jfxrt.jar:?]
at javafx.scene.Parent.impl_computeGeomBounds(Parent.java:1388) ~[jfxrt.jar:?]
at javafx.scene.layout.Region.impl_computeGeomBounds(Region.java:3078) ~[jfxrt.jar:?]
at javafx.scene.Node.updateGeomBounds(Node.java:3579) ~[jfxrt.jar:?]
at javafx.scene.Node.getGeomBounds(Node.java:3532) ~[jfxrt.jar:?]
at javafx.scene.Node.getLocalBounds(Node.java:3480) ~[jfxrt.jar:?]
at javafx.scene.Node.updateTxBounds(Node.java:3643) ~[jfxrt.jar:?]
at javafx.scene.Node.getTransformedBounds(Node.java:3426) ~[jfxrt.jar:?]
at javafx.scene.Parent.getChildTransformedBounds(Parent.java:1732) ~[jfxrt.jar:?]
at javafx.scene.Parent.updateCachedBounds(Parent.java:1596) ~[jfxrt.jar:?]
at javafx.scene.Parent.recomputeBounds(Parent.java:1535) ~[jfxrt.jar:?]
at javafx.scene.Parent.impl_computeGeomBounds(Parent.java:1388) ~[jfxrt.jar:?]
at javafx.scene.Node.updateGeomBounds(Node.java:3579) ~[jfxrt.jar:?]
at javafx.scene.Node.getGeomBounds(Node.java:3532) ~[jfxrt.jar:?]
at javafx.scene.Node.getLocalBounds(Node.java:3480) ~[jfxrt.jar:?]
at javafx.scene.Node.impl_intersectsBounds(Node.java:5015) ~[jfxrt.jar:?]
at javafx.scene.Parent.impl_pickNodeLocal(Parent.java:705) ~[jfxrt.jar:?]
at javafx.scene.Node.impl_pickNode(Node.java:4914) ~[jfxrt.jar:?]
at javafx.scene.Scene$MouseHandler.pickNode(Scene.java:3899) ~[jfxrt.jar:?]
at javafx.scene.Scene$MouseHandler.access$1600(Scene.java:3485) ~[jfxrt.jar:?]
at javafx.scene.Scene.pick(Scene.java:1942) ~[jfxrt.jar:?]
at javafx.scene.Scene.access$6700(Scene.java:159) ~[jfxrt.jar:?]
at javafx.scene.Scene$MouseHandler.process(Scene.java:3799) ~[jfxrt.jar:?]
at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485) ~[jfxrt.jar:?]
at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762) ~[jfxrt.jar:?]
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494) ~[jfxrt.jar:?]
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:381) ~[jfxrt.jar:?]
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295) ~[jfxrt.jar:?]
at java.security.AccessController.doPrivileged(Native Method) ~[?:1.8.0_112]
at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$354(GlassViewEventHandler.java:417) ~[jfxrt.jar:?]
at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389) ~[jfxrt.jar:?]
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:416) ~[jfxrt.jar:?]
at com.sun.glass.ui.View.handleMouseEvent(View.java:555) ~[jfxrt.jar:?]
at com.sun.glass.ui.View.notifyMouse(View.java:937) ~[jfxrt.jar:?]
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) ~[jfxrt.jar:?]
at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191) ~[jfxrt.jar:?]
at java.lang.Thread.run(Thread.java:745) [?:1.8.0_112]

我想,它与Label(=BorderPane)添加方法有关。我引入它是为了缩短 Java FX 应用程序线程处理时间。这有什么问题吗?

private Queue<BacklogGroupAction> todoList = new ConcurrentLinkedQueue<>();

class BacklogGroupAction {
boolean add;
boolean visibleState;
BorderPane dv;

public BacklogGroupAction(boolean add, boolean visibleState, BorderPane dv) {
this.add = add;
this.visibleState = visibleState;
this.dv = dv;
}

}

private synchronized void processBacklogGroupList() {
if (Platform.isFxApplicationThread()) {
while (!todoList.isEmpty()) {
BacklogGroupAction p = todoList.poll();
if (p.add) {
p.dv.setVisible(p.visibleState);
backlogGroup.getChildren()
.add(p.dv);
} else
backlogGroup.getChildren()
.remove(p.dv);
}
backlogGroup.applyCss();
backlogGroup.layout();
} else
logger.error("This is not FX Application Thread");
}

最佳答案

感谢您的帮助。“processBacklogGroupList”上面的代码实际上是正确的并且有效...(那么为什么是 -1..?)

问题出现在一个完全不同的地方,其中定义的动画未在 JFX 应用程序线程中运行 - 但稍后发生了异常。

感谢@sillyfly 指出了真正的问题

This usually happens when trying to change an ObservableList bound to a node from a thread other than the JavaFX UI thread, or else when manipulating the list during a change. In both cases usually wrapping the offending call in a Platform.runLater solves the problem. See e.g. this related question. – sillyfly Jun 27 at 10:03"

关于JavaFX 抛出 ArrayIndexOutOfBoundsException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44777257/

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