Swing JTable: Löschen vom Daten im Model

Status
Nicht offen für weitere Antworten.

hdi

Top Contributor
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>)

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:

Marco13

Top Contributor
Is schon spät, darum nur kurz:

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:
...
  // delete it!
  Database.getInstance().getAll().remove(selectedMovie);
  // must call this so that the table updates itself:
  MovieTable.getInstance().revalidate();
  MovieTable.getInstance().repaint();

Wenn ich das richtig verstehe, veränderst du dort eine Liste, die die eigentliche Datenhaltung deines TableModels erledigt? Und dann revalidate um die JTable zu aktualisieren?

Falls ja: Eigentlich sollten bei Änderungen am TableModel sofort (und vom TableModel selbst) die passenden Events geworfen werden, die jeden Listener (also auch die JTable) über diese Änderungen benachrichtigen. Am einfachsten ist das, wenn man von AbstractTableModel (Java 2 Platform SE v1.4.2) erbt, und bei allen Änderungen die passenden "fire"-Methoden aufruft. Wenn man die Daten einer List verändert, und die JTable dann z.B. beim Neuzeichnen indirekt über's TableModel auf diese List zugreifen will, kracht's.

EDIT: Hach ja :oops: ZU spät: Das delete steht ja beim Database.getInstance ... sorry.:oops:
 

hdi

Top Contributor
Also ich weiss jetzt nicht ob das jetzt stimmt was du sagst? Weil du am Ende irgendwas von edit geschreiben hast?

Also zur Klarstellung: Dieses Database.getInstance().getAll() liefert eine Liste, und die stellt die Daten meines Table dar.
D.h. in meinem TableModel greife ich darauf zu, zB die getValueAt:

Java:
@Override
	public Object getValueAt(int rowIndex, int columnIndex) {
		// rowIndex here is already converted to model index!
		Movie m = Database.getInstance().getAll().get(rowIndex);

		switch (columnIndex) {
		// je nachdem wird jetzt ein Getter von "m" aufgerufen und returned
		}
	}

Bisher hatte ich komplett TableModel implementiert, habs jetzt geändert auf extends AbstractTableModel, die beiden Fehler bestehen aber weiterhin unverändert :(
 

hdi

Top Contributor
@Modellbahner:

Ich habe jetzt mein Model von DefaultTableModel abgeleitet, es sieht nun so aus:

Java:
public class MyTableModel extends DefaultTableModel {

	private static final MyTableModel instance = new MyTableModel();

	public static MyTableModel getInstance() {
		return instance;
	}

	private MyTableModel() {
	}

	@Override
	public Class<?> getColumnClass(int columnIndex) {
		return TableColumns.getColumnClass(columnIndex);
	}

	@Override
	public int getColumnCount() {
		return 8;
	}

	@Override
	public String getColumnName(int columnIndex) {
		return TableColumns.getTitle(columnIndex);
	}

	@Override
	public int getRowCount() {
		return Database.getInstance().getAll().size();
	}

	@Override
	public Object getValueAt(int rowIndex, int columnIndex) {
		// rowIndex here is already converted to model index!
		Movie m = Database.getInstance().getAll().get(rowIndex);

		switch (columnIndex) {
		case TableColumns.TITLE:
			return m.getTitleGerman();
		case TableColumns.YEAR:
			return m.getYear();
		case TableColumns.GENRE:
			return m.getGenre();
		case TableColumns.FORMAT:
			return m.getFormat();
		case TableColumns.DURATION:
			return m.getDuration();
		case TableColumns.FSK:
			return m.getFsk();
		case TableColumns.RATING:
			return m.getRating();
		default:
			return null;
		}
	}

	@Override
	public boolean isCellEditable(int rowIndex, int columnIndex) {
		return columnIndex == TableColumns.SPECIAL;
	}

	@Override
	public void setValueAt(final Object aValue, final int rowIndex,
			final int columnIndex) {
		fireTableCellUpdated(rowIndex, columnIndex);
	}

}

Und mein Delete-Button macht dies hier:

Java:
                // get index of selected row within the table
		int selRow = MovieTable.getInstance().getSelectedRow();
                // delete it
		MyTableModel.getInstance().removeRow(selRow);

Allerdings passiert hier nix. Meine Daten sind noch immer die selben danach.
 

Marco13

Top Contributor
Wenn das so gemacht ist, wie du jetzt geschrieben hast, dann sollte das, was ich gesagt habe, trotz des edits stimmen.
Java:
                // get index of selected row within the table
		int selRow = MovieTable.getInstance().getSelectedRow();
                // delete it
		MyTableModel.getInstance().removeRow(selRow);

Allerdings passiert hier nix. Meine Daten sind noch immer die selben danach.

In dem letzten TableModel steht ist auch die Methode removeRow nicht überschrieben?!

FALLS ich das richtig verstanden habe, solltest du aber nicht von DefaultTableModel ableiten. Das DefaultTableModel hat intern eine Liste, die die Tabellendaten verwaltet. Wenn du davon ableitest, verwendest du ggf. eine Mischung aus der Liste des DefaultTableModels, und der Liste, die von deiner DataBase geliefert wird.

Eigentlich sollte es das AbstractTableModel schon tun. Dort würde dann sowas stehen wie
Code:
public void removeRow(int index)
{
    Database.getInstance().getAll().remove(index);
    fireTableDataChanged() ;
}

Aber noch ganz "Off Topic" und nebenbei: Das mit dem getAll sieht etwas seltsam aus: Die Datenbank-Instanz speichert eine Liste, die man von außen verändern kann, und die die Liste ist, die ein TableModel füttert? Und das ganze als Singletons - in der Hoffnung, dass du NIE zwei TableModels haben willst ;) Man wird mit dieser Struktur IMMER auf Probleme stoßen, weil mit dem "Database.getInstance().getAll()" jeder (Idiot) sich die Liste holen, und nach belieben drin rumpfuschen kann. Die Table kreigt davon nichts mit, weil ja nur irgendwo eine Liste der Datenbank verändert wird, und niemand weiß, dass das "zufällig" auch die Liste des TableModels ist.
Wichtig zu wissen wäre: Wer erstellt die Liste, die mit Database.getInstance().getAll() zurückgelifert wird, und wie ist die Verbindung dieser Liste zur eigentlichen Datenbank?
 

ModellbahnerTT

Bekanntes Mitglied
Also ich weiß jetzt nich warum du von DefaultTableModel abgeleitet hast, dass bei deinem removeRow aufruf nichts passiert ist auch nicht verwunderlich, du änderst ja auch nie was an deinem datenmodel :noe:
Marco13 hat auch eigentlich schon alles wichtige gesagt, in der FAQ steht das alles nochmal etwas ausführlicher, einfach mal implementieren...
Und entfern am besten erstmal den ganzen static-Müll, warum soll ein TableModel ein singleton sein? :shock:
 

hdi

Top Contributor
EDIT: Ich hoffe keiner ist gerade dabei den 8-seiten Text zu lesen :oops: Ich hab jetzt eine Idee: Ich fange das Programm neu an, from scratch, und ich würde dann immer posten, wenn ich etwas bestimmtes getan habe (natürlich nur was den Table und die Daten betrifft, nicht jeden Schmarrn!!), damit wir das gemeinsam "absegnen" können.
Würdet ihr euch da bereit erklären für?
Weil ich glaube mein Programm ist jetzt schon soviel Choas... ;( Ich möchte halt auch einfach eine tolle GUI machen, hab ne tolle Vorstellung aber das erfordert eben lauter Custom Renderers und blabla, und das hab ich wohl scheinbar nicht so drauf..

Also ich würde jetzt neu beginnen, und wenn ich zB das TableModel implementiert habe, würde ich es hier gleich posten und fragen, ob das so okay ist. Wenn ich dann zB die Sortierung implementiert habe, würd ich das auch posten, und wenn ich einen speziellen Renderer geschrieben habe, auch.

So kommt ihr halt auch mit, es ist völlig klar dass es höllisch schwer für euch ist zu helfen wenn ich schon 4000 Zeilen Code habe und überall lauter Fehler..

Ich mache dafür jetzt einen neuen Thread auf, ihr findet ihn unter "AWT, Swing & SWT" mit dem Titel "Gemeinsame JTable-Implementierung".

Hoffe das ist okay, ansonsten löschen. Aber ich glaube nur auf diese Art und Weise krieg ich etwas vernünftiges zusammen, meine Ansprüche an das Programm sprengen halt leider auch das, was es in der FAQ zum Thema Table zu lesen gibt...

Merci euch, see you im anderen Thread hoffentlich ;)
 
Zuletzt bearbeitet:
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
D JTable zum Einfügen/Löschen/Editieren von Daten AWT, Swing, JavaFX & SWT 5
T Swing JTable valueChanged datensatz löschen AWT, Swing, JavaFX & SWT 1
LexeB4F JTable mehrere Zelle selektieren und inhalte Löschen.. Ideen gesucht AWT, Swing, JavaFX & SWT 1
M JTable horizontale scrollbar löschen AWT, Swing, JavaFX & SWT 3
Bluedaishi JTable alle Zeilen löschen AWT, Swing, JavaFX & SWT 7
I JTable Inhalte löschen ohne den JTable zu verändern! AWT, Swing, JavaFX & SWT 5
earlgrey_tea JTable Zelleninhalt beim Editieren löschen AWT, Swing, JavaFX & SWT 5
Ollek Swing JTable - Zeile löschen mit AbstractTableModel AWT, Swing, JavaFX & SWT 20
S Swing JTable Zeilen löschen AWT, Swing, JavaFX & SWT 21
A JTable Zelle markieren von bis und Löschen AWT, Swing, JavaFX & SWT 6
S Swing AWT-Exception bei JTable mit JComboBox beim Löschen der letzten Zeile AWT, Swing, JavaFX & SWT 3
E Swing JTable Inhalte löschen..Was ist Sinnvoll? AWT, Swing, JavaFX & SWT 5
F Swing JTable: Problem beim zeile löschen AWT, Swing, JavaFX & SWT 3
R JTable Zeile löschen AWT, Swing, JavaFX & SWT 4
E Spalte in JTable löschen AWT, Swing, JavaFX & SWT 4
C Spalte aus JTable löschen AWT, Swing, JavaFX & SWT 8
nadal15 JTable und ArrayList - selected rows löschen AWT, Swing, JavaFX & SWT 6
F Per KeyListener Zeilen aus JTable löschen AWT, Swing, JavaFX & SWT 9
J JTable - Wie Zeilen löschen ? AWT, Swing, JavaFX & SWT 8
A Zeile in JTable einfügen/löschen- Tutorial gesucht AWT, Swing, JavaFX & SWT 9
H jtable makierte zeile löschen AWT, Swing, JavaFX & SWT 4
O Inhalte in JTable löschen AWT, Swing, JavaFX & SWT 3
M JTable. Beim löschen der Zeilen Fehlermeldung AWT, Swing, JavaFX & SWT 22
F Row löschen einer JTable AWT, Swing, JavaFX & SWT 7
G Tabellen Einträge löschen - JTable AWT, Swing, JavaFX & SWT 6
A JTable Reihe(n) löschen ? AWT, Swing, JavaFX & SWT 7
J Drag und drop aus einer JTable - bitte um Unterstützung AWT, Swing, JavaFX & SWT 2
S HPRO und UPRO gemeinsame JTABLE gemeinsamer RENDERER ? AWT, Swing, JavaFX & SWT 1
F Swing JTable - MultiHeader inkl. Eingabemöglichkeit AWT, Swing, JavaFX & SWT 1
S JTable - Feldinhalte anzeigen AWT, Swing, JavaFX & SWT 15
D Swing JTable Spaltenbreite AWT, Swing, JavaFX & SWT 1
W Gibt es einen "automatischen Listener" in Swing oder JTable oder der ATM-Klasse? AWT, Swing, JavaFX & SWT 14
G jTable - getSelectedRow() AWT, Swing, JavaFX & SWT 3
I JTable mit einem Button zu einer Detail Seite springen AWT, Swing, JavaFX & SWT 4
P JTable Listener für die Änderung einzelner Zellen oder Rows AWT, Swing, JavaFX & SWT 2
D Tastaturabfragen CTRL+t, CTRL+E bei eine JTable, bestehend aus JTextAteas AWT, Swing, JavaFX & SWT 4
P Checkboxes in JTable nicht editable AWT, Swing, JavaFX & SWT 9
F Best-Practise: JTable Text in Zelle zu groß AWT, Swing, JavaFX & SWT 2
izoards JTable in CSV File schreiben... AWT, Swing, JavaFX & SWT 23
Kohl Jedes Objekt einer JTable um ein Zeichen verkürzen AWT, Swing, JavaFX & SWT 7
I JTable, DefaultTableModel, zwei Zahlen multiplizieren. AWT, Swing, JavaFX & SWT 26
M JTABLE / wie oft wurde gewürfelt. AWT, Swing, JavaFX & SWT 1
F JTable vergrößern AWT, Swing, JavaFX & SWT 2
H JTable: Diverse NullPointer-Exceptions zur Laufzeit AWT, Swing, JavaFX & SWT 3
J Swing Werte des JTable werden nicht angezeigt AWT, Swing, JavaFX & SWT 9
T Swing JTable cellRenderer mit jpg Hintergrundfarbe lässt sich nicht ändern. AWT, Swing, JavaFX & SWT 1
HoT Einzelne Zelle in JTable Rahmen unten setzen AWT, Swing, JavaFX & SWT 24
B JTable Zellen zusammenfügen AWT, Swing, JavaFX & SWT 3
M Swing Cell Renderer für Zeilenumbruch in JTable AWT, Swing, JavaFX & SWT 0
H JTable im JSplitPane darstellen AWT, Swing, JavaFX & SWT 2
MadMax2506 Swing JTable lädt sehr lange AWT, Swing, JavaFX & SWT 1
D Zeilenumbruch in einer JTable AWT, Swing, JavaFX & SWT 9
R Swing JTable und Spaltenausrichtung AWT, Swing, JavaFX & SWT 8
G JTable füllen AWT, Swing, JavaFX & SWT 1
H JTable TableCellEditor-Problem AWT, Swing, JavaFX & SWT 0
W Swing JTable Zeilenumbruch innerhalb einer Zelle AWT, Swing, JavaFX & SWT 3
J Datensatz in jTable ausgeben AWT, Swing, JavaFX & SWT 3
M Swing Automatischer Editorstart in JTable-Zelle AWT, Swing, JavaFX & SWT 5
ralfb1105 Swing JTable aktualisieren AWT, Swing, JavaFX & SWT 5
adiko01 JTable: Nur markierte Zeilen aus der Tabelle in CSV exportiern AWT, Swing, JavaFX & SWT 9
M JTable.setDefaultRenderer(...) greift nicht AWT, Swing, JavaFX & SWT 0
J JTable: Eingabe in Tabellenzelle korrigieren AWT, Swing, JavaFX & SWT 4
T Problem mit JTable Sortierung AWT, Swing, JavaFX & SWT 2
D JTable nach INSERT aktualisieren /refreshen AWT, Swing, JavaFX & SWT 1
D MySQL Daten in JTable anzeigen AWT, Swing, JavaFX & SWT 2
H Swing Jtable extra spalte AWT, Swing, JavaFX & SWT 6
S Swing Rechteck über JTable zeichnen (per MouseListener) AWT, Swing, JavaFX & SWT 1
S Swing Mal wieder JTable Ansicht aktualisieren AWT, Swing, JavaFX & SWT 10
A JTable mit Daten füllen AWT, Swing, JavaFX & SWT 1
VfL_Freak Swing Einzelne Zeile in jTable selektieren klappt nicht AWT, Swing, JavaFX & SWT 7
N AWT jTable CellRenderer AWT, Swing, JavaFX & SWT 6
0 Swing JTable aus anderer Klasse updaten AWT, Swing, JavaFX & SWT 5
S Jtable defaultRenderer wohin damit ? AWT, Swing, JavaFX & SWT 23
T Swing JTable / FocusListener AWT, Swing, JavaFX & SWT 0
it_is_all Warum wird die JTable im JDialog nicht angezeigt? AWT, Swing, JavaFX & SWT 1
L Swing JTable im Panel darstellen AWT, Swing, JavaFX & SWT 8
T Swing Double Click bei Buttons in JTable AWT, Swing, JavaFX & SWT 9
J addRow bei JTable AWT, Swing, JavaFX & SWT 6
M Jtable gibt -1 wert bei selectedRow und Column AWT, Swing, JavaFX & SWT 3
Meeresgott Swing JTable AWT, Swing, JavaFX & SWT 4
J JTable Selection Listener funktioniert nicht AWT, Swing, JavaFX & SWT 4
C Swing Daten in JTable wiedergeben per TableModel und MVC Pattern AWT, Swing, JavaFX & SWT 16
Z Swing Drag&Drop zwischen JTable und JTree AWT, Swing, JavaFX & SWT 4
Thallius JTable dynamisch Spaltenanzahl verändern AWT, Swing, JavaFX & SWT 2
Thallius JTable dynamisch laden? AWT, Swing, JavaFX & SWT 2
B Swing JTable sortieren AWT, Swing, JavaFX & SWT 2
T Swing JTable auslesen und befüllen AWT, Swing, JavaFX & SWT 8
B JTable wird nicht angezeigt AWT, Swing, JavaFX & SWT 1
J JTable und Suchlogik AWT, Swing, JavaFX & SWT 4
Viktim Swing JTable mit Tab verlassen AWT, Swing, JavaFX & SWT 1
F Swing Spaltenbreite einer Column eines JTable auslesen AWT, Swing, JavaFX & SWT 5
Viktim Swing JTable Mit Tab druch Zeilen Wechseln AWT, Swing, JavaFX & SWT 5
Thallius Warum refrehsed mein JTable nicht? AWT, Swing, JavaFX & SWT 5
Ghostman1711 Hinzufügen ausgewählter Dateinen des Filechoosers zu einem JTable AWT, Swing, JavaFX & SWT 9
S Swing JTable - Einzelne Rows einfärben AWT, Swing, JavaFX & SWT 11
M Wert einer Zelle aus JTable ziehen AWT, Swing, JavaFX & SWT 4
K JTable getValueAt() klappt nicht immer AWT, Swing, JavaFX & SWT 1
K JTable in extra Klasse, Zugriff in einer anderen klasse nicht möglich AWT, Swing, JavaFX & SWT 26
B Swing Tabelle(JTable) filtern swing GUI AWT, Swing, JavaFX & SWT 3
P JTable - bei Eingabe Selektion AWT, Swing, JavaFX & SWT 0

Ähnliche Java Themen

Neue Themen


Oben