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 を壊すことはありませんが、私はそれを取り除きたいと思っています。