[J2SE] JTable - Spory problem

0

Pisze niewielka aplikacje bazodanowa i korzystam z JTable do prezentacji rekordow. W oknie aplikacji mam zamiar dodawac, edytowac i usuwac rekordy. Dodawanie i edycja to zaden problem, jadnak podczas usuwania rekordow pojawil sie porblem. Usuwanie dziala dopoki elementy w JTable nie sa posortowane. Gdy posortuje elemanty w JTable porzez nacisniecie naglowka kolumy i zamierzam usunac rekord, dane z kontenera w modelu mojego JTable sa usuwane poprawnie, jednak po wywolaniu metory updateUI() pojawia sie wyjątek AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 10, Size: 10 Moze macie jakies pomysly jak temu zaradzic?

public void actionPerformed(ActionEvent e) {
                int[] activeRows = teamsTable.getSelectedRows();
                if(activeRows.length == 0) {
                    JOptionPane.showMessageDialog(null, "Żadna drużyna nie została wybrana", "Błąd", JOptionPane.ERROR_MESSAGE);
                    return;
                }
                
                List<Team> teamsToDelete = new ArrayList<Team>();
                for(int i: activeRows) {
                    teamsToDelete.add(teamsTableModel.getRow(teamsTable.convertRowIndexToModel(i)));
                }

                String teamsToDeleteMessage = "";
                for(Team t: teamsToDelete) {
                    teamsToDeleteMessage += t.getName() + "\n";
                }

                int confirmationResult = JOptionPane.showConfirmDialog(null, "Chcesz usunąć drużyny:\n" + teamsToDeleteMessage + "Czy na pewno chcesz to zrobić?", "Zapytanie", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);

                if(confirmationResult == 0) {
                    for(int i: activeRows) {
                        teamsTableModel.removeRow(teamsTable.convertRowIndexToModel(i));
                    }
                    teamsTable.updateUI();

                }
            }
0

Na oko:

  1. wynik showConfirmDialog porównuj zawsze ze stałymi które są w JOptionPane
  2. Usuwaj od końca (czyli petla for(int i=activeRows.lenght-1;i>=0;i--) .
0
public void actionPerformed(ActionEvent e) {
                int[] activeRows = teamsTable.getSelectedRows();        

                if(activeRows.length == 0) {
                    JOptionPane.showMessageDialog(null, "Żadna drużyna nie została wybrana", "Błąd", JOptionPane.ERROR_MESSAGE);
                    return;
                }

                int[] activeRowsModel = new int[activeRows.length];

                for(int i = 0; i < activeRows.length; i++) {
                   activeRowsModel[i] = teamsTable.convertRowIndexToModel(activeRows[i]);
                }

                Arrays.sort(activeRowsModel); //sortowanie rosnace
               
                List<Team> teamsToDelete = new ArrayList<Team>();
                for(int i: activeRowsModel) {
                    teamsToDelete.add(teamsTableModel.getRow(i));
                }

                String teamsToDeleteMessage = "";
                for(Team t: teamsToDelete) {
                    teamsToDeleteMessage += t.getName() + "\n";
                }

                int confirmationResult = JOptionPane.showConfirmDialog(null, "Chcesz usunąć drużyny:\n" + teamsToDeleteMessage + "Czy na pewno chcesz to zrobić?", "Zapytanie", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);

                if(confirmationResult == 0) {
                    for(int i = activeRowsModel.length - 1; i >= 0; i--) { //usuwamy od konca
                        teamsTableModel.removeRow(activeRowsModel[i]);
                    }
                    teamsTable.updateUI();

                }
}
0

Dziekuje za odzew :) usuwanie od konca to jeden z dwoch bledow jaki znalazlem. Drugi to brak wywolania metody

this.fireTableDataChanged();

w metodzie removeRow() w modelu JTable. Powodowalo to brak przeliczenia ilosci rekordow w tabeli i blad IndexOutOfBoundsException

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