0

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)
    ...

数日解決しようとしていますが、何が悪いのかわかりません。このエラーは、いくつかのタブを開いてランダムに閉じたときにのみ発生します。だから例えば。1、2、3 の 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 インスタンスがあります。別のタブが選択されると、このパネルが取得され、メインフレームの currentPanel として設定されます。この例外は、以前のように私の GUI を壊すことはありませんが、私はそれを取り除きたいと思っています。

4

1 に答える 1

1

タブが3つある場合

| | タブ 0 | タブ 1 | タブ 2 |

タブ 1 を削除すると、タブ 2 のインデックスは 1 になりますIndexOutOfBoundsException

タブ付きペインのインデックスではなく、タブ項目への参照をリスナーに渡します。

于 2013-03-09T15:16:51.920 に答える