绕过java.awt.Container.createHierarchyEvents中的IndexOutOfBoundsException

绕过java.awt.Container.createHierarchyEvents中的IndexOutOfBoundsException,java,swing,Java,Swing,我有以下问题。我需要使用一些第三方Swing组件,这些组件我无法更改,也不会对其产生影响。但是,在我们的情况下,一个UI组件会导致以下问题,之后它将不再可用: Uncaught exception in thread Thread[AWT-EventQueue-0,6,main]: java.lang.IndexOutOfBoundsException: Index: 1, Size: 1 at java.util.ArrayList.rangeCheck(A

我有以下问题。我需要使用一些第三方Swing组件,这些组件我无法更改,也不会对其产生影响。但是,在我们的情况下,一个UI组件会导致以下问题,之后它将不再可用:

    Uncaught exception in thread Thread[AWT-EventQueue-0,6,main]: 
     java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
        at java.util.ArrayList.rangeCheck(ArrayList.java:653) ~[na:1.8.0_20]
        at java.util.ArrayList.get(ArrayList.java:429) ~[na:1.8.0_20]
        at java.awt.Container.createHierarchyEvents(Container.java:1439) ~[na:1.8.0_20]
        at java.awt.Container.createHierarchyEvents(Container.java:1439) ~[na:1.8.0_20]
        at java.awt.Container.createHierarchyEvents(Container.java:1439) ~[na:1.8.0_20]
        at java.awt.Container.createHierarchyEvents(Container.java:1439) ~[na:1.8.0_20]
        at java.awt.Component.hide(Component.java:1701) ~[na:1.8.0_20]
        at java.awt.Window.hide(Window.java:1117) ~[na:1.8.0_20]
        at javax.swing.Popup.hide(Popup.java:125) ~[na:1.8.0_20]
        at javax.swing.PopupFactory$HeavyWeightPopup.hide(PopupFactory.java:474) ~[na:1.8.0_20]
        at javax.swing.JPopupMenu.setVisible(JPopupMenu.java:796) ~[na:1.8.0_20]
        at some.3rd.party.library.Component
编辑: 有趣的是,如果我们将
HierarchyEventListener
添加到工具箱中(通过
Toolkit.getDefaultToolkit().addAWTEventListener(我们的,AWTEvent.HIERARCHY\u EVENT\u MASK);
),组件才会导致此异常。。。这似乎是一个罕见的用例。否则,
java.awt.Container
中引发此异常的代码根本不会被调用

一些互联网研究表明,根本原因是组件在EventQueue线程之外被修改(来自组件内的一些代码!),但我认为可以排除这种可能性

由于我无法访问UI组件的代码(而且无论如何也不知道问题是从哪里产生的),我建议的解决方案是使用java bootclasspath选项或javaagent技术来修改
java.awt.Container
类,并基本上用try-catch块围绕
createHierarchyEvents
。老实说,我不关心例外情况,只要组件仍然可以使用

问题发生在Win和Mac上,L&F似乎也没有什么不同。然而,问题是不确定的,这意味着它有时会在第二次或第三次尝试时发生


有什么想法吗?建议,如何进行?这是个好主意吗?选择?谢谢你的意见

我知道这很古老,但我在研究类似的异常时发现了这个问题

我按照要求在EDT上做所有事情,所有有问题的组件都是我的。没有第三方代码可以指指点点

事实证明,我们遇到了这样一种情况:一个HierarchyListener对隐藏的组件做出响应。该操作的一部分是通过removeHierarchyListener()将自己从进一步侦听中移除

这破坏了Container.createHierarchyEvents(此异常的源)中的代码。我们的解决方案是通过调用器延迟侦听器清理


从表面上看,这听起来像是一个明显的陷阱,但我在任何地方都找不到这样的记录:“在处理事件时不要添加/删除侦听器”。

一些互联网研究表明,根本原因是组件在EventQueue线程之外被修改了
-然后确保代码在EDT上执行,通过将使用该组件的代码包装在
SwingUtilities.invokeLater(..)
@camickr中,感谢您的提示,但问题代码存在于组件内部——换句话说:不是我们的代码在EDT线程之外修改组件。好吧,我只是建议人们通常不会发布这样的组件“总是“导致异常,因此我猜测问题在于您如何使用/调用组件的上下文。也许您是从非EDT线程调用该组件的?因此唯一性是HierarchyEventListener,因此我建议您在该侦听器中调用的任何代码都应该包装在SwingUtilities.invokeLater()中。有些组件在EDT的末尾放置事件,因此您的代码现在可以在这些事件的中间执行,因此当代码执行时,组件不处于最终状态。这是我最后的建议,祝你好运。其他的L&F会怎么样?