当前位置: 首页 > 面试题库 >

摆动JTabbedPane填满时抛出IndexOutOfBoundsException

澹台奇略
2023-03-14
问题内容

我有一个包含多个组件的应用程序。其中之一是JTabbedPane带有其他内容的(显然)。我 只能 通过此getter 访问此窗格:

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,但这不能解决问题,而只能解决症状…

那么,您知道问题出在哪里,如何解决或应该怎么做?


问题答案:

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

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

可以在Swing的并发教程中找到更多信息。您还可以查看本文,其中包含RepaintManager可以帮助您检测到Swing线程违规的文章。



 类似资料:
  • 我在Swing和设置角色动画方面有一些问题,我有一个带有关键侦听器的JFrame,当用户点击时,它在这里调用我的JPanel方法 这个动画我的角色,但这么快,我们可以看到一个东西,我怎么才能看到动画?

  • 在我试图建立的测试中,在实现Cucumber时遇到了一些问题。以此为指导,成功地获得了测试工作Selenium:https://medium . com/@ cbuelvasc/test-automation-in-kotlin-with-Selenium-TestNG-and-page-object-model-e 2252 DBC 492 a 当我尝试在其上添加功能以及步骤定义时 - 它抱怨p

  • 问题内容: 我在游戏中使用了摇摆计时器,但是当游戏运行时,它似乎有平稳运行的时刻和减速的时刻。 为什么时间在波动? 我该如何解决? 这是我的代码示例。在我的实际程序中,我正在绘制图像,而不仅仅是矩形。还有很多碰撞检测和其他小的计算正在发生。 另外,这是游戏的Jar文件的链接,因此您可以运行它,(满是)明白我的意思。http://dl.dropbox.com/u/8724803/Get%20To%2

  • 问题内容: 我在网页上使用径向渐变作为背景,如下所示: 它可以工作,但是当内容不能填满整个页面时,渐变会被切断。如何使元素始终填充整个页面? 问题答案:

  • rank ▲ ✰ vote url 69 352 48 520 url 手动抛出异常 我想故意制造一个错误,所以我可以转到excepy:语句 我怎么做? 不能在Pythonic了; raise Exception("I know python!") 想得到更多信息,看这里

  • 我觉得摇摆计时器有问题。我写了一些运行良好的代码,然后将其全部移动到我的新计算机上,但它很快就无法工作。我用这个方法编写了一个GUI类(基于JFrame): 该方法是从另一个类调用的。真是太夸张了。splash guy是一个只运行splash动画的JPanel类。它通过摆动计时器来实现。在splash类中,侦听器通过以下代码调整我的帧的内容: 现在,如果第一个块中的print语句被注释掉,我的程序