摆动JTabbedPane的抛出IndexOutOfBoundsException异常,同时填补了(

2019-07-30 12:51发布

我有几个组件的应用程序。 其中之一是一个JTabbedPane与它(显然)其他的东西。 我只能通过这种吸访问此窗格:

public JTabbedPane getPlotTabbedPane() {
    if (plotTabs == null) {
        plotTabs = new JTabbedPane();
        plotTabs.setFocusable(false);

        plotTabs.add("Measurement", getPlotPanel());
        plotTabs.add("Time", getPlotPanel().getTimePanel());
        plotTabs.add("Data", getPlotPanel().getDataPanel());
        plotTabs.add("Statistics", getPlotPanel().getStatisticsPanel());
        plotTabs.addChangeListener(new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent e) {
                getPlotPanel().refreshRenderer();
            }
        });
    }
    return plotTabs;
}

于是,我第一次访问它(即尚未创建时),我创建它,所有的其他时间,我只给回已经创建JTabbedPane 。 我已经告诉我,这是不是最好的技术(如果有人能告诉我一个更好的一个不弄乱布局组成的代码,我给的建议非常开放)。

现在,这部作品在完美的罚款 - 假设 - 的情况下(应用程序启动)99%。 在1%,我得到一个

Exception in thread "Thread-0" java.lang.ArrayIndexOutOfBoundsException: -1
    at java.util.Vector.elementAt(Vector.java:430)
    at javax.swing.JTabbedPane.getTitleAt(JTabbedPane.java:1091)
    at javax.swing.plaf.basic.BasicTabbedPaneUI$Handler.updateHtmlViews(BasicTabbedPaneUI.java:3564)
    at javax.swing.plaf.basic.BasicTabbedPaneUI$Handler.componentAdded(BasicTabbedPaneUI.java:3699)
    at java.awt.Container.processContainerEvent(Container.java:2065)
    at java.awt.Container.processEvent(Container.java:2036)
    at java.awt.Component.dispatchEventImpl(Component.java:4653)
    at java.awt.Container.dispatchEventImpl(Container.java:2097)
    at java.awt.Component.dispatchEvent(Component.java:4481)
    at java.awt.Container.addImpl(Container.java:1083)
    at javax.swing.JTabbedPane.insertTab(JTabbedPane.java:703)
    at javax.swing.JTabbedPane.addTab(JTabbedPane.java:777)
    at javax.swing.JTabbedPane.add(JTabbedPane.java:814)
    at companyname.product.gui.Tab.getPlotTabbedPane(Tab.java:386)
    at companyname.product.gui.Tab.getFullPlotPanel(Tab.java:374)
    at companyname.product.gui.Tab.initComponents(Tab.java:262)
    at companyname.product.gui.Tab.<init>(Tab.java:80)

我不会再进一步​​往下走栈,但这基本上是GUI的创建。 Tab是一个扩展JPanel 。 我真的不能弄清楚,是什么问题,也没有人知道我能做些什么来防止它。 很显然,我可以换Tab.java线386在try/catch ,但这并没有解决问题,它只是解决了症状......

所以,你知道是什么问题,如何解决,否则我应该怎么做的东西?

Answer 1:

堆栈跟踪似乎在暗示你从另一个线程则在事件指派线程(EDT)访问Swing组件。 这是不允许的。

我敢肯定,如果你确保你只能访问Swing组件从正确的线程,你不会看到这个异常了。

更多信息可以在找到在Swing并发教程。 您还可以看看这篇文章 ,其含有RepaintManager ,它可以帮助您检测Swing线程违规



文章来源: Swing JTabbedPane throws IndexOutOfBoundsException while filling up