Java JTabbedPane-ArrayIndexOutOfBoundsException

Java JTabbedPane-ArrayIndexOutOfBoundsException,java,jtabbedpane,Java,Jtabbedpane,即时消息动态添加和删除JTabbedPane中的选项卡。代码: //Method which adds new tab private void addTab(String title, MainPanel panel) { tabbed.addTab(title, panel); int index = tabbed.indexOfComponent(panel); JPanel tabPanel = new JPanel

即时消息动态添加和删除JTabbedPane中的选项卡。代码:

     //Method which adds new tab  
     private void addTab(String title, MainPanel panel) {
        tabbed.addTab(title, panel);
        int index = tabbed.indexOfComponent(panel);
        JPanel tabPanel = new JPanel();
        tabPanel.setOpaque(false);
        tabPanel.add(panel.getLabel());
        JButton closeButton = new JButton(new CloseTabAc(index));
        tabPanel.add(closeButton);
        panel.getLabel().setText(title);
        tabbed.setTabComponentAt(index, tabPanel);
        tabbed.setSelectedIndex(index);
        currentPanel = panel;
    }

//Action to close tab
private class CloseTabAc extends AbstractAction {

    private int tabNum;

    CloseTabAc(int tabNum) {
        putValue(Action.NAME, "x");
        this.tabNum = tabNum;
    }

    @Override
    public void actionPerformed(ActionEvent ev) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                MainPanel panel = (MainPanel) tabbed.getComponentAt(tabNum);
                tabbed.remove(tabNum);
            }
        });
    }
}
这就是代码。切换、删除选项卡时,会出现以下错误:

Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
    at java.util.ArrayList.rangeCheck(ArrayList.java:604)
    at java.util.ArrayList.get(ArrayList.java:382)
    at javax.swing.JTabbedPane.getComponentAt(JTabbedPane.java:1224)
    at jnotepad.MainFrame$CloseTabAc$1.run(MainFrame.java:247)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:727)
    at java.awt.EventQueue.access$200(EventQueue.java:103)
    at java.awt.EventQueue$3.run(EventQueue.java:688)
    at java.awt.EventQueue$3.run(EventQueue.java:686)
    at java.security.AccessController.doPrivileged(Native Method)
    ...
我想用几天的时间来解决这个问题,但我不知道出了什么问题。我看到的唯一一个错误发生在我打开几个选项卡并随机关闭它们的情况下。我打开了3个标签:1、2和3。如果我按顺序关闭它们:3,2,1,我会得到异常,但一切都关闭了。但当我尝试按顺序关闭它们时:3、1、2,然后3将关闭,但在1时将抛出异常,并且它现在或之后不会关闭。所以请帮我解决我的问题

编辑:我根据Jean的解决方案修改了代码,现在出现以下异常:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1
    at java.util.ArrayList.elementData(ArrayList.java:371)
    at java.util.ArrayList.get(ArrayList.java:384)
    at javax.swing.JTabbedPane.getComponentAt(JTabbedPane.java:1224)
    at jnotepad.MainFrame$ChangeHandler.stateChanged(MainFrame.java:228)
    at javax.swing.JTabbedPane.fireStateChanged(JTabbedPane.java:416)
    at javax.swing.JTabbedPane$ModelListener.stateChanged(JTabbedPane.java:270)
    ...
第228行似乎有例外。这是我的状态更改侦听器:

   private class ChangeHandler implements ChangeListener {
        @Override
        public void stateChanged(ChangeEvent ev) {
            currentPanel = (MainPanel) tabbed.getComponentAt(tabbed.getSelectedIndex());
        }
    }
每个选项卡中都有MainPanel实例。当选择另一个选项卡时,我得到这个面板,并将其设置为大型机中的currentPanel。此异常不会像前一个一样破坏我的GUI,但我想摆脱它。

如果您有三个选项卡

|表0 |表1 |表2|

如果删除选项卡1,则选项卡2索引将为1。这就是为什么您会得到一个
索引outofboundsexception


向侦听器传递对选项卡项的引用,而不是其在选项卡窗格上的索引。

谢谢它的帮助,但现在有另一个例外(查看我的编辑)。是什么原因造成的?看起来侦听器是从您删除的选项卡调用的,但尚未选择任何选项卡。尝试检查tabbed.getSelectedIndex()是否返回范围为(>=0且<选项卡窗格大小)的值。如果它不起作用,把你的代码放在这里。。。