Tabelle filtern und Zeilen löschen. Zeilen auch in ursprünglicher Tabelle löschen

Diable

Mitglied
Hi,
bin neu hier und hab folgendes Problem:
Ich hab eine gefüllte JTable mit DefaultTableModel (gefüllt durch ne CSV-Datei)
Diese Tabelle möchte ich nun filtern können. Dies hab ich auch hinbekommen. Hab dafür folgendes Beispiel von hier zu Hilfe genommen.
http://www.tutorials.de/tutorials193299.html&highlight=Tabelle+filtern

Nun möchte ich Zeilen, die ich vorher markiert habe, aus der Tabelle löschen können.
Auch das hab ich noch hinbekommen.

Code:
int sel = table.getSelectedRow();
model.removeRow(sel);

So nun zu meinem eigentlich Problem:
Wenn ich diese Zeile gelöscht habe und nun den Filter wieder auflösen will, so dass die komplette Tabelle (außer die schon gelöschten Zeilen) angezeigt wird, dann sind diese eben gelöschten Zeilen immernoch in der ursprünglichen Tabelle vorhanden.
Aber ich hätte gerne, dass die gelöschten Zeilen aus der gefilterten Tabelle (filteredModel - wie aus dem Beispiel von hier, siehe Link) auch in der ursprünglichen Tabelle gelöscht werden.

Habt ihr ne Idee, wie ich dieses Problem lösen kann
Hab ich es für euch verständlich erklärt?
Für eure Hilfe wär ich euch sehr dankbar.

Gruß Diable
 
Hi,
hat keiner von euch ne Idee
Oder geht des so gar nicht, wie ich des vor hab?
Oder hab ich meine Frage irgendwie unverständlich erkärt? Braucht ihr noch irgendwelche Infos?

Ich wär euch echt dankbar, wenn ihr mir irgendwelche Tips geben könntet, wie ich dieses Problem lösen kann.

Merci,
Grüße Diable
 
Also ehrlich gesagt bin ich gerade etwas zu faul um mich durch den Code zu wühlen, nach kurzem Überfliegen würde ich tippen das du die Spalte aus beiden TableModels löschen musst, machst du das schon?
mfg elmato
 
Hi elmato,
erst mal danke für deine Antwort. Aber ich will keine Spalten sondern Zeilen darin löschen.
Hab mir auch schon überlegt, dass ich dies in beiden Models machen muss. Denn beim zurücksetzen (bzw. aufheben des Filters) hat das ursprüngliche Model die Zeilen ja noch. Weiß aber leider net, wie ich dies anstellen soll. Wie kann ich dem ursprünglichen TableModel klar machen, dass es genau die Zeilen auch löschen soll, die im gefilterten Model gelöscht werden?
 
Mein Tip wäre wie immer:
Arbeite mit eigenen Zeilen (z.B. TableRows) im TableModel. Verwalte sie in einer List, dann kannst Du anhand eines Kenners o.ä. darauf zugreifen.
 
Auch dir erstmal danke für deine Antwort.
Muss ehrlich gestehen, dass ich nicht so ganz verstehe was du meinst.
Was meinst du mit eigenen Zeilen (TableRows)? Und was meinst du mit Kenner und darauf zugreifen
Gibt es hier im Forum schonmal sowas, wo man das nachlesen kann?
Oder könntest du mir einen Tip geben, was ich da machen soll?
 
Hi,
das ist ja gerade der Witz dabei:
Das Einlesen der Daten kannst Du halten wie Du willst. Für einen neuen Datensatz - egal ob Eintrag in einer Datenbank oder lesen einer Zeile aus einer csv-Datei - erzeugst Du lediglich ein neues TableRow-Objekt und fügst es dem TableModel mit addRow(neueRow) hinzu. In der TableRow musst Du natürlich alle Informationen verwalten, die in der Tabelle angezeigt werden sollen - beliebig erweiterbar.

Oder liegt das Problem im Einlesen der csv-Datei? Wenn nicht, zeig mal, wie Du das machst und wo es klemmt.
 
Ich glaub, ich habs jetzt verstanden.
Das einlesen funktioniert zumindest.

Hier mal die Methode dazu.
Hast du das so gemeint Snape?
Bei der Datei handelt es sich nicht um eine CSV Datei, sondern eine Datei mit festen Format, deshalb die Lösung mit Substring

Code:
private void load(String filename) {
		TableRowsTableModel trm = new TableRowsTableModel();		
		try	{			
			BufferedReader reader = new BufferedReader(new FileReader(filename));
			String inputRow;

			inputRow = reader.readLine();
			
			while (inputRow != null) {

				int linelength = inputRow.length();
				
				TableRows tr = new TableRows();
				tr.setId(inputRow.substring(2, 8));
				tr.setAnfrageart(inputRow.substring(148, 150));
				tr.setTeilnehmernr(inputRow.substring(150, 156));
				tr.setName(inputRow.substring(8, 49));
				tr.setVorname(inputRow.substring(49, 73));
				tr.setStrasse(inputRow.substring(73, 113));
				tr.setOrt(inputRow.substring(113, 148));
				tr.setSpalte(inputRow.substring(156, linelength));
				
				trm.addRow(tr);
				
				inputRow = reader.readLine();				
			}
			reader.close(); //Stream schließen
			

			table = new JTable(trm);
				
			JScrollPane sp = new JScrollPane(table);
			...


So, dies war nun der erste Schritt.
Kannst du mir kurz erklären, wie ich das nächste Problem (das ursprüngliche Problem) in den Griff bekomme
 
>Hast du das so gemeint Snape?

Jo.

>Kannst du mir kurz erklären, wie ich das nächste Problem (das ursprüngliche Problem) in den Griff bekomme.

1. Halte ALLE möglichen Zeilen z.B. als Instanzvariable im Model
2. Implementiere eine Methode a la createDisplayRows()
3. In dieser Methode erzeugst Du bzw fügst die anzuzeigenden Zeilen der Liste der TableRows hinzu
4. Bei diesem Hinzufügen berücksichtigst Du z.B. Filter
5. Bei allen möglichen Änderungen rufst Du diese Methode auf.
6. In dem getValueAt()-Apparat greifst Du auf die Liste der TableRows zu.
7. Wenn Du nun eine (oder mehrere) selektierte Zeile löschen willst, so ist diese natürlich auch in der vollständigen Liste vorhanden und über contains() zu finden bzw. get() herauszuholen - vorausgesetzt, sie enthalten die gleichen Objekte. Also eine Liste Kontakte, die Kontakt-Objekte enthält, ist nur dann sinnvoll, wenn Kontakt-Objekte auch als TableRow hinzugefügt werden/wurden.
 

Neue Beiträge

Zurück