2013-03-09 95 views
0

我添加和删除JTabbedPane中的标签动态。代码:JTabbedPane - ArrayIndexOutOfBoundsException

 //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个异常,并且现在或之后都不会关闭。所以请帮我解决我的问题。

编辑:我根据吉恩的解决方案修改了代码,现在我得到的异常以下:

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这是我的stateChanged听众:

private class ChangeHandler implements ChangeListener { 
     @Override 
     public void stateChanged(ChangeEvent ev) { 
      currentPanel = (MainPanel) tabbed.getComponentAt(tabbed.getSelectedIndex()); 
     } 
    } 

每标签中有MainPanel实例。当选择另一个选项卡时,我得到此面板并将其设置为MainFrame中的currentPanel。这个异常并没有像以前那样破坏我的GUI,但是我喜欢去掉它。

回答

1

如果您有三个标签

|选项卡0 |选项卡1 |标签2 |

如果你删除标签1,标签2的索引将为1.这就是为什么你得到一个IndexOutOfBoundsException

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

+0

感谢它帮助,但现在有另一个例外(看看我的编辑)。什么会导致它? – user2102972 2013-03-09 15:33:46

+0

看起来像是从您移除的标签中调用了监听器,并且尚未选择任何选项卡。尝试检查tabbed.getSelectedIndex()是否返回范围(> = 0和 2013-03-09 16:53:25