JTabbedPane - karta z odnośnikiem do przycisku zamknięcia
Chcę zbudować interfejs z kartami w JAVA, z przyciskiem zamykania na każdej karcie. Do tego użyłem następującej klasy:ButtonTabComponent
Mam przycisk na moim GUI, który tworzy nową kartę. Powiedzmy, że wciskam przycisk Nowa karta 4 razy, dlatego tworzone są 4 karty:
| tab 0 | karta 1 | tab 2 | tab 3 | (każda karta zawiera przycisk zamykania)
Teraz zdecydowałem, że chcę zamknąć kartę 1 i pojawia się problem, gdy zamykam środkową kartę, wszystkie indeksy są porządkowane - co oznacza, że:
| tab 0 | tab 2 | tab 3 | (zakładka 2 będzie miała indeks 1)
Jeśli spróbuję teraz utworzyć nową kartę, karta zostanie utworzona, ale nowa karta:
| tab 0 | tab 2 | tab 3 | karta 1 | (karta 1 nie ma przycisku zamykania)
Jeśli kliknę ponownie Nowa karta, otrzymam:
| tab 0 | tab 2 | tab 3 | karta 1 | zakładka 4 | (karta 4 jest w porządku, ma przycisk zamykania)
Teraz decyduję się zamknąć kartę 2 i otrzymuję:
| tab 0 | tab 3 | karta 1 | zakładka 4 | (zakładka 3 będzie teraz miała indeks 1)
Jeśli utworzę nową kartę:
| tab 0 | tab 3 | karta 1 | zakładka 4 | karta 1 | (ostatnia karta ponownie nie ma przycisku zamykania).
Uważam, że jest to spowodowane przez indeks i przeczytałem podobne pytanie, tutaj na stackoverflow:stackoverflow.com/questions/15312252/jtabbedpane-arrayindexoutofboundsexception że możliwym rozwiązaniem byłoby:
Przekaż słuchaczowi odwołanie do elementu karty, a nie jego indeksu na panelu z zakładkami.
Nie wiem, jak to zrobić. Jeśli ktoś ma jakąkolwiek wskazówkę, naprawdę bym to docenił. Muszę mieć stałe odniesienie dla każdej karty, ponieważ każda karta otworzy plik i będzie miała możliwość zapisania do pliku i oczywiście indeks kart nie jest wiarygodny.
EDYCJA: Sposób dodawania nowej karty w moim kodzie to:
...//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
}