首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JTabbedPane - ArrayIndexOutOfBoundsException

JTabbedPane - ArrayIndexOutOfBoundsException
EN

Stack Overflow用户
提问于 2013-03-09 15:13:22
回答 1查看 1.9K关注 0票数 0

Im动态地添加和删除JTabbedPane中的制表符。代码:

代码语言:javascript
复制
     //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);
            }
        });
    }
}

这就是密码。当切换时,移除制表符我得到以下错误:

代码语言:javascript
复制
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的解决方案修改了我的代码,现在我得到了以下例外:

代码语言:javascript
复制
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侦听器:

代码语言:javascript
复制
   private class ChangeHandler implements ChangeListener {
        @Override
        public void stateChanged(ChangeEvent ev) {
            currentPanel = (MainPanel) tabbed.getComponentAt(tabbed.getSelectedIndex());
        }
    }

每个选项卡都有MainPanel实例。当选择另一个选项卡时,我会得到这个面板,并将其设置为currentPanel in MainFrame。这个异常并没有像以前那样破坏我的GUI,但是我想摆脱它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-09 15:16:51

如果你有三个标签

\x=.

如果删除选项卡1,则选项卡2索引将为1。这就是您获得IndexOutOfBoundsException的原因。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15312252

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档