gpt4 book ai didi

java - 使用 JTabbedPane 时抛出异常

转载 作者:行者123 更新时间:2023-11-29 08:18:08 24 4
gpt4 key购买 nike

我在我的应用程序中使用了 JTabbedPane,我使用 ChangeListener 监听它的变化,这样我就可以知道当前选择了哪个选项卡。所以我的 stateChanged 方法是;

public void stateChanged(ChangeEvent e) {
currentPageIndex = jTabbedPane.getSelectedIndex();
}

但是当我向 JTabbedPane 添加新选项卡时,它会在上面的方法中抛出 ArrayIndexOutOfBoundsException,我不知道为什么。对于类似的情况,有人建议这是一个错误 http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4873983 ,但正如您会看到的那样,解决方案是使用来自 EventDispatchThread 的 Swing。

这是什么意思,它们是指 SwingUtilities.invokeLater 吗?有人可以告诉我如何相应地修改我的 stateChanged 方法以避免异常吗?

编辑:下面是我的 addTab() 方法。这在程序开始时被多次调用,它“有时”会触发 stateChanged() 方法。在某些时候 stateChanged() 会导致异常。到目前为止,这就是我从调试器中可以看出的内容。我知道这似乎不太清楚,所以如果你以前没有听说过这种事情,没关系,谢谢你的努力。但我认为这可能与我在上面提供的链接有关。

void addTab(EJournal eJournalModel,int index, String pageName) {
SectionPage newPage = new SectionPage(jTabbedPane.getSize(), controller, eJournalModel.getSections().get(currentPageIndex));
JScrollPane scrollPane = new JScrollPane(newPage);
scrollPanes.add(index, scrollPane);
sectionPages.add(index, newPage);
jTabbedPane.insertTab(pageName, idleIcon, scrollPane, null, index);
jTabbedPane.updateUI();
}

Edit2 :抛出此异常。在我的方法实际执行完毕并且 evertying 完成后,一个 actionPerformed() 被触发,然后是一大堆东西,然后是异常。

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0
at javax.swing.plaf.basic.BasicTabbedPaneUI.tabForCoordinate(BasicTabbedPaneUI.java:1488)
at javax.swing.plaf.basic.BasicTabbedPaneUI.setRolloverTab(BasicTabbedPaneUI.java:558)
at javax.swing.plaf.basic.BasicTabbedPaneUI.access$2000(BasicTabbedPaneUI.java:37)
at javax.swing.plaf.basic.BasicTabbedPaneUI$Handler.mouseEntered(BasicTabbedPaneUI.java:3604)
at java.awt.Component.processMouseEvent(Component.java:6272)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3255)
at java.awt.Component.processEvent(Component.java:6028)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4630)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
at java.awt.LightweightDispatcher.trackMouseEnterExit(Container.java:4363)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4220)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2475)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

最佳答案

最可能的答案是您正在从非 EDT 线程更改 Swing 中的某些内容。任何涉及 Swing 组件或 Swing 组件使用的模型的内容都必须在 EDT 上执行。这包括构建 Swing 对象和模型。

查找此类非 EDT 操作的最简单方法是使用 Substance 外观运行。转到 Substance web site然后单击“获取”。下载 Substance 和 Trident 库,将它们添加到类路径中,然后使用选项启动 JVM

-Dswing.defaultlaf=org.pushingpixels.substance.api.skin.SubstanceBusinessLookAndFeel

物质非常坚持在 EDT 上进行 Swing Action 。如果您在另一个线程中执行某些操作,它将抛出异常。最好的部分是,由于异常发生在派发任何事件之前,因此有问题的代码仍在堆栈中。这让您知道错误真正发生的位置,而不是尝试通过多个 pumpEvent 堆栈回溯。

注意: Substance 不能替代仔细编码。在某些情况下,它可能无法检测到模型的非 EDT 更改。物质只是让它变得更容易。

关于java - 使用 JTabbedPane 时抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2751502/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com