java - JTabbedPane - ArrayIndexOutOfBoundsException

标签 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();
        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 行。这是我的 stateChanged 监听器:

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

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

最佳答案

如果您有三个选项卡

|选项卡 0 |选项卡 1 |选项卡 2 |

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

将对选项卡项的引用(而不是其在选项卡式 Pane 上的索引)传递给监听器。

关于java - JTabbedPane - ArrayIndexOutOfBoundsException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15312252/

相关文章:

java - 从 Google App Engine 请求 header 获取时区偏移量?

java - UndoManager 手动添加 UndoableEdit 以使其与 JTabbedPane 一起使用

java - JTabbedPane ChangeListener

java - JTabbedPane 正在读取击键并切换选项卡

java - 如何检查一个jframe是否打开?

java - Spring 4 和 Hibernate 5 方法参数验证

java - 奇怪的分析结果 : definitely non-bottleneck method pops up

java - 如何添加@NotNull注解的运行时处理

Java 子串 endindex-1

java - 禁用 Jtabbedpane 中的选项卡时,该选项卡的外观和感觉没有变化