各タブに閉じるボタンを備えたタブ付きインターフェイスを Java で構築したいと考えています。そのために、次のクラスを使用しました: ButtonTabComponent
GUI に新しいタブを作成するボタンがあります。新しいタブ ボタンを 4 回押すと、4 つのタブが作成されます。
| | タブ 0 | タブ 1 | タブ 2 | タブ 3 | (各タブには閉じるボタンがあります)
ここで、タブ 1 を閉じることにしましたが、問題が発生します。中央のタブを閉じると、すべてのインデックスが並べ替えられます。つまり、次のことを意味します。
| | タブ 0 | タブ 2 | タブ 3 | (タブ 2 のインデックスは 1 になります)
ここで新しいタブを作成しようとすると、タブは作成されますが、新しいタブ:
| | タブ 0 | タブ 2 | タブ 3 | タブ 1| (タブ 1 には閉じるボタンがありません)
新しいタブをもう一度クリックすると、次のようになります。
| | タブ 0 | タブ 2 | タブ 3 | タブ 1 | タブ 4 | (タブ 4 で問題ありません。閉じるボタンがあります)
ここで、タブ 2 を閉じることにしました。次のようになります。
| | タブ 0 | タブ 3 | タブ 1| タブ 4| (タブ 3 のインデックスは 1 になります)
新しいタブを作成する場合:
| | タブ 0 | タブ 3 | タブ 1| タブ 4| タブ 1 | (最後のタブには閉じるボタンがありません)。
これはインデックスが原因であると考えており、同様の質問をスタックオーバーフローで読みました: stackoverflow.com/questions/15312252/jtabbedpane-arrayindexoutofboundsexception可能な解決策は
タブ付きペインのインデックスではなく、タブ項目への参照をリスナーに渡します。
その方法がわかりません。誰かに何かヒントがあれば、本当に感謝します。各タブはファイルを開き、ファイルに保存する機能があり、明らかにタブインデックスは信頼できないため、各タブの確実な参照を保持する必要があります。
編集:コードに新しいタブを追加する方法は次のとおりです。
...//main class
private final JTabbedPane pane = new JTabbedPane();
//I am using an array to store the tabs created
//I initialize the array with false. the idea was that when a new tab get created, one item in the array
//gets the true value. when the tab is closed, the array item (based on the index) is set back to false
arrTabList = new boolean[10];
for(int i=0; i<10; i++){
arrTabList[i] = false;
}
...
public void newFile() //this function opens a new tab
{
//parse the array to check the first item with false status
for(int i=0; i<10; i++){
if(!arrTabList[i]) {
System.out.println("false");
PanelCounter = i;
break;
}
}
newTab t = new newTab(); //object which contains the tab content (a bunch of graphical components, input fields mostly)
pane.add("New Entry" + PanelCounter, t.createContentPane()); //adds the new tab to the main window
pane.setTabComponentAt(PanelCounter, new ButtonTabComponent(pane, this));
arrTabList[PanelCounter] = true; //sets the item array to true
}
//when a tab is closed, this function is called in the listener:
public void decreaseCounter(int i)
{
arrTabList[i] = false; //sets the item array back to false
}