Hallo,
also ich hab mir das JTable Tutorial in der FAQ angeschaut, aber da wird nur auf Verändern des TableModel über das Editieren von Zellen eingegangen.
Bei meinem JTable sind alle Zellen nicht editierbar, allerdings kann man auf andere Art und Weise was im Model ändern. zB löschen.
Und ich hab hier grad ein paar Probleme damit.
Also meine Daten liegen in einer Liste, ich hab ein TableModel implementiert, vllt liegt hier schon der Fehler, aber dazu später.
Gut also das löschen geschieht eben über einen Button und das sieht so aus:
(MovieTable ist mein JTable, getAll() liefert eine List<Movie>)
Also der obige Code ist getestet und das ist auch richtig so, auch das Konvertieren des Index.
Konkret habe ich jetzt aber 2 verschiedene Fehler:
1) Ich selektiere im Table die letzte Reihe, und klick auf meinen Delete-Button. In diesem Fall verschwindet sie aus dem Table, und es kommt keine Exception. Soweit also alles prima, in der getValueAt sieht man an einem sysout, dass im Datenmodel auch alles passt und das Objekt aus der Liste raus ist. Außerdem passen alle Zeilen-Indices im Table zu den Daten. Wenn ich dann aber wieder eine Zeile markiere, kommt folgende Exception:
Hier muss ich wohl sagen: die setValueAt()-Methode habe ich nicht implementiert! Ich hab es nicht getan weil man meine Daten ja eh nicht über den Table editieren kann, und ich wüsste auch nicht warum der Table hier meine Daten verändern können sollte. Aber immerhin kommt diese Methode in der Exception vor. Also kA, verstehen tu ich's aber nicht, denn der Table soll ja nur meine Daten anzeigen, wofür braucht er da bitte eine setValueAt() ?
Der zweite Fehler kommt vor, wenn ich die Table sortiert habe (es liegt der Default-RowSorter drauf, also setAutoCreateRowSorter(true)), und dann irgendwas anklicke und löschen will:
Hier ist etwas ganz strange. Zum Verständnis erstmal: Diese Auszüge kamen aus einem Test wo ich 3 Elemente in der Liste hatte. Die Size wird als 2 angezeigt, weil diese Expcetion wohl geworfen wird, nachdem ich in der Datenliste das Element gelöscht habe, also ist die Size dann halt nur noch 2.
Aber was ich gar nicht kapiere: Der Index ist 2, und zwar immer. Total egal, welche Zeile ich vor dem Sortieren angeklickt hatte, oder nach welcher Spalte ich sortiere. Mein ListSelectionListener des JTable sieht das ganz anders, und zwar richtig! Wieso geht er hier von nem Index = 2 aus? Woher hat er den, wie gesagt der ListSelectionListener zeigt mir korrekte Werte!
Hilfe ;(
also ich hab mir das JTable Tutorial in der FAQ angeschaut, aber da wird nur auf Verändern des TableModel über das Editieren von Zellen eingegangen.
Bei meinem JTable sind alle Zellen nicht editierbar, allerdings kann man auf andere Art und Weise was im Model ändern. zB löschen.
Und ich hab hier grad ein paar Probleme damit.
Also meine Daten liegen in einer Liste, ich hab ein TableModel implementiert, vllt liegt hier schon der Fehler, aber dazu später.
Gut also das löschen geschieht eben über einen Button und das sieht so aus:
(MovieTable ist mein JTable, getAll() liefert eine List<Movie>)
Java:
// get index of selected row within the table
int selRow = MovieTable.getInstance().getSelectedRow();
// retrieve movie object. ATTENTION: If table is sorted, the selection
// index does not equal with the real index of the movie object within
// the database, so we must convert that!
int realIndex = MovieTable.getInstance().convertRowIndexToModel(selRow);
Movie selectedMovie = Database.getInstance().getAll().get(realIndex);
// delete it!
Database.getInstance().getAll().remove(selectedMovie);
// must call this so that the table updates itself:
MovieTable.getInstance().revalidate();
MovieTable.getInstance().repaint();
Also der obige Code ist getestet und das ist auch richtig so, auch das Konvertieren des Index.
Konkret habe ich jetzt aber 2 verschiedene Fehler:
1) Ich selektiere im Table die letzte Reihe, und klick auf meinen Delete-Button. In diesem Fall verschwindet sie aus dem Table, und es kommt keine Exception. Soweit also alles prima, in der getValueAt sieht man an einem sysout, dass im Datenmodel auch alles passt und das Objekt aus der Liste raus ist. Außerdem passen alle Zeilen-Indices im Table zu den Daten. Wenn ich dann aber wieder eine Zeile markiere, kommt folgende Exception:
Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Invalid index
at javax.swing.DefaultRowSorter.convertRowIndexToModel(Unknown Source)
at javax.swing.JTable.convertRowIndexToModel(Unknown Source)
at javax.swing.JTable.setValueAt(Unknown Source)
at javax.swing.JTable.editingStopped(Unknown Source)
at javax.swing.AbstractCellEditor.fireEditingStopped(Unknown Source)
at gui.table.SpecialCellRenderer.fireEditingStopped(SpecialCellRenderer.java:50)
at javax.swing.DefaultCellEditor$EditorDelegate.stopCellEditing(Unknown Source)
at javax.swing.DefaultCellEditor.stopCellEditing(Unknown Source)
at gui.table.SpecialCellRenderer.stopCellEditing(SpecialCellRenderer.java:46)
Hier muss ich wohl sagen: die setValueAt()-Methode habe ich nicht implementiert! Ich hab es nicht getan weil man meine Daten ja eh nicht über den Table editieren kann, und ich wüsste auch nicht warum der Table hier meine Daten verändern können sollte. Aber immerhin kommt diese Methode in der Exception vor. Also kA, verstehen tu ich's aber nicht, denn der Table soll ja nur meine Daten anzeigen, wofür braucht er da bitte eine setValueAt() ?
Der zweite Fehler kommt vor, wenn ich die Table sortiert habe (es liegt der Default-RowSorter drauf, also setAutoCreateRowSorter(true)), und dann irgendwas anklicke und löschen will:
Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
at java.util.ArrayList.RangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at gui.table.MyTableModel.getValueAt(MyTableModel.java:35)
at javax.swing.JTable.getValueAt(Unknown Source)
Hier ist etwas ganz strange. Zum Verständnis erstmal: Diese Auszüge kamen aus einem Test wo ich 3 Elemente in der Liste hatte. Die Size wird als 2 angezeigt, weil diese Expcetion wohl geworfen wird, nachdem ich in der Datenliste das Element gelöscht habe, also ist die Size dann halt nur noch 2.
Aber was ich gar nicht kapiere: Der Index ist 2, und zwar immer. Total egal, welche Zeile ich vor dem Sortieren angeklickt hatte, oder nach welcher Spalte ich sortiere. Mein ListSelectionListener des JTable sieht das ganz anders, und zwar richtig! Wieso geht er hier von nem Index = 2 aus? Woher hat er den, wie gesagt der ListSelectionListener zeigt mir korrekte Werte!
Hilfe ;(
Zuletzt bearbeitet: