java - Swing JTabbedPane 在填充时抛出 IndexOutOfBoundsException

标签 java swing exception jtabbedpane

我有一个包含多个组件的应用程序。其中之一是 JTabbedPane,其中包含其他内容(很明显)。我通过这个 getter 访问这个 Pane :

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 中,但这并没有解决问题,它只是解决了症状......

那么,您知道问题是什么吗?我该如何解决或我应该怎么做?

最佳答案

堆栈跟踪似乎建议您从另一个线程访问 Swing 组件,然后是事件调度线程 (EDT)。这是不允许的。

我敢肯定,如果您确保只从正确的线程访问 Swing 组件,您将不会再看到此异常。

更多信息可以在 Concurrency in Swing 中找到教程。你也可以看看this article其中包含一个 RepaintManager,它可以帮助您检测 Swing 线程违规

关于java - Swing JTabbedPane 在填充时抛出 IndexOutOfBoundsException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11579556/

相关文章:

java - 如何通过套接字读取/写入二维字符数组?

java - 使用for循环从数据库检索数据

java - JFrame/JPanel 中的 GridLayout 被挤压在一起

C# 最终执行时间

java - 抛出自定义异常时如何动态确定方法签名?

c# - x64 和 x32 中的不同行为展开堆栈

java - 逐行读取并对输入进行标记?

java - Vertx3 - 从 JDBC 连接返回值? (sql 数据库)。

java - 如何运行用 Jython 编写的 SWING 应用程序?

java - 从另一个类禁用 JButton