JTable sortieren

Status
Nicht offen für weitere Antworten.

Stinner

Mitglied
Hallo,
habe die FAQs gelesen und auch die ganzen Beiträge in diesem Forum zu dem Thema sortieren. Bekomme es trotzdem nicht hin.
Bzw. wenn ich meine JTable erstelle funktioniert das ganze mit einem TableRowSorter:
Java:
MyTableModel tmodel = new MyTableModel();
sorter = new TableRowSorter<MyTableModel>(tmodel);
List<RowSorter.SortKey> sortKeys = new ArrayList<RowSorter.SortKey>();
sortKeys.add(new RowSorter.SortKey(0, SortOrder.ASCENDING));
sorter.setSortKeys(sortKeys);
datatable = new JTable(tmodel);
datatable.setRowSorter(sorter);

Damit sortiere ich die JTable nach der ersten Spalte. Jetzt will ich nach nachdem der Nutzer an der Table rumgespielt hat, die Table wieder nach der ersten Spalte sortieren. mache das so, klappt aber nicht:
Java:
TableRowSorter sorter = (TableRowSorter) datatable.getRowSorter();
List<RowSorter.SortKey> sortKeys = new ArrayList<RowSorter.SortKey>();
sortKeys.add(new RowSorter.SortKey(1, SortOrder.ASCENDING));
sorter.setSortKeys(sortKeys);
sorter.sort();

Die sortKeys setzten mache ich nur, weil ich es im Inet gelesen habe. Nach meinem Verständnis müsste doch reichen
Java:
TableRowSorter sorter = (TableRowSorter) datatable.getRowSorter();
sorter.sort();

Das klappt aber nicht. Könnte natürlich die Daten in meinem MyTableModel sortieren und das ganze anzeigen, aber würde es gerne mit dem TableRowSorter machen. Dann ist auch der Pfeil in dem Spaltenkopf.
GRuß
 

hdi

Top Contributor
Wo steht dein Code denn? Also wann und wo rufst du dieses "Neu-Sortieren" (also der zweite von dir gepostete Code-Abschnitt) auf?

PS: Ich glaube der Setter von JTable#setRowSorter() hat den Seiteneffekt, sorter.sort() automatisch aufzurufen, sollte also nicht nötig sein.
 
Zuletzt bearbeitet:

André Uhres

Top Contributor
Dein Code funktioniert bei mir, ausser dass du hier die zweite statt die erste Spalte angibst:
Java:
sortKeys.add(new RowSorter.SortKey(1, SortOrder.ASCENDING));
 

hdi

Top Contributor
ausser dass du hier die zweite statt die erste Spalte angibst

Dazu wollte ich vorher eh noch was sagen: Der Index für den SortKey bezieht sich aufs Model, nicht auf die View. Er sortiert also vielleicht schon nach der ersten Spalte, vielleicht aber auch nach der achten. Je nachdem wie man die Spalten vorher vertauscht hat mit der Maus. Die Frage ist also, woher er die 1 hat, (oder die 0 falls das ein Tippfehler war), und ob es wirklich das ist, was er will. Solange man keine Spalten hinzufügen oder löschen kann, ist es ja noch fehlerfrei, den Index als Magic Number reinzuschreiben (trotzdem nicht wirklich gut)
 

Stinner

Mitglied
Morgen,
also die Angabe nach mit der ersten Spalte ist schon okay so. Habe ein eigenes TableModel was von AbstractTableModel erbt und die erste Spalte bezieht sich auf das Model.
Es soll default mäßig immer nach dieser Spalte sortiert werden, sie ist auch immer da und kann nicht gelöscht werden. Wenn sie verschoben wird, soll trotzdem nach ihr sortiert werden.

Ich rufe das Sortieren auch im TableModel auf. Die Variable datatable hält eine Referenz auf das angzeigte JTable und ich mache danach auch ein validate() auf das JScrollPane wo die JTable angezeigt wird. Funktioniert aber trotzdem nicht.
Gruß
 

hdi

Top Contributor
Also nochmal, was willst du genau? Du willst, das beim Programmstart nach einer bestimmten Spalte sortiert ist, richtig? Und nach dieser Spalte soll immer sortiert werden, egal wie man die Spalten verschiebt? Und nach anderen Spalten soll man nicht sortieren können? Sprich ein Klick auf eine Spalte im Header soll nur auf der Spalte funktionieren, auf der sortiert wird (und dort eben die Sortier-Richtung ändern), aber auf allen anderen Spalten nix tun?
Hab ich das jetzt richtig verstanden?

Jetzt will ich nach nachdem der Nutzer an der Table rumgespielt hat, die Table wieder nach der ersten Spalte sortieren.
Was meinst du mit "rumgespielt"? Das hatte ich ja vorher schon gefragt: Wann genau führst du den Code für diese Neu-Sortierung aus?
 

Stinner

Mitglied
Hi,
das mit dem Programmstart klappt schon. Da sortiere ich nach der ersten Spalte.

Jetzt ist es so:
Ich habe ein Filter für die Tabelle. Kann ausgewählt werden über RadioButtons. Allerdings läuft mein Filter so, dass ich die Daten im TableModel verändere - Sprich ich leses sie aus einer Datenbank aus.

Es ist halt so, nachdem ich einen Filter auswähle. dann ist die JTable unsortiert. Das heißt ich will die Sortierung aufrufen, nachdem ich meinen "Object" - Vector im TableModel verändert habe.
Das klappt leider nicht.
Es soll trotzdem noch für den Benutzer möglich sein, nach den anderen Spalten zu sortieren (Durch Doppelklick auf den Header), aber nach jeder Auswahl eines Filter soll zunächst mal nach der ersten Spalte sortiert werden.


Nochwas zu den Daten und was ich mit dem Filter meine. Habe verschiedene Artikelgruppen in der JTable dargestellt. Zu den Gruppen gehören mehrere Artikel.
Der Filter läuft über die Artikelgruppen. Je nachdem welche Gruppe dargestellt wird, werden unterschiedliche Attribute in der JTable angezeigt. Eine Seriennummer haben jedoch alle. Deshalb will ich immer die Daten zunächst nach ihr sortiert anzeigen.

Gruß , Felix
 

Michael...

Top Contributor
Allerdings läuft mein Filter so, dass ich die Daten im TableModel verändere - Sprich ich leses sie aus einer Datenbank aus.

Es ist halt so, nachdem ich einen Filter auswähle. dann ist die JTable unsortiert. Das heißt ich will die Sortierung aufrufen, nachdem ich meinen "Object" - Vector im TableModel verändert habe
Wenn ich das richtig verstehe, liest Du die Daten bei jedem Filtern neu aus der Datenbank?!? Dann kannst Du die Daten ja gleich mit der gewünschten Sortieriung aus der Datenbank auslesen.
 

Stinner

Mitglied
hi,
könnte ich machen - würde allerdings lieber in der tabelle sortieren. dann sieht der nutzer auch (durch den pfeil) nch was sortiert ist
 

hdi

Top Contributor
Je nachdem welche Gruppe dargestellt wird, werden unterschiedliche Attribute in der JTable angezeigt. Eine Seriennummer haben jedoch alle. Deshalb will ich immer die Daten zunächst nach ihr sortiert anzeigen.
Heisst das also, dass du in deinem Table Spalten addest & removest? Wenn ja, möchte ich nochmal erwähnen, was ich ich ein paar Posts vorher schon gesagt hab, und was mir nach wie vor etwas strange vorkommt:

Du sortierst anfangs nach Index 0 im SortKey, und danach nach Index 1. Weisst du denn sicher, welcher Index für welche Spalte steht??

...wenn dem so ist, dann gibt es irgendwo in deiner Code-Logik ein Problem, denn dein Code:

Java:
TableRowSorter sorter = (TableRowSorter) datatable.getRowSorter();
List<RowSorter.SortKey> sortKeys = new ArrayList<RowSorter.SortKey>();
sortKeys.add(new RowSorter.SortKey(1, SortOrder.ASCENDING));
sorter.setSortKeys(sortKeys);
// sorter.sort(); nicht nötig

müsste funktionieren. Exceptions bekommst du auch keine?
Ansonsten zeig mal bitte Code-Ausschnitte, und präzisiere ab wann das Verhalten nicht mehr stimmt.

Ich vermute ja grad dass danach nochmal ein Event gefuert wird was deine sortKeys wieder über den Haufen wirft, oder du arbeitest hier auf 2 verschiedenen Tables/Models oder sowas in der Art.
Und noch ne (ja, dumme, aber man will ja nix ausschließen xD) Frage am Rande: Was sind deine Seriennummern? Strings oder Zahlen?
 
Zuletzt bearbeitet:

Stinner

Mitglied
Die Seriennummern sind Strings.
Aber das sollte ja keinen Unterschied machen, da es am Anfang ja immer klappt.

Ja, ich weiß immer wo die Seriennummer steht. Man kann zwar die Reihenfolge der Spalten ändern in der Applikation, aber die Seriennummer steht immer vorne.
Das oben stimmt nicht, beim zweiten mal ist der SortKey auch die Spalte 0.

Klappt trotzdem nicht, wüsste nicht, was ich noch posten soll. Was muss ich nach dem sortieren alles validieren? auch das JFrame?

Achso, keine Exceptions.
 

KrokoDiehl

Top Contributor
Kann es sein, dass du einfach am Ende deiner Sortierung ein
Code:
fireTableDataChanged()
(oder wie auch immer es genau heißt) aufrufen musst, damit deine JTable mitbekommt, dass sich ihr Datenmodell geändert hat?
 

hdi

Top Contributor
fireTableDataChanged() muss er natürlich schon machen, aber das hat nichts mit der Sortierung zu tun. Und das muss auch nicht erst nach der Sortierung passieren. Er beschwert sich ja nicht darüber dass seine "Filterung" nicht funktioniert, von daher denke ich mal dass er das Model immer schön updaten wird.
 

Stinner

Mitglied
Hi,
konnte gestern nicht an dem Problem weiter arbeiten, aber bin heute wieder dran und es klappt immer noch nicht. Hoffe ihr gebt mir nochmal eure Hilfe
Poste mal meine ganze Methode:
Java:
public void filter(String filter) throws SQLException,
			EntryNotExistsException {

		if (filter.equalsIgnoreCase("All"))
			writeAll();
		else
			loadClassView(filter);

		JTable datatable;
		if (EntryWindow.getMainWindow().getContentPane() instanceof InitialPane) {
			datatable = ((InitialPane) EntryWindow.getMainWindow()
					.getContentPane()).getDatatable();
			TableRowSorter sorter = (TableRowSorter) datatable.getRowSorter();
			List<RowSorter.SortKey> sortKeys = new ArrayList<RowSorter.SortKey>();
			sortKeys.add(new RowSorter.SortKey(1, SortOrder.ASCENDING));
			sorter.setSortKeys(sortKeys);
			sorter.sort();
		}
		fireTableStructureChanged();
		fireTableDataChanged();
	}


Also, ein JPanel, in dem die JTable angezeigt wird. Daneben sind Radiobuttons an denen ein Listener hängt. Je nachdem welcher Radiobutton ausgewählt wird, wird die filter() Methode des TableModels aufgerufen mit dem entsprechenden Parameter.
In den Funktionen writeAll() und loadClassView(String Filter) werden die entsprechenden Daten aus der DB gelesen und der Data - Vector sowie der Colum-Vector überschrieben.
Danach soll gefilter werden. Klappt so aber nicht.
Habe Warnings, da ich den TableRowSorter nicht parametrisiert habe. Daran sollte es aber nicht liegen, dass der Code - Snippet nicht klappt?
Gruß
 

hdi

Top Contributor
versuch mal die setSortKeys() Methode nach den fire-Methoden des Models aufzurufen. Vllt wirft ja tableStructureChanged() die SortKeys über'n Haufen..

Ansonsten bau dir mal n paar sysouts in den code oder schmeiß den Debugger an. Liefert deine Methode mit der du "datatable" initialisierst auch wirklich deinen Table zurück? Und nicht vllt einen neuen oder sowas?
...und wird der if-Block überhaupt betreten?

das mit dem getContentPane() instanceof InitialPane find ich etwas strange. Hast du das ContentPane denn per Setter gesetzt? Normalerweise sollte man die Komponenten ja einfach darauf adden, und nicht das komplette Pane austauschen.
 
Zuletzt bearbeitet:
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Swing JTable sortieren AWT, Swing, JavaFX & SWT 2
W JTable erstellen und Spalten sortieren AWT, Swing, JavaFX & SWT 2
J Swing JTable - nach Sortieren andere Methode aufrufen AWT, Swing, JavaFX & SWT 2
K Probleme bei sortieren von jTable AWT, Swing, JavaFX & SWT 5
A JTable- sortieren lassen AWT, Swing, JavaFX & SWT 10
C Swing JTable sortieren AWT, Swing, JavaFX & SWT 3
G JTable sortieren AWT, Swing, JavaFX & SWT 2
N Listen in JTable sortieren AWT, Swing, JavaFX & SWT 3
E JTable nach mehreren Spalten sortieren AWT, Swing, JavaFX & SWT 14
E JTable sortieren AWT, Swing, JavaFX & SWT 3
B JTable: Zeilen sortieren, aber bestimmte Zeilen fest lassen AWT, Swing, JavaFX & SWT 9
T JTable - Einzelne Spalte nicht sortieren? AWT, Swing, JavaFX & SWT 2
G JTable sortieren mit eigenem Sortieralgorithmus AWT, Swing, JavaFX & SWT 3
M JTable sortieren AWT, Swing, JavaFX & SWT 7
B [JTable] kein Sortieren der versteckten Columns AWT, Swing, JavaFX & SWT 9
G JTable sortieren (Java 1.5) AWT, Swing, JavaFX & SWT 4
G JTable nach RowHeader-Werten sortieren AWT, Swing, JavaFX & SWT 2
F JTable Spalte sortieren mit lauter JComboboxen ? AWT, Swing, JavaFX & SWT 15
T JTable Sortieren AWT, Swing, JavaFX & SWT 2
E JTable sortieren und synchronisieren von zwei Datenvektoren AWT, Swing, JavaFX & SWT 2
L JTable (DefaultTableModel) nach Spalte sortieren-TableSorter AWT, Swing, JavaFX & SWT 2
S JTable + Sortieren => Problem bei Darstellung AWT, Swing, JavaFX & SWT 13
G JTable sortieren durch click im Header AWT, Swing, JavaFX & SWT 9
C JTable sortieren nach Alphabet AWT, Swing, JavaFX & SWT 35
G Zellen in JTable alphabetisch sortieren AWT, Swing, JavaFX & SWT 13
P JTable nach mehreren Spalten sortieren AWT, Swing, JavaFX & SWT 15
G Inahlt von JTable sortieren AWT, Swing, JavaFX & SWT 2
A JTable sortieren AWT, Swing, JavaFX & SWT 4
I Swing JTable zeichnet kein vertical Grid AWT, Swing, JavaFX & SWT 6
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
T Swing JTable valueChanged datensatz löschen AWT, Swing, JavaFX & SWT 1
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
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

Ähnliche Java Themen


Oben