JTable - Usuwanie zaznaczonych rzędów

0

Okazuje się że w Javie usunięcie wybranych rzędów w tabeli jest nie lada wyzwaniem inżynieryjnym :/

Normalny kod typu:

// model - DefaultTableModel
// table - JTable
while(table.getSelectedRows().length > 0) {
					
	int mr = table.convertRowIndexToModel(table.getSelectedRow());
	model.removeRow(mr);
}

nie działa bo java gubi w niektórych sytuacjach jeden wiersz. (czasem przy jednym removeRow znikają dwa wiersze z selectedRows)

PS. Używam sortera więc konwersja poprzez convertRowIndexToModel jest obowiązkowa.

Jako że nie ma nigdzie oczywistych metod model.removeRows(table.convertRowIndexesToModel(able.getSelectedRows())), więc z mojej wiedzy wynika że muszę to zrobić tak:

int tabSel[] = table.getSelectedRows();
ArrayList<Integer> modSel = new ArrayList<Integer>(); 
for(int t : tabSel) {
	modSel.add(table.convertRowIndexToModel(t));
}
Collections.sort(modSel);
int removed = 0;
for(int m : modSel) {

	model.removeRow(m - removed);
	removed++;
}
table.clearSelection();

Pytanie czy da się to zrobić jakoś normalniej, wbudowanymi funkcjami ?

0

Zwroc uwage na to ze jak masz np 3 wiersze, usuniesz wiersz numer 0, to nastepnie usuniecie wiersza 1 usunie ostatni wiersz. Dlatego mysle ze nie mozesz tego robic w takiej petli, albo musisz zmieniac co usuniecie indexy.

0
mizol napisał(a)

Zwroc uwage na to ze jak masz np 3 wiersze, usuniesz wiersz numer 0, to nastepnie usuniecie wiersza 1 usunie ostatni wiersz. Dlatego mysle ze nie mozesz tego robic w takiej petli, albo musisz zmieniac co usuniecie indexy.

O której pętli mówisz ?

W pierwszej według mnie to nie powinno mieć znaczenia ponieważ JTable powinno się samo zaktualizować po removeRow na modelu. poza tym problem jest w tym że JTable w ogóle gubi jedno zaznaczenie. Najpierw jest ich trzy, a po pierwszym removeRow zostaje tylko jeden.
W drugiej po to jest zmienna removed i całe to sortowanie.

0

Powiedzmy, że na początku masz 4 wiersze (A,B,C,D) i chcesz usunąć wiersz 0 i 2 (A i C)

Usuwane indeksy: 0,2
Treść tablicy: A,B,C,D

  1. Najpierw usuwasz 0
    Treść tablicy: B,C,D

  2. Usuwasz 2
    Treść tablicy: B,C

Czyli otrzymujesz "B,C" zamiast "B,D".

Rozwiązaniem jest usuwanie wierszy OD KOŃCA.

  1. Najpierw usuwasz 2
    Treść tablicy: A,B,D

  2. Później usuwasz 0
    Treść tablicy: B,D

Otrzymujesz poprawnie "B,D"

0
__krzysiek85 napisał(a)

Powiedzmy, że na początku masz 4 wiersze (A,B,C,D) i chcesz usunąć wiersz 0 i 2 (A i C)

Usuwane indeksy: 0,2
Treść tablicy: A,B,C,D

  1. Najpierw usuwasz 0
    Treść tablicy: B,C,D

  2. Usuwasz 2
    Treść tablicy: B,C

Czyli otrzymujesz "B,C" zamiast "B,D".

Rozwiązaniem jest usuwanie wierszy OD KOŃCA.

  1. Najpierw usuwasz 2
    Treść tablicy: A,B,D

  2. Później usuwasz 0
    Treść tablicy: B,D

Otrzymujesz poprawnie "B,D"

Albo od początku gdzie indeks do usunięcia = pierwotny indeks - liczba już usuniętych indeksów. Mało to się różni od mojego rozwiązania, a pytam się o coś innego. Czy w Swing jest jakaś opcja co już to robi to już za mnie. Pytam na przyszłość bo nie chce mi się tego przeklajać za każdym razem. Wszystkie inne frameworki do GUI z jakimi do tej pory pracowałem rozwiązywały to w jednej linii.

1 użytkowników online, w tym zalogowanych: 0, gości: 1