简体   繁体   English

JavaFX抛出ArrayIndexOutOfBoundsException

[英]JavaFX throws ArrayIndexOutOfBoundsException

I'm experimenting with JavaFX labels and Groups with moving them over the screen by mouse dragging. 我正在尝试使用JavaFX标签和群组,通过鼠标拖动将它们移动到屏幕上。 New nodes are added to the animation group from some Threads. 一些线程将新节点添加到动画组中。 However, sometimes I see the following exception out of the sudden - I assume, when some nodes are overlapping. 但是,有时我突然看到以下异常 - 我假设某些节点重叠。 But I don't know what the problem is... because my code is not involved. 但我不知道问题是什么...因为我的代码没有涉及。 Does anybody know this exception and root cause (using JDK 1.8.0.-112)? 有没有人知道这个异常和根本原因(使用JDK 1.8.0.-112)? Thanks 谢谢

'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]

I assume, it has something to do with the Label (=BorderPane) adding method. 我假设它与Label(= BorderPane)添加方法有关。 I introduced it to shorten the Java FX Application thread processing time. 我介绍它是为了缩短Java FX Application的线程处理时间。 Is there a problem with that? 这有问题吗?

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");
}

thanks for all your help. 感谢你的帮助。 The code above "processBacklogGroupList" is actually correct and works... (so why -1..?) “processBacklogGroupList”上面的代码实际上是正确的并且有效......(为什么-1 ..?)

The problem was in a totally different place, where an animation was defined not running in JFX Application Thread - but exception occured a bit later. 问题出现在一个完全不同的地方,其中定义的动画未在JFX应用程序线程中运行 - 但稍后发生了异常。

So thanks to @sillyfly for pointing me to the real problem 感谢@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. 当尝试从JavaFX UI线程以外的线程更改绑定到节点的ObservableList时,或者在更改期间操作列表时,通常会发生这种情况。 In both cases usually wrapping the offending call in a Platform.runLater solves the problem. 在这两种情况下,通常将违规调用包装在Platform.runLater中解决了这个问题。 See eg this related question. 参见例如这个相关问题。 – sillyfly Jun 27 at 10:03" - sillyfly Jun 27 at 10:03“

我有这个问题,它是由Platform.runLater(() - > {//你的代码})决定的;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM